有人可以在java中解释以下代码的结果

时间:2018-04-02 06:09:06

标签: java

有人可以解释下面代码的结果,或者至少告诉我需要阅读的文档才能理解它。

我是初学者,对java有一些非常基本的知识。

以下是代码:

class A {
    public int key;
    public void f() { key=key+1; }
}
class B extends  A {
    public void f() { key = key+10; }
}

public class Problem1 {
    public static void main(String[] args) {
        B P= new B();
        P.key = 0;
        A Q = P;
        A R = new A();
        R.key = 8;
        P.f();
        Q.f();
        R.f();
        System.out.println(P.key);
        System.out.println(Q.key);
        System.out.println(R.key);
    }

}

结果:

20
20
9

提前致谢!

2 个答案:

答案 0 :(得分:1)

所以这看起来像是一个非常基本的继承示例,父类是" A"

      public int key;

这称为Field,它只是一个类中的变量。下一行是一个函数

      public void f() { key=key+1; }

这是一种可用于A对象的方法。当你调用f()时,它会增加变量' key'

下一个类是A的子函数,我们知道这是因为" extends"关键词。当一个类是子函数时,它具有所有相同的函数(因此称为继承),还有它自己的一些函数。这意味着类型B的对象将具有一个名为key的字段,因为它是其父类所具有的。

在类B中,还有另一个方法f(),它将键递增10.注意方法f()被重载,这意味着类中的两个方法具有相同的名称,但是隐式定义的参数不同。因此,如果将f()调用为A类型的对象,则会将键增加1,如果使用类型B的对象调用它,则会将键增加10。

       public class problem1{

测试数据类型A和B.了解这一点,尝试跟踪problem1的输出。

答案 1 :(得分:0)

为了明确这个问题,我建议你阅读有关Java Reference/Object& method override首先。

以下是代码中每个步骤的说明:

  1. 您创建了一个类“B”的新实例和一个指向它的引用P: enter image description here

  2. 您创建了另一个引用Q并指向上面的对象: 但请注意,B中的方法f()覆盖了A中的f() enter image description here

  3. 您创建了一个类“A”的新实例和一个指向它的引用R: enter image description here

  4. 因此,您现在共有2个对象(一个用于B类,一个用于A类)和3个引用。 下面的代码调用B的f()2次,A的f()1次。所以结果是: enter image description here