继承 (Java中只支持单继承)——> 父类(基类) 子类(派生类)
面向对象编程时,可以通过扩展一个已有的类,并继承该类的属性和方法,来创建一个新的类。
两个类之间存在继承关系:
1.子类拥有父类的所有属性及在父类中声明的属性,在子类内部可以直接调用;
2.子类拥有父类的所有方法,即在父类中声明的方法,子类内部可以直接调用;
3.子类不拥有父类的构造器,如需在子类中使用和父类传入的参数一样的构造器,则需要在子类内部重新声明这些构造器;
4.子类类型是父类类型,即子类类型的对象可以自动转换为父类类型的对象,父类类型的对象则需强制转换为子类的对象,转换语法与基本数据类型相同。
子类实例化对象时,会创建几个对象?
例如:
Bomber类 继承 Plane 类。
Bomber bomber = new Bomber();
子类继承父类时,会自动创建父类的对象,而且会比子类对象先创建。
为什么会自动创建父类对象?
继承 Plane 类时,会继承Plane类的属性和方法,属性的初始化动作在构造器中进行,而且必须实例化对象才能调用构造器。
判断是组合还是继承小技巧:
组合:什么东西是什么东西 has a xx有xx
继承:子类有父类属性,又有自己特有属性 is a xx是xx (子类是父类)
继承的优点:
1.代码的可复用性;
2.设计应用程序变得更简单;
3.父类的属性和方法可用于子类;
4.子类可以扩展父类的属性和方法。
Java中只允许单继承的原因:
多继承易引发意义不明确,增加了程序员编程的复杂度,甚至进一步影响多态的灵活性。
所有类的根类:Object
Object常用方法:
public final class getClass();
public int hashCode();
public boolean equals(Object x);
protected Object clone() throws Throwable;
public String toString();
protected void finalize() throws Throwable;
public final void notify();
public final void wait() throws InterruptedException;
注:一个若没有继承任何类,则默认继承Object类。
方法重写(覆盖)<是重写父类的方法,必须在继承里>
概念:
当一个子类继承一个父类,它同时继承了父类的属性和方法。子类可以直接使用父类的属性和方法,如果父类的方法不能满足子类的需求,
则可以在子类中对父类的方法进行重新实现。
方法重新的规则:
1.重写方法的参数列表,必须和被重写方法完全相同;
2.重写方法的返回值类型必须和重写的方法的返回值类型一致;
3.重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public > protected > default > private);
4.重写方法所抛出的异常必须和被重写的方法所抛出的异常一致,或者是改异常的子类;
5.被重写的方法访问修饰符不能为 private;
6.静态方法不能被重写为非静态方法,会导致编译出错。
方法重写和重载的区别:
① 重写必须继承,重载不需要;
② 重写的方法名,参数数目相同,参数类型相同,
重载的方法名相同,参数列表不同;
③ 重写的方法访问修饰符大于等于父类的方法,重载与修饰符无关;
④ 重写不可抛出父类没有抛出的一般异常。
super的两种用法:
1.super.xxx 或 super.xxx() 代表每个类中指向父类对象部分的引用;
2.super()代表调用父类中指定的构造器。
super和this的区别:
1.super必须继承,this不需要;
2.super 在子类中去调用父类中的构造器,
this 在本类中调用其他的构造器。
final关键字:
类使用final修饰符修饰,表示不可以有继承的子类,称为最终类。
使用时机:
当设计者设计的类,不希望被任何人继承,从而去修改或扩展式,就可以使用final关键字。
如:Java的设计者不允许继承String类,因为它是Java语言中一个十分重要的类,改变方法的行为,从而带来不希望的结果。
通过使String类成为最终类,就能确保String对象的实现是一致性和可靠的。
final修饰类的方法,该方法就是最终方法,该方法不能被重写。