3目录
1.面向对象三大特征之二----------继承
什么是继承:Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系,例如:Student称为子类(派生类),People称为父类(基类 或超类)。
Eg: public class Student extends People {}
继承的优点:提高代码复用性,减少代码冗余,增强类的功能扩展性。Java中子类更强大
继承的特点:
子类可以继承父类的属性和行为,但是子类不能继承父类的构造器。子类有自己的构造器,父类构造器用于初始化父类对象。
Java是单继承模式:一个类只能继承一个直接父类。
Java不支持多继承、但是支持多层继承。
Java中所有的类都是Object类的子类。
子类是否可以继承父类的静态成员? 子类可以直接使用父类的静态成员(共享) ,但个人认为:子类不能继承父类的静态成员。(共享并非继承)
继承后:成员变量、成员方法的访问特点:在子类方法中访问成员(成员变量、成员方法)满足:就近原则 先子类局部范围找 然后子类成员范围找 然后父类成员范围找,如果父类范围还没有找到则报错。 如果子父类中,出现了重名的成员,会优先使用子类的,此时如果一定要在子类中使用父类的怎么办? 可以通过super关键字,指定访问父类的成员。
方法重写:在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。 方法重写的应用场景 当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。 子类可以重写父类中的方法。建议重写方法都加@Override注解,代码安全,优雅!
方法重写注意事项和要求: 重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致。 私有方法不能被重写。 子类重写父类方法时,访问权限必须大于或者等于父类 (了解 :default < protected < public) 子类不能重写父类的静态方法,如果重写会报错的。
子类构造器的特点:
子类中所有的构造器默认都会先访问父类中无参的构造器,再执行自己。
子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。 子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。 怎么调用父类构造器的? 子类构造器的第一行语句默认都是:super(),不写也没事。子类中所有的构造器默认都会先访问父类中无参的构造器,再执行自己。
注意:如果父类中没有无参数构造器,只有有参构造器,会出现什么现象呢? 会报错。因为子类默认是调用父类无参构造器的。默认自己加上无参构造器。
this和super详情
this:代表本类对象的引用;super:代表父类存储空间的标识。
关键字 | 访问成员变量 | 访问成员方法 | 访问构造方法 |
this | this.成员变量 访问本类成员变量 | this.成员方法(…) 访问本类成员方法 | this(…) 访问本类构器 |
super | super.成员变量 访问父类成员变量 | super.成员方法(…) 访问父类成员方法 | super(…) 访问父类构造 |
2.权限修饰符
权限修饰符:有四种作用范围由小到大(private -> 缺省 -> protected - > public )
修饰符 | 同一 个类中 | 同一个包中 其他类 | 不同包下的 子类 | 不同包下的 无关类 |
private | √ | |||
缺省 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
final的作用 :
final 关键字是最终的意思,可以修饰(方法,变量,类) 修饰方法:表明该方法是最终方法,不能被重写。 修饰变量:表示该变量第一次赋值后,不能再次被赋值(有且仅能被赋值一次)。 修饰类:表明该类是最终类,不能被继承。
final修饰变量的注意 final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。 final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,但是地址指向的对象内容是可以发生变化的。
常量 常量是使用了public static final修饰的成员变量,必须有初始化值,而且执行的过程中其值不能被改变。
static关键字的用途
在《Java编程思想》P86页有这样一段话:
“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”简而言之,一句话来描述就是:方便在没有创建对象的情况下来进行调用(方法/变量)。很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。更多见 :Java中的static关键字解析 - Matrix海子 - 博客园