11.3 继承中的多态
在子类中定义了和父类中同名的成员变量和方法,这就涉及成员的隐藏与重载。
成员的隐藏与重载属于多态特性的一种。
通过继承,子类拥有除构造方法以外的所有成员(变量及方法),这类成员统称为子类的继承成员,在子类中是默认存在的。
当子类与父类成员相同时:
- 父类成员变量会隐藏;
- 父类成员方法会重载与覆盖。
这里的隐藏与覆盖等并非替换,成员仍然存在,只是默认状态不能使用罢了。
11.3.1 隐藏——子类与父类的成员变量同名时
a. 子类就会把父类的变量隐藏起来,该变量默认为子类的成员变量。
b. 如果强制使用父类成员变量可以使用super关键字。
11.3.2 重载与覆盖——子类中出现于父类中同名的成员方法时
a. 子类中的成员方法与父类中的成员方法同名不同参数时——重载,利用参数可以区分它们与,不会互相干扰;
b. 子类中的成员方法与父类中的成员方法同名同参数时——覆盖,子类中的成员方法会屏蔽继承自父类的成员方法。
****关于构造方法能否继承
构造方法不能被覆盖(屏蔽),也不能继承。父类构造方法必须在子类构造方法中调用:可以隐形调用默认无参构造方法或者用super()语句显性调用有参构造方法;
若程序中需要显示调用父类构造方法而使用super()语句时,super()必须是子类构造方法定义中的第一句;
若没有,则系统调用默认的super()语句。
public class Example1107 { public static void main(String[] args) { SonClass sc = new SonClass(); } } class SuperClass { SuperClass( int i ) //父类构造方法,带参数 { System.out.println("SuperClass"); } } class SonClass extends SuperClass { SonClass() { super(1); //父类构造方法带参数,不能隐性调用,要用super(),super()语句必须是子类构造方法的第一条语句 System.out.println("SonClass"); } }
如果没有super(1); 程序编译会出错