类型超类的对象不能访问Sub类的方法

时间:2017-12-20 22:11:07

标签: java

git checkout bad-build
git checkout -b bad-build-copy
git push origin bad-build-copy

我是java的初学者,我无法理解这一行 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 { } 是什么意思。为什么A不能访问自己的方法。请详细说明A类是否实例化,以及为什么其方法无法访问。

1 个答案:

答案 0 :(得分:1)

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

  1. obj被声明为B类型的对象。

  2. objA定义。

  3. 换句话说,您可以像使用任何其他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!