抽象类中可以没有抽象方法,目的是不让直接使用该类,必须继承后才能使用。作用可以保证必要的公共功能,同时子类可以扩展自己特有的功能。
1.含有抽象方法的类一定是抽象类,抽象类中不一定包含抽象方法。
2.抽象类不能被实例化
3.如果一个类继承了抽象类,这个类必须重写抽象类中的抽象方法
4.当抽象类A继承抽象类B,抽象类A可以不重写B中的方法,但是一旦抽象类A要是被普通类C继承,那么就一定要在C中重写这个抽象方法
5.抽象类或抽象方法一定不能被final修饰
在Java中,被关键字interface修饰的类是接口。
1.禁止为其实例化对象,接口连构造方法都没有,所以不可能为其实例化对象
2.打破单继承局限(实现伪多重继承),伪代码:class A implements 接口C,接口D…
3.接口中只能定义静态常量和抽象方法(接口中的方法隐式地指定为public abstract,其他修饰符都会报错;接口中的变量会隐式地指定为public static final,用private修饰符会报错),无论是普通类还是抽象类都没有如词严格的要求,因此接口既不能继承普通类也不能继承抽象类
4.接口只能继承接口,且允许多继承。(这里允许存在多条从具有较高通用性的接口到较高专用性的接口的链。)
5.在Java 8以前,不能在接口中实现方法。现在已经可以在接口中提供简单方法,但这些方法不能引用实例域——接口没有实例。Java 8 以后允许在接口中增加静态方法。也可以为接口方法提供一个默认实现,必须用default修饰符标记这样一个方法。
注意:
实现接口或者继承抽象类的子类必须实现接口的所有方法或抽象类的所有抽象方法。
主要原因在于Java程序设计语言是一种强类型语言。在调用方法的时候,编译器将会检查这个办法是否存在。如果该对象是接口的实现类,那么对象一定有对应的方法
不能和final一块使用:
final修饰成员方法:方法不能被重写,但是abstract修饰的方法,强制类完成的事情!
不能和private一块使用: private只能在类中访问!
被static修饰的方法直接使用类名调用,---->但是抽象方法又需要让子类重写(静态方法算不上方法重写)
方法重写注意事项:
子类继承父类,子类重写父类的方法必须保证访问权限足够大,使用public修饰(要么跟父类的修饰符保持一致)
多继承虽然能使子类同时拥有多个父类的特征,缺点也很明显:
(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量
(2)如果在一个子类继承的多个父类中拥有相同方法,子类中没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法。
而使用单继承可以避免多重继承可能导致的复杂性和潜在的冲突,单继承的方式能确保继承关系的清晰和一致性。同时可以通过接口的多实现扩展类的功能。
多实现可以避免多继承存在的缺点:
1.若实现的多个接口中有重复的方法也没关系,因为实现类中必须重写接口中的方法,所以调用时还是调用的实现类中重写的方法。因此不存在多继承的第二个缺点。
2.若实现的各个接口中有重复的变量,接口中所有属性都是 static final修饰的即常量,由于JVM的底层机制,所有static final修饰的变量都在编译时期确定了其值,若在使用时,两个相同的常量值不同,在编译时期就不能通过。因此也不存在多继承的第一个缺点。
1.由于接口中的方法是抽象方法,并不包含具体实现,使用接口时必须重写方法,从而避免了类多继承可能引发的方法冲突和复杂性问题。
2.由于接口中的变量是静态常量,属于类变量,在子类中使用时通过接口类名.变量调用该变量,从而避免了多继承中引用变量时发生冲突。
所以Java接口支持多继承,通过多继承可以将多个接口合并为一个大接口,提高代码的复用性。