21xrx.com
2024-11-05 18:49:23 Tuesday
登录
文章检索 我的文章 写文章
Java向上转型调用时,属性来自子类还是父类?
2023-06-19 09:25:25 深夜i     --     --
Java 面向对象 向上转型 属性 子类 父类 覆盖重写

在Java的面向对象编程中,向上转型是一种将子类对象转换为父类对象的方式。但是,当我们调用继承自父类的属性时,这些属性是从子类中继承过来的还是直接从父类中继承的呢?

事实上,当我们对一个子类对象进行向上转型后,对象中的属性是存在于子类中的,但是,当我们通过父类引用调用这些属性时,Java会在编译时期根据引用类型来确定应该调用哪一个属性,如果存在同名属性,且父类引用调用的是子类的重写方法,则会调用子类覆盖重写的属性。

例如,在下面的代码中,Animal是父类,而Cat是子类:


class Animal {

  String name = "动物";

  public void run() {

    System.out.println("动物在跑");

  }

}

class Cat extends Animal {

  String name = "猫";

  public void run() {

    System.out.println("猫在跑");

  }

  public void climb() {

    System.out.println("猫在爬");

  }

}

public class Test {

  public static void main(String[] args) {

    Animal animal = new Cat(); // 向上转型

    System.out.println(animal.name); // 输出 "动物"

    animal.run(); // 输出 "猫在跑"

  }

}

在这个例子中,Cat继承了Animal的name属性,并且重写了父类的run方法。在main方法中,我们创建了一个Animal类型的引用指向一个Cat对象,因此animal的name属性是"猫",但是当我们通过animal引用调用name属性时,输出的却是"动物"。这是因为Animal类型的引用只能调用Animal类中的属性,所以调用的是父类的name属性。而当我们调用run方法时,输出的是"猫在跑",这是因为在Cat类中重写了父类的run方法,并且animal引用调用的是重写后的方法。

总之,当我们在Java中使用向上转型时,调用继承自父类的属性时,Java会根据引用类型来确定调用哪一个属性。如果父类和子类存在同名属性,且父类引用调用的是子类重写的方法,则会调用子类覆盖重写的属性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复