【问题标题】:java- reference variable and super class reference variablejava-引用变量和超类引用变量
【发布时间】:2015-01-31 08:12:13
【问题描述】:
public class HelloWorld
{      

     public static void main(String []args)
     {
       Horse obj1=new Horse();
       Horse obj2=obj1;
       Animal obj3;
       obj3=obj2;
       obj2.name="Mustang";
       obj3.name="Alpha";
       obj3.display();
     }
}


class Animal
{   

    String name;
    void display()
    {
        System.out.println("this is "+name);
    }
}

class Horse extends Animal
{

    String name;
    void display()
    {
        System.out.println("this is  "+name);
    }
 }

你好,我是java初学者,如果问题很愚蠢,我很抱歉。这是一个简单的程序,其中一个引用变量 obj2 引用了另一个相同类型的引用变量 obj1。如果我更改实例变量“名称”,它们都会发生变化,因为我猜这两个参考变量都指向相同的内存。现在我创建了另一个动物类型的引用变量“obj3”,它是超类。我让它引用了 obj2,现在当我尝试使用 obj3 更改实例变量“名称”时它不起作用。谁能告诉我为什么会这样?

【问题讨论】:

  • 什么是“它不起作用?”你期待看到什么?
  • 我期待“这是 Alpha”作为输出,但它打印“这是野马”

标签: java variables reference


【解决方案1】:

您正在超类型和子类型中定义成员字符串名称。您应该从 Horse 类中删除 name 成员。

【讨论】:

  • 欢迎。您可以在 Horse 类中省略 display 函数,因为 Horse 也会从 animal 继承该函数。如果您发现这回答了您的问题,请考虑接受答案。
  • 是的,我知道..我只是在练习。我做了第一个显示函数来尝试超级引用变量
  • @VikramSingh 这个答案怎么能胜过我的??
  • 我不确定,但这不是java中的默认范围包吗??
  • @StefanFalk 因为它比你的好?
【解决方案2】:

“我期待“这是 Alpha”作为输出,但它打印“这是野马”。

嗯,你有两个名为name 的“桶”。根据类型,您将访问其中一个。由于obj3 引用认为它是Animal,它从超类Animal 访问(并打印)name。这就是为什么obj3 打印“这是野马”的原因是因为它正在访问在Animal 类中声明的name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2020-12-24
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    相关资源
    最近更新 更多