转换:为什么子类属性在分配给超类变量时变得不可访问?

时间:2015-01-24 03:39:33

标签: java casting

在下面的示例中,我有两个类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 classe字段和属性存储在哪里?为什么我无法访问它们?

但是当我用这段代码输入对象时:

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

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

3 个答案:

答案 0 :(得分:0)

子类继承父类属性和方法,反之亦然

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

objSuper类引用,Super没有名为subMethod的方法,因此编译错误。

答案 1 :(得分:0)

当你写Super obj时; 它告诉编译器类型是Super,因此它只会找到Super。

中定义的方法

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

答案 2 :(得分:0)

当你说Super obj = new Sub()时,你基本上告诉编译器唯一可以保证的是obj指向Super类的对象。事实上,它实际上是指向Sub,但如果我要告诉你采取“动物”并将其挤出来,你不会有点怀疑吗?只是我告诉你,它是一种动物并不意味着它说的是牛,或其他可以挤奶的东西。对于你所说的一切,它可能是一只蜜蜂!编译器只知道你告诉它的内容。

然而,当你可以保证动物确实可以挤奶的时候(或者同样Super是蒙面的Sub)时,当然有办法解决这个问题。正如您所见,这被称为铸造。基本上你告诉编译器要相信你,你知道你在做什么。当然,如果你错了,你会得到一个例外,所以在施法时你需要小心。