类型超类的对象无法访问Sub类的方法[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

    class A extends B
{
    public static void main(String[] args)
    {
        B obj = new A();
        obj.speak(); //error :the method speak() undefined for type B
    }

    public void speak()
    {
        System.out.println("in speak");
    }
}

class B {
}

我是java的初学者,我无法理解这行B obj = new A();是什么意思。为什么A不能访问自己的方法。请详细说明A类是否实例化,以及为什么其方法无法访问。

java
1个回答
1
投票

以下陈述B obj = new A();意味着两件事。

  1. obj被宣布为B类型的对象。
  2. objA定义。

换句话说,您可以像使用任何其他obj对象一样使用B。通过将其类型声明为B,您可以限制编译器仅使用该透视图(以及B的超类)。

那么使用obj定义A意味着什么呢?

使用A的构造函数构建obj将导致构造每个超类A(从第一个父节点开始),并且每次定义方法时它们都会覆盖由超类定义的那些。

成员变量/静态字段只会影响超类的那些,这意味着通过切换透视图可以访问不同的字段。但是,必须记住,方法将始终是由定义它们的最后一个子类定义的方法。

代码示例

public class Example
{
  public static void main(String[] args)
  {
    Animal animal = new Animal();
    System.out.println(animal.name);
    animal.makeSound();
    Animal doggy = new Dog();
    System.out.println(doggy.name);
    doggy.makeSound();
  }
}

public class Animal {
  public String name;

  public Animal() {
    name = "NameLess";
  }

  public void makeSound() {
    System.out.println("What am I?");
  }
}

public class Dog extends Animal {

  public Dog() {
    name = "Goofy";
  }

  public void makeSound() {
    System.out.println("woof woof!");
  }
}

此示例的输出将是:

NameLess
What am I?
Goofy
woof woof!
© www.soinside.com 2019 - 2024. All rights reserved.