转换:为什么 sub-classes 属性在分配给 super class 变量时变得不可访问?
Casting: why does sub-classes properties becomes inaccessible when assigned to super class variables?
在下面的示例中,我有两个 类 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 subObj=(Sub)obj
subObj.subMethod();
再次可以访问字段和属性。 java 如何处理这些字段和属性。我如何访问无法从 super 类 对象访问的字段和属性?我很难理解幕后的这些概念。请帮助我!!!!
Child class 继承 parents 属性和方法,反之亦然
Super obj=new Sub();
obj.subMethod();
obj
是 Super
class 引用并且 Super
没有调用 subMethod
的方法,因此出现编译错误。
当你写Super obj时;
它告诉编译器类型是 Super,因此它只会查找 Super 中定义的方法。
您调用的方法应该属于该类型。
当您说 Super obj = new Sub() 时,您基本上是在告诉编译器唯一可以保证的是 obj 指向 class Super 的对象。确实,它实际上是指向一个 Sub,但如果我让你拿一个 "animal" 并挤奶,你会不会有点怀疑?只是我告诉你它是一种动物并不意味着它是一头牛,或者其他可以挤奶的东西。就您所说的,它可能是一只蜜蜂!编译器只知道你告诉它什么。
但是,当然有办法解决这个问题,前提是您可以保证动物确实是可以挤奶的(或者 Super 是蒙面潜艇)。如您所见,这称为铸造。基本上就是告诉编译器信任你并且你知道自己在做什么。当然,如果你错了,你会得到一个异常,所以你在转换时需要小心。
在下面的示例中,我有两个 类 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 subObj=(Sub)obj
subObj.subMethod();
再次可以访问字段和属性。 java 如何处理这些字段和属性。我如何访问无法从 super 类 对象访问的字段和属性?我很难理解幕后的这些概念。请帮助我!!!!
Child class 继承 parents 属性和方法,反之亦然
Super obj=new Sub();
obj.subMethod();
obj
是 Super
class 引用并且 Super
没有调用 subMethod
的方法,因此出现编译错误。
当你写Super obj时; 它告诉编译器类型是 Super,因此它只会查找 Super 中定义的方法。
您调用的方法应该属于该类型。
当您说 Super obj = new Sub() 时,您基本上是在告诉编译器唯一可以保证的是 obj 指向 class Super 的对象。确实,它实际上是指向一个 Sub,但如果我让你拿一个 "animal" 并挤奶,你会不会有点怀疑?只是我告诉你它是一种动物并不意味着它是一头牛,或者其他可以挤奶的东西。就您所说的,它可能是一只蜜蜂!编译器只知道你告诉它什么。
但是,当然有办法解决这个问题,前提是您可以保证动物确实是可以挤奶的(或者 Super 是蒙面潜艇)。如您所见,这称为铸造。基本上就是告诉编译器信任你并且你知道自己在做什么。当然,如果你错了,你会得到一个异常,所以你在转换时需要小心。