【问题标题】:Method overriding in Java- assigning child class object to parent class variableJava中的方法覆盖-将子类对象分配给父类变量
【发布时间】:2015-11-30 01:43:33
【问题描述】:
class Person{
    String name;

    void show(){
        System.out.println("I am parent");
    }
}

class  Student extends Person{
    String dit;

    void show(){
        System.out.println("I am child");
    }
}

public class NewClass {
    public static void main(String[] args) {
        Person p;
        p = new Student();

        p.name = "Kamal";
        p.dit = "DIT/10/c1/1234"; // I'm not allowed to do this 
        p.show(); // Here in overriding child class method is called
    }
}

我很困惑。据我了解,“p”变量无法访问 dit(即使它被分配了 Student),因为 p 的数据类型是 Person,它是父类。因此父类不能访问子类的属性和方法。但是在覆盖它调用子类方法时。

我是 Java 新手。请帮助我理解这一点。

【问题讨论】:

  • 运行时多态性
  • 这正是“覆盖”的意思
  • 你需要了解的主要是变量pPerson类型,而p引用的对象是Student类型。
  • 如果你需要访问p.dit,那么你应该声明Student p。并非每个Person 都有dit,这就是编译器阻止您访问该属性的原因。

标签: java inheritance overriding


【解决方案1】:

这称为运行时多态性

JVM在运行时根据对象的内容决定调用哪个方法而不是对象的类型

您显然不能访​​问dit,因为只是对象的类型不支持它。 show 方法是可访问的,因为它是父类和子类的一部分

更多详情here

这是一个经典的例子

class Animal {
  void whoAmI() {
    System.out.println("I am a generic Animal.");
  }
}
class Dog extends Animal {
  void whoAmI() {
    System.out.println("I am a Dog.");
  }
}
class Cow extends Animal {
  void whoAmI() {
    System.out.println("I am a Cow.");
  }
}
class Snake extends Animal {
  void whoAmI() {
    System.out.println("I am a Snake.");
  }
}

class RuntimePolymorphismDemo {

  public static void main(String[] args) {
    Animal ref1 = new Animal();
    Animal ref2 = new Dog();
    Animal ref3 = new Cow();
    Animal ref4 = new Snake();
    ref1.whoAmI();
    ref2.whoAmI();
    ref3.whoAmI();
    ref4.whoAmI();
  }
}
The output is

I am a generic Animal.
I am a Dog.
I am a Cow.
I am a Snake.

【讨论】:

    【解决方案2】:

    运行时 Java意识到p实际上是一个Student,它看到Student已经覆盖了show(),所以它调用了Student中的show方法而是。

    【讨论】:

      【解决方案3】:

      没有能力从其父类访问子类的成员。 在您的情况下,如果您想访问 dit 变量,您必须将 p 对象转换为 Student。

      ((Student)p).dit = "DIT/10/c1/1234";
      

      【讨论】:

        【解决方案4】:

        你还没有定义类 Person。您尝试创建一个新对象(p)然后尝试定义名称但没有设置器或获取器。

        class Person{
        String name;
        
        public Person( string name ){
            setName; }
        
        public void setName(){this.name = name: }
        
        public void getName(){ return name; }
        
            void show(){
                System.out.println("I am parent");
            }
        }
        
        class  Student extends Person{
            String dit;
        
        public void setDit() {this.dit = dit; }
        
        public void getDit() { return dit; }
        
            void show(){
                System.out.println("I am child");
            }
        }
        

        因此,您需要为要设置的内容构建字段,并且需要为要创建/定义的对象添加构造函数。希望这会有所帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-27
          相关资源
          最近更新 更多