【问题标题】:JAVA inheritance ( can't find out the difference ) [duplicate]JAVA继承(找不到区别)[重复]
【发布时间】:2015-08-10 08:32:11
【问题描述】:

我正在为 OCA 做准备测试,但在执行此任务时我感到很困惑:

class A {
   private int i = 10;

   public void f() {}
   public void g() {}
}

class B extends A {
   public int i = 20;
   public void g() {}
}

public class C {
   A a = new A(); // 1
   A b = new B(); // 2
}

所以我无法理解A a = new A();A b = new B(); 之间的区别

我知道..这对你们来说可能很容易,但我无法弄清楚。

提前致谢

【问题讨论】:

标签: java


【解决方案1】:

A a = new A() 创建一个对象 A,使用该对象您可以访问类 A 中的 f()g() 方法。

A b = new B() 可以做到,因为 B 类扩展了 A 类。这里的概念称为polymorphism。 Java 允许用户将子对象(在本例中为 B)分配给父引用(在本例中为 A)。现在使用对象b,您也可以访问A 类的f()。请注意,如果您引用了 B 类(如果您创建了 B b = new B()),则这是不可能的。

此外,您可以访问g(),但由于g() 存在于B 类中,因此优先。所以,B 类的g() 被执行。

试试这个例子来了解更多:

class A{
   private int i = 10;
   public void  f(){System.out.println(i);}
   public void g(){System.out.println(i+"**");}
}

class B extends A{
   public int i = 20;
   public void g(){System.out.println(i+"**********");}
}

public class C{
    public static void main(String[] args) {
        A a = new A();//1
           A b = new B();//2
           a.f();
           b.f();
           b.g();
           a.g();

    }

}

【讨论】:

  • 是的……这就是我需要的……更有意义,将在 eClipse 上使用代码……谢谢伙计!
  • 还有一个问题,先生,我知道调用方法时它是如何工作的。但是......假设我尝试打印 i,如何理解,而不在 eClipse 上检查它,例如 System.out.println(b.i)System.out.println(a.i) 不会工作。我知道我可以制作B bb = new B(); 之类的东西,然后调用System.out.println(bb.i) 或使用setter 和getter,但是有什么简单的规则可以理解吗?抱歉.. 上面的链接错过了,现在更有意义了.. 感谢您的帮助
  • 几乎相似。对应于对象的变量被拾取。如果子变量有自己的变量,则在使用子对象调用时优先。只需检查上述程序中打印的值。您可以通过创建更多变量并打印所有排列和组合来玩耍。
【解决方案2】:

A a = new A();
这里a可以访问A类的所有数据成员和成员函数。

A b = new B(); 这里 b 只能访问 B 类中存在的 A 类成员。
这个概念被称为向上转换,它是为了在java中实现抽象,我们希望父类执行子类方法。

【讨论】:

    【解决方案3】:

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

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

    a.g();//A class method will be called
    

    第 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.
    

    【讨论】:

      【解决方案4】:
      A a = new A();
      

      您可以访问 A 的成员,并在运行时执行类 A 中的方法实现。

      如果您执行a.g(),则调用类A 中的实现

      A b = new B();
      

      您可以访问 A 的成员,并在运行时执行类 B 中的方法实现。

      如果您执行a.g(),则调用类 `B 中的实现。

      简而言之,右侧部分决定了需要执行哪些类方法。

      我建议你阅读继承和多态来深入理解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-26
        • 2013-06-13
        • 2013-09-18
        • 1970-01-01
        • 2015-11-11
        • 2017-09-20
        • 1970-01-01
        相关资源
        最近更新 更多