【问题标题】:Why is the output of this program i=10? [duplicate]为什么这个程序的输出i=10? [复制]
【发布时间】:2015-08-11 08:12:45
【问题描述】:
class A 
{
    protected int i=10;
}
class B extends A
{
    protected int i=15;
}
public class Test extends B
{
    public static void main(String a[]) 
    {
        A obj=new Test();
        System.out.print("i="+obj.i);
    }
}

它的输出是i=10,但是如何呢?

对象的内存分配将如何进行。

【问题讨论】:

  • 因为你声明它的类型是A
  • 来自 Java 编程语言第 4 版:“除了可以在类本身中访问和在同一个包中进行代码访问(参见第 18 章)之外,还可以通过对象引用从类中访问受保护的成员至少与类的类型相同 - 即类的类型或其子类型之一的引用。”。第 3.5 节 - protected 的真正含义 - 如果您有兴趣了解更多信息,本书会更详细地介绍。 dl.acm.org/citation.cfm?id=1051069
  • 因为声明属于 A 类,并且您正在直接访问 var i,例如,如果您在两个类中都有 getI(),则结果将为 15。

标签: java object inheritance extends


【解决方案1】:
A obj=new Test();

意味着,您正在访问类A 的成员并执行Test(多态性)的方法。

我建议你阅读关于继承和多态的官方文档以深入了解。

【讨论】:

    【解决方案2】:

    多态性对象而不是引用相关联。由于您使用的是A 类型的引用,如果您在A 中有方法getI() 并在B 中覆盖它,您将获得A.i,然后调用obj.getI(),然后您将获得B.i的价值

    【讨论】:

      【解决方案3】:

      在 java 中,不存在变量覆盖。我们有方法覆盖的概念。

      在您的代码中

      A obj=new Test();
      

      您可以访问A 的成员。如果您在两个类(Parent 和 Child)中都覆盖了相同的方法。而您正在使用obj 调用该方法。这次您将从 Child 类覆盖的方法中获得输出。这就是多态性的概念。

      【讨论】:

        【解决方案4】:

        第 1 行:A a = new A();

        将在A类中检查方法是否存在,并且还将从A类中调用该方法。

        a.g();//A class method will be called
         System.out.print("i="+a.i);//A class i will be accessed
        

        第 2 行:A b = new B();

        将在A类中检查方法是否存在,并从B类中调用该方法。

        b.g();//B class method will be called and it will also check that it is` available in A also or not if not then compile time error.
        System.out.print("i="+b.i);//A class i will be accessed
        

        【讨论】:

          猜你喜欢
          • 2021-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多