有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java继承试图理解它是如何工作的

我有两门课:

public class A
{
    protected int _x;

    public A(){  
        _x = 1;  
    }
    public A(int x) {  
        _x = x;  
    }

    public void f(int x) {  
        _x += x;  
    }

    public String toString() {  
        return "" + _x;  
    }
}

public class B extends A
{
    public B() {  
        super(3);  
    }
    public B(int x) {
        super.f(x);
        f(x);
    }

    public void f(int x)
    {
        _x -= x;
        super.f(x);
    }
}

主要内容:

public static void main(String [] args)
{
    A[] arr = new A[3];
    arr[0] = new B();
    arr[1] = new A();
    arr[2] = new B(5);

    for(int i=0; i<arr.length; i++)
    {
        arr[i].f(2);
        System.out.print(arr[i] + " ");
    }
}

我试图理解为什么第一次打印后的结果是3而不是1 开始时Class A空构造函数被称为_x = 1 而不是f(int x) from class B所谓的_x = _x - 2所谓的_x = -1和之后的Super.f(x){}=>;一,


共 (1) 个答案

  1. # 1 楼答案

    arr数组中的第二个元素是A类型的对象,它是用无参数构造函数初始化的

    arr[1] = new A();
    ...
    public A(){  
        _x = 1;  
    }
    

    你在那个对象上调用f(2)。这将是A#f(int)方法(即A类中的f()方法)

    public void f(int x) {  
        _x += x;  
    }
    

    因此,将2与1相加,即3


    看来你指的是第一个元素。第一个元素用no argB构造函数初始化

    arr[0] = new B();
    ...
    public B() {  
        super(3);  
    }
    

    它调用A构造函数

    public A(int x) {  
        _x = x;  
    }
    

    _x设置为3。在这个对象上调用f(2)时,由于多态性和后期绑定,它会调用B中的f(int)方法

    public void f(int x)
    {
        _x -= x;
        super.f(x);
    }
    

    这将删除2到3,即1。但是super.f(x)将调用A版本的f(int)将2添加回_x,即_x的最终结果是3