0

提前感谢任何花时间回答的人。

好的,所以我有这个类:

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 有一个输出字符串“做某事类”的方法,我在子类中重写了它以输出“子类做某事”。

在 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)

我有什么误解或做错了什么?

再次感谢你。

4

2 回答 2

3

字段不被多态处理;只有方法是。如果两个类有同名的字段,即使一个是另一个的子类,那也是两个不同的字段。

这里的教训主要是使用方法,并且有两个具有相同名称的字段几乎总是一个坏主意——它只会导致混乱。

于 2013-07-16T17:31:04.043 回答
2

来源

在一个类中,与超类中的字段同名的字段会隐藏超类的字段,即使它们的类型不同。在子类中,超类中的字段不能通过其简单名称来引用。相反,必须通过 访问该字段super

JLS 8.3

如果该类声明了一个具有特定名称的字段,则该字段的声明被称为隐藏了超类和该类的超接口中具有相同名称的任何和所有可访问的字段声明。

在这方面,字段隐藏与方法隐藏不同(第 8.4.8.3 节),因为在字段隐藏中静态和非静态字段之间没有区别,而在方法隐藏中静态和非静态方法之间存在区别.

如果隐藏字段是静态的,则可以使用限定名称(第 6.5.6.2 节)或使用包含关键字 super(第 15.11.2 节)或转换为超类类型的字段访问表达式来访问隐藏字段。

在这方面,隐藏字段类似于隐藏方法。

如果一个字段声明隐藏了另一个字段的声明,则这两个字段不必具有相同的类型。

于 2013-07-16T17:32:07.723 回答