声明: 本文主要作为作者的复习笔记,由于作者水平有限,难免有错误和不准确之处,欢迎读者批评指正.
继承
语法: 使用extends表示继承父类;
访问修饰符 class 子类名称 extends 父类{
}
有了继承的存在,将所有共性属性与方法放在父类中,子类只需要实现独有的属性和方法即可,整体代码实现更加简便,提高了代码的复用性,方便进行子类、子功能扩展;
要使用继承必须满足 is a/an 原则,例如:
Dog is an Animal; (可以使用继承)
Cat is an Animal; (可以使用继承)
Flower is not an Animal; (不能使用继承)
继承关系
Java的单继承局限: 一个类只能使用extends直接继承一个父类,不允许多继承,但允许多层继承;
假设有符合继承关系的类: Class A,Class B,Class C;
- 单继承(支持)
public class A {
......
}
public class B extends A {
......
}
- 多继承(不支持)
public class A {
......
}
public class B {
......
}
public class C extends A,B {
......
}
- 多层继承(支持)
public class A {
......
}
public class B extends A {
......
}
public class C extends B {
......
}
- 不同类继承同一个类(支持)
public class A {
......
}
public class B extends A {
......
}
public class C extends A {
......
}
父类和子类成员关系
- 父类和子类不存在同名的属性和方法;
- 子类和父类成员变量同名:
当访问的变量(不管类型)子类中存在,默认就会使用子类中的属性; 若子类中不存在该属性,才会从父类中寻找同名属性; 若父类中也没找到同名属性,编译报错;
当父类中存在private私有域,子类在继承父类时,私有域无法直接使用,这种继承称为隐式继承; - 父类和子类方法之间的调用
当通过子类对象访问方法时:
(1)若子类中存在该方法,则优先访问子类的同名方法(要看参数);
(2)若子类不存在该方法,则会从父类中寻找是否存在该方法,存在则调用,不存在则编译出错(一定注意隐式继承问题);
在产生(实例化)子类对象时,默认先调用父类的构造方法产生父类对象而后调用子类构造方法产生子类对象;
产生N个对象,要调用N次构造方法,只要调用子类构造方法,就会先调父类的;
super
表示直接从父类中寻找成员变量或成员方法;
- super修饰属性
表示直接寻找的父类的同名属性,private属性无法被调用; - super修饰方法
(1)super修饰普通成员方法,表示直接在父类中寻找同名方法;
this.方法名称 => 从当前类中寻找同名方法
super.方法名称 => 从父类中寻找同名方法
(2)super修饰构造方法,表示显示在子类构造方法中调用父类的构造方法;
当父类存在无参构造,则子类构造方法首行可以不写super();
如果父类中没有无参构造,则在子类的构造方法首行必须显示的使用super(参数)来调用父类的有参构造;
当存在父类继承时,一般在子类中不出现this的构造方法调用,保留super的首行调用;
子类的构造方法首行必须使用super,this的构造方法调用也要放首行;
this可以表示当前对象的引用,但是super不能直接指代父类对象;
类和类之间的关系: 继承和组合
继承表示的是类之间的 is a/an 关系,例如 Dog is an Animal(天然的继承关系),Dog具备了Animal类中的所有属性和方法;
组合表示的是类之间的 has a/an 关系(包含关系),例如School has a Student,例如School has a Teacher;
组合关系也可以实现代码的复用,组合类的内部包含了其他类,直接调用其他类对象的属性和方法,实现代码复用;
继承和组合都可以实现代码复用,到底使用继承关系还是组合关系,要根据具体场景来看到底类之间是 is a/an 还是 has a/an 关系来决定;