Java基础:(四)继承
一、访问权限
java中有三个访问权限修饰符private;protected;public和一个默认default(不加修饰符)。
如果子类的方法覆盖了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例,也就是确保满足里氏替换原则。
字段绝不能是共有的,因为这么做的话就失去了对这个字段修改行为的控制,客户端可以对其随意修改;可以使用共有的getter和setter方法来替换共有字段。
但是也有例外,如果是包级私有的类或者私有的嵌套类,那么直接暴露成员不会有特别大的影响。
public class accesswithinnerclassexample { private class innerclass{ //私有嵌套类 int x; } private innerclass innerclass; public accesswithinnerclassexample(){ innerclass = new innerclass(); } public int getvalue(){ return innerclass.x; } }
二、抽象类与接口
抽象类:
抽象类不一定包含抽象方法,抽象方法一定位于抽象类中;抽象类和普通类的最大区别是:抽象类不能被实例化,需要继承抽象类才能实例化其子类。
接口:
接口的成员(字段+方法)默认都是public的,并且不允许定义为private或者protected;
接口的字段默认都是static和final的(接口中无变量声明,只有常量,因为用了final修饰符);
接口的方法默认都是abstract的,从java8开始,接口方法也支持default和static修饰,但是使用默认的方法和静态的方法必须有方法体。
public interface interfaceexample { default void fun1(){ //默认方法 //这里是方法体,虽然没有语句 } static void fun2(){ //静态方法 //这里是方法体,虽然没有语句 } }
比较:
- 从设计层面上看,抽象类提供了一种 is_a 关系,那么就必须满足里氏替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 like_a 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 is_a 关系(接口可以让不相关的类都实现一个方法);
- 从使用上看,一个类可以实现多个接口,但是不能继承多个抽象类;
- 接口的字段只能是static和final类型的,而抽象类的字段没有这种限制;
- 接口的方法只能是public的,而抽象类的方法可以有多种访问权限。
三、super
访问父类的构造函数:可以使用super()访问父类的构造函数,从而完成一些初始化的工作;
访问父类的成员:如果子类覆盖了父类中的某个方法的实现,可以通过使用super关键字来引用父类的方法实现。
四、重写与重载
重写存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法;
重载存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。(返回值不同,其他都相同不算是重载)
上一篇: 昨天去超市买了两袋元宵
下一篇: OAuth2简易实战(一)