有如下代码
其中User为父类,它有两个私有属性name、age并都赋予初值,这两个属性分别有各自的Getter方法
Manager为子类, 也定义了自己关于name、age的初值,也有关于这两个属性的Getter方法,还有自己的show方法
//1.父类代码块
class User{
private String name = "张三";
private int age = 4;
public User(){
}
public User(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
//2.子类代码块
class Manager extends User{
String name = "李四";
int age = 4;
public Manager(String name,int age){
super(name,age);
}
@Override
public String getName() {
return name;
}
@Override
public int getAge() {
return age;
}
public void show(){
System.out.println("1....."+"我是"+this.name+",今年"+this.age+"岁");
System.out.println("2....."+"我是"+this.getName()+",今年"+this.getAge()+"岁");
System.out.println("3....."+"我是"+super.getName()+",今年"+super.getAge()+"岁");
}
}
3.主函数
public static void main(String[] args) {
Manager manager = new Manager("王五",5);
manager.show();
System.out.println("4....."+manager.name+manager.age);
System.out.println("5....."+manager.getName()+manager.getAge());
}
//函数执行结果
1.....我是李四,今年4岁
2.....我是李四,今年4岁
3.....我是王五,今年5岁
4.....李四4
5.....李四4
结果分析:
在结果分析前,先说下我对this、super关键字的理解
this关键字代表的是对象本身,在父类User中的this代表的是User这个对象,在子类Manager中的this代表的是Manager这个对象,而Manager这个类中的super代表的是其User这个对象(因为User是Manager的父类)
现在再去看这5个输出结果
Manager manager = new Manager("王五",5);
首先,在主类中,由于new了一个Manager对象,故函数先去执行Manager的带两个参数的构造方法,并传递了"王五"、5这两个实参
public Manager(String name,int age){
super(name,age);
}
在Manager对应的构造方法中,其调用了父类的带两个参数的构造方法
public User(String name,int age){
this.name = name;
this.age = age;
}
作用是将传递进来的name、age值赋予给父类下的成员变量name、age(注意: 此时子类中的name、age由于还未被赋值,故仍然是初始值李四,4)
在输出的前2个结果中都是使用的this方法,实际取到的值是对象默认的值,实例化中传递的参数值实际上是传给了User对象,并未传给Manager对象,若想传给Manager对象,则其构造方法应改为:
public Manager(String name,int age){
super(name,age);//此时这行代码不加也行
this.name = name;
this.age = age;
}
正如上面所说,由于实例化时赋的初值(王五,5)给了父类对象User,故调用父类方法进行输出时得到的是新的name、age值
第4、5个结果输出的是实例化对象manager的属性值,由于并未赋新的值,所以输出的是默认值。