如何根据构造函数覆盖方法?

时间:2015-11-24 22:09:36

标签: java methods constructor interface override

好的,所以我不确定这个问题是否已经存在,因为我不知道如何格式化它,但问题在于:同一个方法可以根据构造函数产生不同的结果吗? (如果我重复这个问题,或者这是一个愚蠢的问题,我道歉。)

例如,假设我有一个函数为MyInterface的接口public void foo();。假设我们上课了:

public class MyClass implements MyInterface {
    public MyClass() {
        // I want foo() to print "Empty constructor" with sysout.
    }

    public MyClass(int x) {
        // I want foo() to print "Constructor with int" with sysout.
    }
}

现在,如果创建两个引用MyClass mc1 = new MyClass();MyClass mc2 = new MyClass(5);,然后调用mc1.foo();mc2.foo();,结果应为:

  

空构造函数。

     

带有int。

的构造函数

我在构造函数中尝试了new MyInterface { @Override public void foo() { ... } },但似乎没有用。

3 个答案:

答案 0 :(得分:0)

是。存储变量并在foo方法中检查它。

public class MyClass implements MyInterface {
    private int x;
    public MyClass() {
        // I want foo() to print "Empty constructor" with sysout.
    }

    public MyClass(int x) {
        // I want foo() to print "Constructor with int" with sysout.
        this.x = x;
    }

    public void foo(){
       if(x > 0)
          System.out.println("Constructor with int");
       else
          System.out.println("Empty constructor");
    }
}

答案 1 :(得分:0)

回答这个问题:据我所知。或者至少不是直接的,你可以开始读取字节代码并在运行时更改它,使其适应 - 所以再次,答案是否定的。

现在奇怪的部分是overridedepending on constructor。它不在overriding范围内。

根据Class的状态执行不同操作的方法并不太奇怪。但是,使该方法与实例化类的方式不同,我从未听说过。话虽如此,这是一个相当难看的解决方案。

public class Test
{
    private final boolean intConstructorUsed;

    public Test () {
        intConstructorUsed = false;
    }

    public Test (int x) {
        intConstructorUsed = true;
    }

    public void foo () {
        if (intConstructorUsed == true) {
            // do this
        } else {
            // do that
        }
    }
}

foo方法不是那个很奇怪。奇怪的是,您基本上必须使用foo的不同实现,具体取决于哪个构造函数,您确定不需要abstract class,除了一个abstract void foo ()之外的所有共享方法你覆盖?当然,这些课程几乎看起来完全相同,但不是,因为他们没有分享他们的foo ()

答案 2 :(得分:0)

是的,它的多个构造函数旨在允许 - 通过对象创建进行变化。

public class MyClass implements MyInterface {
    private final String message;
    public MyClass() {
        message = "Empty constructor";
    }

    public MyClass(int x) {
        message = "Constructor with int";
    }

    @Override
    public void foo() {
        System.out.println(message);
    }
}

它甚至线程安全。

这里要注意的是该方法的实现完全相同,变体在构造函数中。而且它的构造函数根据调用者想要发生的事情而被不同地调用。