转换:为什么 sub-classes 属性在分配给 super class 变量时变得不可访问?

Casting: why does sub-classes properties becomes inaccessible when assigned to super class variables?

在下面的示例中,我有两个 类 SuperSubSub 正在扩展 Sup:

class Super{
 int a;
 int b;
 public void superMethod(){
     System.out.println("i am SubClass");
  }
}

class Sub extends Super{
  int d;
  public void subMethod(){
     System.out.println("i am SubClass");
  }
}  

当我尝试执行这段代码时:

    Super obj=new Sub();
    obj.subMethod();

我遇到编译时错误。子类字段和属性存储在哪里?为什么我无法访问它们?

但是当我用这段代码对对象进行类型转换时:

Sub subObj=(Sub)obj
subObj.subMethod();

再次可以访问字段和属性。 java 如何处理这些字段和属性。我如何访问无法从 super 类 对象访问的字段和属性?我很难理解幕后的这些概念。请帮助我!!!!

Child class 继承 parents 属性和方法,反之亦然

Super obj=new Sub();
obj.subMethod();

objSuper class 引用并且 Super 没有调用 subMethod 的方法,因此出现编译错误。

当你写Super obj时; 它告诉编译器类型是 Super,因此它只会查找 Super 中定义的方法。

您调用的方法应该属于该类型。

当您说 Super obj = new Sub() 时,您基本上是在告诉编译器唯一可以保证的是 obj 指向 class Super 的对象。确实,它实际上是指向一个 Sub,但如果我让你拿一个 "animal" 并挤奶,你会不会有点怀疑?只是我告诉你它是一种动物并不意味着它是一头牛,或者其他可以挤奶的东西。就您所说的,它可能是一只蜜蜂!编译器只知道你告诉它什么。

但是,当然有办法解决这个问题,前提是您可以保证动物确实是可以挤奶的(或者 Super 是蒙面潜艇)。如您所见,这称为铸造。基本上就是告诉编译器信任你并且你知道自己在做什么。当然,如果你错了,你会得到一个异常,所以你在转换时需要小心。