Java和字段中的多态参数

Java和字段中的多态参数,java,polymorphism,field,Java,Polymorphism,Field,提前感谢所有花时间回答问题的人 好的,我有一节课: 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();; ret

提前感谢所有花时间回答问题的人

好的,我有一节课:

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”的整数字段,但值不同。该类有一个函数,该函数将类对象作为参数,并返回“numero”的值(1表示类,2表示子类)。另外,这个类有一个方法,它输出一个字符串“do something Class”,我在子类中重写了这个字符串以输出“Subclass do something”

在main方法上,我实例化了一个类对象(“object”)和一个子类对象(“subobjecto”)。然后,我为每种方法运行该方法,并获得适当的输出

但是,当我尝试使用子类对象作为参数从类对象打印函数值时(如果我对多态性的理解是正确的,这是允许的),当我希望它返回“2”时,它返回类字段“numero”(1)的值

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


再次感谢。

字段没有多态性处理;只有方法是有效的。如果两个类有同名的字段,即使其中一个是另一个的子类,那就是两个不同的字段


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

字段不进行多态处理;只有方法是有效的。如果两个类有同名的字段,即使其中一个是另一个的子类,那就是两个不同的字段

这里的教训主要是使用方法,使用两个同名字段几乎总是一个坏主意——这只会导致混淆。

:

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

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

在这方面,字段的隐藏不同于方法的隐藏(§8.4.8.3),因为在字段隐藏中静态字段和非静态字段之间没有区别,而在方法隐藏中静态方法和非静态方法之间有区别

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

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

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

:

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

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

在这方面,字段的隐藏不同于方法的隐藏(§8.4.8.3),因为在字段隐藏中静态字段和非静态字段之间没有区别,而在方法隐藏中静态方法和非静态方法之间有区别

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

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

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


多态性不适用于字段。我看到@SotiriosDelimanolis。非常感谢。有没有一种方法可以完成我在Java中试图完成的任务?@ermyuriel你真的不应该有一个与超类字段名相同的字段。如果必须,请使用getter,而不是直接访问对象上的字段。重写超类中的getter。这很有意义。非常感谢@SotiriosDelimanolis。多态性不适用于字段。我看到了@SotiriosDelimanolis。非常感谢。有没有一种方法可以完成我在Java中试图完成的任务?@ermyuriel你真的不应该有一个与超类字段名相同的字段。如果必须,请使用getter,而不是直接访问对象上的字段。重写超类中的getter。这很有意义。非常感谢@SotiriosDelimanolis.Nice reference。“强制转换为超类类型”是导致此行为的原因。很好的参考。“强制转换为超类类型”是导致此行为的原因。
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)