认识继承
不同类型的对象,相互之间经常有一定数量的共同点。例如,小明同学、小红同学、小李同学,都共享学生的特性(班级、学号等)。同时,每一个对象还定义了额外的特性使得他们与众不同。例如小明的数学比较好,小红的性格惹人喜爱;小李的力气比较大。
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能。通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间 ,提高我们的开发效率。
拥有继承关系的两个类,一个是子类,一个是父类,使用关键字extends表示。
继承的注意事项:
- 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有;
- 构造器不会被子类继承,但是可以从子类中调用父类的构造器;
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展;
- 子类可以用自己的方式实现父类的方法:方法重写;
- Java中的所有类都是Object类的后代类;
- 当创建子类对象的时候,先去创建父类的实例,再创建子类的实例,如果有多个间接的父类,会从最顶端的父类开始创建对象。以此类推,创建任何Java对象,最先执行的总是java.lang.Object类的构造器。
- Java中只有单继承 ,没有多继承;
- 当子类覆盖了父类方法后,子类的对象将无法访问父类中被覆盖的方法,但可以在子类方法中调用父类中被覆盖的方法。如果需要在子类方法中调用父类中被覆盖的方法,则可以使用super(被覆盖的是实例方法)或者父类类名(被覆盖的是类方法)作为调用者来调用父类中被覆盖的方法。
方法重写(覆盖)
方法重写是指在一个子类里面,有一个方法与父类完全一样(方法名字、参数个数、参数的类型)的方法,称之为子类的这个方法重写了父类的方法。
方法的重写要遵循“两同两小一大”规则,“两同”即方法名相同、形参列表相同;“两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;“一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。
尤其需要指出的是,覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。
super关键字
super可以理解为“父类的”,super是子类和父类交流的桥梁,但并不是父类的引用。super可以用来调用成员属性、成员方法、构造器。
通常情况下,我们可以省略super,但是当子类和父类中定义了同名的属性/方法时,我们要想在子类中调用父类中声明的属性/方法,则必须显式的使用“super.属性/方法”的方式,表明调用的是父类中声明的属性。
在子类加载时会默认调用父类的无参构造器,若想调用父类的有参构造器,我们也可以在子类的构造器中使用super关键字调用父类的有参构造器,但是super语句必须在构造器的首行。
所以this和super两种构造调用,不能同时使用。
/*
super关键字的用法有三种:
1.在子类的成员方法中,访问父类的成员变量。
2.在子类的成员方法中,访问父类的成员方法。
3.在子类的构造方法中,访问父类的构造方法。
*/
public class Zi extends Fu {
int num = 20;
public Zi(){
super(1);
}
public void methodZi(){
System.out.println(super.num); //父类中的num
}
public void method(){
super.method(); //访问父类中的method
System.out.println("子类方法");
}
}
public class Fu {
int num = 10;
public Fu(){
System.out.println("父类的无参构造方法");
}
public Fu(int a){
System.out.println("父类的有参构造方法 a="+a);
}
public void method(){
System.out.println();
}
}