超类变量的子类引用?

Subclass Reference by Superclass variable?

当class 扩展class 时,我们可以在为子class object 分配内存时使用Super-class 引用。 目前我的理解是这样做是可以的,因为一个subclass继承了它parentclass的数据,但是它不能访问sub[=18]的成员=] 因为它只是参考,因此不知道 child class.

做了什么加法

我的问题是,当我将隐藏方法包含在上述概念中时,superclass 引用变量开始引用 child 的 class 函数。这是为什么 ?为什么它没有按预期调用自己的方法?

class A{
 void show(){ System.out.print("CLass A. \n"); }
}

class B extends A{
 void show(){System.out.print("Class B. \n");  }
}

class Main{
 public static void main(String[] args){
  A a= new A();
  B b= new B();
  a.show();   // prints Class A
  b.show();   // prints Class B

  A a1= new B();
  a1.show();   // print Class B. why is this ? it should be Class A as per theory? 
 }
}

变量和方法是两个不同的东西。变量坚持它们的类型,其中方法根据提供的实现类型执行 运行 时间。

多态性。方法动态绑定并在 运行 时间选择。如果您验证它们的实现 class,它们将被执行,否则类型 class 的实现将被执行。

当你写

 A a1= new B();

表示please call the implementations from the class B(在右侧)来自类型A

您必须了解 java 中的覆盖概念。

来自关于覆盖的 oracle documentation 页面:

覆盖和隐藏方法

实例方法

An instance method in a subclass with the same signature (name, plus the number and the type of its parameters) and return type as an instance method in the superclass overrides the superclass's method

The ability of a subclass to override a method allows a class to inherit from a superclass whose behavior is "close enough" and then to modify behavior as needed.

但覆盖不同于隐藏。

静态方法

如果子类定义了一个与超类中的静态方法具有相同签名的静态方法,则子类中的方法隐藏了超类中的方法。

隐藏静态方法和覆盖实例方法之间的区别具有重要意义:

  1. 调用的重写实例方法的版本是子类中的版本。
  2. 被调用的隐藏静态方法的版本取决于它是从超类还是从子类调用。

理解示例:

public class Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Animal");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Animal");
    }
}

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}

输出:

The static method in Animal
The instance method in Cat

它总是从最具体的class调用方法。