继承
1、引入
继承性的最大特征是解决代码的重用问题。
为什么需要继承? 有属于关系,例如学生属于人的一种,人所具有 的属性学生都具有。
2、继承的实现
在JAVA中如果要实现继承需使用extends关键字,定义语法为: class 子类 extends 父类 { } ,子类:派生类,父类:基类或超类
继承的优点:
①子类可以将父类的操作继续使用,属于代码重用;
②子类可以继续扩充属于自己的标准。
3、继承的限制
继承有自己的要求:
①JAVA不允许多重继承(C++语言有多继承——一个子类可以同时继承多个父类的操作),这种情况可以使用多层 继承。在使用多层继承的时候并没有层数的限制,但在开发角度来说最好不要超过三层,因为-----多人传话会容易出错。
②子类会继承父类的所有操作,但是所有的私有操作属于隐式继承,所有的非私有操作属于显示继承。即:在子类中不能对父类进行私有属性(private)的直接访问,只能够间接的进行私有属性的访问,在这里私有属性还是相当于在不同 的类中。
③在子类对象构造之前一定会先默认调用父类的构造(默认使用无参构造),以保证父类的对象先实例化,而后再实例化子类对象。
!!“super();” 相当于父类,若父类中有无参构造加与不加无区别。如果父类中无无参构造方法,那么必须使用super();明确调用父类中的有参构造方法。
class A{
public A(String title){
System.out.println("A类构造方法!");
}
}
class B extends A{
public B(String title){
super(title);
System.out.println("B类构造方法");
}
}
public class TestDemo4 {
public static void main(String args[]){
new B("Hello!!!!");
}
}
super() : 主要是由子类调用父类中的构造方法,那么这行语句一定要放在子类构造方法的第一行,这一点与this()是相似的。
super()与this()不能同时出现,有this()就不会有super()隐藏存在,不管子类如何,子类对象的构造调用前一定先执行父类构造,为父类的对象初始化后才轮到子类对象。(在子类对象实例化是既实例化了父类对象也实例化了子类对象。)
注:课时78到课时80
覆写
· 继承性的主要特征是子类可以根据父类已有的功能进行功能的扩展,但是在子类定义属性或方法时有可能子类定义的属性和方法与父类中的同名。以下,覆写就是为了解决此问题。
· 方法覆写:子类定义了与父类方法名称相同、参数的类型及个数相同、返回值相同的方法
· 覆写结果的分析要素:
① 观察实例化的是哪个类;
② 观察这个实例化的类中调用的方法是否已被覆写,如果没有被覆写则调用的是父类,否则调用的是子类。
· 什么时候需要覆写?——覆写的使用原则(这里是被动的,还有主动的):
如果发现父类中的方法功能不足(不适合于本子类),但又必须使用方法名称时就需要采用覆写这一概念。子类覆写的方法不能够拥有比父类更为严格的访问控制权限(public > default > private)也就是说public 权限最大,最宽松,private 权限最小,最严格。如果父类的方法使用的是public声明,那么子类覆写此方法只能用public;若父类 的方法使用的是default声明,则子类只能用default或public声明。!!!99%情况方法用的都是public!!!
父类方法如果使用了private声明,则对于子类来说该方法是不可见的,就算子类中定义了一个完全相同且符合覆写要求的方法,那么也不能发生覆写,此时子类所写的方法只 是相当于子类自己定义了一个新的方法而已
************默认情况下子类所能调用的一定是覆写过的方法。为了能明确的由子类调用父类中已被子类覆写的方法,可以使用”super.方法()“***********
·super.方法() 与 this.方法() 的区别:
this.方法():会首先查找本类中是否存在有要调用的方法,若存在则直接调用,若没有则发生编译错误;
super.方法() :明确表示调用的不是子类方法,调用的就是父类的方法