提前感谢任何花时间回答的人。
好的,所以我上了这堂课:
public class Class {
protected Integer numero=1;
public Class(){}
public void method (){
System.out.println("Class do something");}
public String function(Class Object){
String res;
res=Object.numero.toString();;
return res;}
这个子类:
public class Subclass extends Class{
protected Integer numero=2;
@Override
public void method(){
System.out.println("Subclass do something");
}
}
两者都有一个名为“numero”的整数字段,但值不同。 Class类有一个函数,它将Class对象作为参数并返回值“numero”(类为1,子类为2)。另外,Class有一个输出字符串“do something Class”的方法,我在Subclass中重写它以输出“Subclass do something”。
在main方法上,我实例化了一个Class对象(“object”)和一个Subclass对象(“subobjeto”)。然后我为每个运行方法,并获得适当的输出。
但是,当我尝试使用Subclass对象作为参数从Class对象打印函数的值时(如果我对多态性的理解是正确的,则允许),它返回Class字段“numero”的值(1),当我希望它返回“2”时。
public class Exe {
public static void main(String[] args) {
Class object= new Class();
Subclass subobjeto=new Subclass();
Class arreglo[]= new Class[2];
arreglo[0]=object;
arreglo[1]=subobjeto;
for(int i=0;i<arreglo.length;i++){
arreglo[i].method();
}
System.out.println(object.function(subobjeto)+" "+subobjeto.numero);
}
}
输出:
run:
Class do something
Subclass do something
1 2
BUILD SUCCESSFUL (total time: 0 seconds)
我误解或做错了什么?
再次感谢你。
答案 0 :(得分:3)
不对字段进行多态处理;只有方法。如果两个类具有相同名称的字段,即使一个是另一个的子类,也就是两个不同的字段。
这里的教训主要是使用方法,并且拥有两个具有相同名称的字段几乎总是一个坏主意 - 它只会导致混淆。
答案 1 :(得分:2)
在类中,与超类中的字段具有相同名称的字段会隐藏超类的字段,即使它们的类型不同。在子类中,超类中的字段不能通过其简单名称引用。相反,必须通过
super
访问该字段。
如果类声明了一个具有特定名称的字段,那么该字段的声明将被隐藏为隐藏超类中具有相同名称的字段的任何和所有可访问声明,以及该类的超接口。
在这方面,隐藏字段不同于隐藏方法(第8.4.8.3节),因为在字段隐藏中静态和非静态字段之间没有区别,而静态和非静态方法之间存在区别方法隐藏。
如果隐藏字段是静态的,则可以使用限定名称(第6.5.6.2节)访问隐藏字段,或者使用包含关键字super(第15.11.2节)或转换为超类类型的字段访问表达式来访问隐藏字段
在这方面,隐藏字段类似于隐藏方法。
如果字段声明隐藏了另一个字段的声明,则这两个字段不必具有相同的类型。