思维导图
一.抽象类
在写代码的过程中,我们会有这样一种需求,即某些类不想被其他人实例化。而可以实现这个功能的就是抽象类了。抽象类中如果存在抽象方法,则其实现类必须实现抽象方法,否则实现类也必须是抽象类。
abstract class Student{
abstract void read();
}
class XiaoMing extends Student{
void read() {
System.out.println("我是一名学生");
}
}
当然,在抽象类中也可以选择不写入抽象方法,以保证此类不会被实例化。
二.接口
接口则是在抽象类的加强,抽象类中可能还有某些具体的实现,而在接口中,只有表现形式,而没有具体实现。接口除了可以实现类的不可实例化外,还可以时java拥有类似c++多继承的特性。
interface A{}
interface B{}
class C extends Student implements A,B{
void read() {}
}
在一个类实现了两个以上接口的时候可能会发生接口中的方法冲突的可能,所以,尽量不要使实现的接口有同样的方法名及参数,但是他们的返回值又不相同。编译不会通过,因为Java区分方法时不会考虑方法的返回值,所以编译器会判定C.f()即是A.f()又是B.f(),但是,在实际上,A.f()和B.f()返回值不同,所以编译不通过。
interface A {
public void f();
}
interface B {
public int f();
}
class C implements A,B{
/*public void f() {
System.out.println("test");
}*/
}
在接口中,可以有字段,但是他们默认都是public,static 以及final的
interface A{
//int a; 不能形成空“final”
int b = 10;//默认是public static final
public static final int c = 10;//访问修饰符等同于b
}
在接口中的方法则都是默认为public的,实现类不能减少其访问权限
interface A{
void write();
}
class B implements A{
//void write() {} 出错,减小了访问权限
public void write() {}
}
接口对于实现解耦和非常有帮助,可以直接通过实现接口达到松耦合的目的。也可以通过适配器模式实现解耦。
扫描二维码关注公众号,回复:
2724804 查看本文章
interface A {
public void f();
}
//虽然有同样的方法,但是,B不能通过A来调用f()方法。
class B {
public void f() {
System.out.println("my name is B");
}
}
class AdapterOfA implements A{
B b;//一个代理
AdapterOfA(B b){
this.b = b;
}
public void f() {//实现B类的f()方法
b.f();
}
}
接口可以嵌套在类或者接口中,嵌套在类中的接口,其访问权限可以是private,默认,protected,public,而嵌套在接口中的接口,其访问权限默认为public,不可降低其访问权限。
interface D {
public interface G{}
interface I{}//访问权限是public而非默认
/*pretected,private编译不通过
protected interface H extends A{}
private interface H{}
*/
}
class A {
public interface B{}
protected interface C extends D{}
interface E{}
private interface F{}
}