Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向上转换时,Java如何处理字段?_Java - Fatal编程技术网

向上转换时,Java如何处理字段?

向上转换时,Java如何处理字段?,java,Java,可能重复: 我对Java在升级过程中如何处理类的字段感到困惑。例如: class SuperClass { String myString = "String in SuperClass"; public void myMethod() { System.out.println("Method in SuperClass"); } } class SubClass extends SuperClass { String myStrin

可能重复:

我对Java在升级过程中如何处理类的字段感到困惑。例如:

class SuperClass
{
    String myString = "String in SuperClass";

    public void myMethod()
    {
        System.out.println("Method in SuperClass");
    }
}

class SubClass extends SuperClass
{
    String myString = "String in SubClass";

    public void myMethod()
    {
        System.out.println("Method in SubClass");
    }
}

class Question
{
    public static void main(String[] args)
    {
        SuperClass test = new SubClass();
            // object test is an instance of SubClass
            // but I am telling the compiler to treat it as SuperClass

        test.myMethod();
        System.out.println(test.myString);

    }
}
输出:

Method in SubClass
String in SuperClass //Why is "String in SubClass" not used?
当我创建一个对象
test
时,它是
子类
类的一个实例;但是,我告诉编译器将其视为
超类
。关于方法工作的一切对我来说都很清楚:如果为
超类
定义了给定的方法,我将只能使用
子类
的方法

但是,当我试图访问
test
myString
时,我不明白为什么要使用
超类的字段。既然
test
SubClass
的一个实例,我希望使用
SubClass
中定义的
myString
,为什么不这样呢?我错过了什么

我知道我可以使用
这个
操作符访问
子类
的myString。例如,我可以在超类中定义
printMyString
方法,并用

public void printMyString()
{
    System.out.println(this.myString);
}
子类
中,我的问题主要是关于
超类
字段如何用于
测试
。也许我遗漏了一些明显的东西

我试着寻找答案,我找到的最接近的话题虽然有用,但并没有回答我的问题


提前感谢

属性不能像方法那样重载

test.myMethod(); 
这里,方法调用取决于实际对象的类型。这里的对象类型为
SubClass
,因此调用
SubClass
的方法

test.myString
访问属性时,它取决于引用变量的类型。这里引用变量ie
test
属于
SuperClass
类型,因此可以访问
SuperClass
中的属性


你看的是

Java中的字段是隐藏的,实际上没有被覆盖(这并不意味着我们在尝试此操作时会出现编译时错误,相反,它们没有被真正意义上的覆盖)

重写意味着应该根据运行时调用成员 对象的类型,而不是基于声明的类型

但Java中字段的绑定始终是静态的,因此它只基于声明的对象引用类型

在您给出的示例中,通过在class
子类
中声明名为“myString”的类变量,可以隐藏它从其父类
父类
继承的名为“myString”的类变量

Java语言规范:

如果类声明具有特定名称的字段,则 该字段的声明据说隐藏了所有可访问的内容 超类中同名字段的声明,以及 班上的高级介面

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


很好的链接,谢谢。关键部分是:“当子类中的实例变量与超类中的实例变量同名时,则在引用类型的类中选择该实例变量。”@Akavall:Ya你说到点子上了:)