如何覆盖Java中构造函数中使用的方法?

时间:2014-04-14 19:22:02

标签: java constructor

我是Java编程的新手,我正在尝试定义类的层次结构,其中基类的构造函数调用可以在子类中重写的方法。现在,我已经理解构造函数只能调用类(即静态)方法,而不是实例方法。但是静态方法不能被覆盖(它们只被屏蔽)。因此,以下示例打印“1 1”而不是“1 2”,正如我所希望的......是否有一种简单,优雅的方式来实现此类行为?

class A {
    private int data;

    public A(int input) {
        data = computeData(input);
    }

    static private int computeData(int i) {
        return i;
    }

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

class B extends A {
    public B(int input) {
        super(input);
    }

    static private int computeData(int i) {
        return 2*i;
    }   
}

class Example {
    public static void main(String[] args) {
        System.out.println(new A(1) + " " + new B(1));
    }
}

3 个答案:

答案 0 :(得分:0)

您还可以从构造函数中调用实例方法(并且可以在子类中重写/重新定义实例方法)。

但是,您必须首先调用super()构造函数。

答案 1 :(得分:0)

您可以在类构造函数中调用实例方法。

class B

public B(int i) {
  super(i);
}

@Override
protected int computeData(int i) {
    return 2*i;
}

class A

protected int computeData(int i) {
    return i;
}

答案 2 :(得分:0)

试试这个:private methods不会被继承。所以在B class constructor中,您正在调用super(i),其中使用了{A}类的computeData method

class A1 {
    private int data;

    public A1(int input) {
        data = computeData(input);
    }

     protected int computeData(int i) {
        return i;
    }

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

class B1 extends A1 {
    public B1(int input) {
         super(input);
    }

     protected int computeData(int i) {
        return 2*i;
    }   
}

public class Example {
    public static void main(String[] args) {
        System.out.println(new A1(1) + " " + new B1(1));
    }
}