Java 继承+this+super关键字理解

有如下代码
  其中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.....我是李四,今年42.....我是李四,今年43.....我是王五,今年54.....李四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的属性值,由于并未赋新的值,所以输出的是默认值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
正确的使用super关键字继承宠物的属性和方法的示例代码如下: ```java public class Pet { protected String name; protected int age; // 宠物的构造方法 public Pet(String name, int age) { this.name = name; this.age = age; } // 宠物的方法 public void eat() { System.out.println(name + " is eating."); } } public class Dog extends Pet { private String breed; // 狗的构造方法 public Dog(String name, int age, String breed) { super(name, age); // 调用父的构造方法 this.breed = breed; } // 狗重写了宠物的eat方法 @Override public void eat() { System.out.println(name + " the " + breed + " is eating."); } // 狗新增的方法 public void bark() { System.out.println(name + " is barking."); } } // 在另一个中实例化Dog对象并访问其属性和方法 public class Main { public static void main(String[] args) { Dog myDog = new Dog("Buddy", 3, "Golden Retriever"); myDog.eat(); // 调用重写后的eat方法 myDog.bark(); // 调用新增的bark方法 System.out.println(myDog.name + " is " + myDog.age + " years old."); // 访问继承自父的属性 } } ``` 上述示例代码中,Dog继承了Pet,并在自身的构造方法中通过`super`关键字调用了父的构造方法来给父的属性初始化。在重写了父的`eat`方法后,Dog新增加了一个`bark`方法。在使用Dog对象时,可以访问继承自父的属性和方法,也能够调用自身新增的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值