在下面的示例中,我有两个类Super
和Sub
。 Sub
正在扩展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如何处理这些字段和属性。如何访问超类对象无法访问的字段和属性?我很难理解幕后的这些概念。请帮帮我!!!!
答案 0 :(得分:0)
子类继承父类属性和方法,反之亦然
Super obj=new Sub();
obj.subMethod();
obj
是Super
类引用,Super
没有名为subMethod
的方法,因此编译错误。
答案 1 :(得分:0)
当你写Super obj时; 它告诉编译器类型是Super,因此它只会找到Super。
中定义的方法您调用的方法应该属于该类型。
答案 2 :(得分:0)
当你说Super obj = new Sub()时,你基本上告诉编译器唯一可以保证的是obj指向Super类的对象。事实上,它实际上是指向Sub,但如果我要告诉你采取“动物”并将其挤出来,你不会有点怀疑吗?只是我告诉你,它是一种动物并不意味着它说的是牛,或其他可以挤奶的东西。对于你所说的一切,它可能是一只蜜蜂!编译器只知道你告诉它的内容。
然而,当你可以保证动物确实可以挤奶的时候(或者同样Super是蒙面的Sub)时,当然有办法解决这个问题。正如您所见,这被称为铸造。基本上你告诉编译器要相信你,你知道你在做什么。当然,如果你错了,你会得到一个例外,所以在施法时你需要小心。