在类的继承过程中,如果子类中新增的变量和方法与父类中原有的变量和方法同名,则会覆盖从父类继承来的同名变量和方法。覆盖又分为变量覆盖和方法覆盖,变量覆盖是指父类和子类中的变量名相同,数据类型也相同。方法覆盖又称方法重写,与之前介绍的方法重载相比,方法覆盖的要求更严格:
!!不仅要求父类与子类中的方法名称相同,而且参数列表也要相同,只是实现的功能不同。
样例
class SuperCla
{
int a=3;
int b=4;
void show()
{
System.out.println("super result="+(a+b));
}
}
class SubCla extends SuperCla{
int a=10;
void show()
{
int c=a*b;
System.out.println("sup result="+c);
}
}
public class SimpleTest {
public static void main(String[] args) {
SuperCla sp=new SuperCla();
SubCla sb=new SubCla();
sp.show();
System.out.println("In super Class:a="+sp.a);
sb.show();
System.out.println("In sub Class:a="+sb.a);
}
}
结果
super result=7
In super Class:a=3
sup result=40
In sub Class:a=10
分析:
在子类SubCla中定义有与父类SuperCla同名的变量a和方法show(),因此,使用子类对象sb访问变量a和方法show时,引用的的是子类中的成员,父类的同名变量被覆盖,同名的方法被重写。
如果想在子类中访问父类中被覆盖的成员,可以使用关键字super来解决这以问题,基本格式如下。
访问父类成员:
super.成员变量或super。成员方法([参数列表])
访问父类构造方法:
super([参数列表])
样例:
class Employee{
private String name;
private int salary;
public String getDetails(){
return "Name:"+name+"\nSalary:"+salary;
}
Employee(){
name="Tom";
salary=1234;
}
}
class Manager extends Employee{
public String department;
public String getDetails()
{
System.out.println("I am in Manager");
return super.getDetails();
}
Manager(){
super();
department="sale";
}
}
public class Inheritance {
public static void main(String[] args) {
Manager manager=new Manager();
System.out.println(manager.getDetails());
System.out.println("department:"+manager.department);
}
}
结果
I am in Manager
Name:Tom
Salary:1234
department:sale
分析:首先对于Manager实例化,并自动调用无参数构造方法Manager(),主要完成两项主要任务:一是通过super调用父类的无参数构造函数,即Employee(),二是对子类中新增的变量department进行初始化,接着,语句manager.getDetails()调用子类的同名方法getDetails(),并在方法体中通过super.getDetails()实现对父类中getDetails()方法的调用。
注意:
生成一个类的实例时,一定会执行该类的构造方法,但如果该类继承自某个父类,则执行子类的构造方法时,系统会自动的调用父类的无参数构造函数。因此,在上面Manager()中去掉语句super()的效果是完全一样的。
于super不同,关键字this的主要作用在于表示当前对象,当局部变量和类的成员变量同名时,该局部变量作用区域内的成员变量就被隐藏了,必须使用this来指明,如下例所示
public class Mydate{
private int day,month,year;
public void setday(int day){
this.day=day;
}
}
这里的this实际上指的是Mydate,如果将this省去,则=左右的变量day均为方法setday()中的局部变量。