好的,所以我不确定这个问题是否已经存在,因为我不知道如何格式化它,但问题是:同一个方法会根据构造函数产生不同的结果吗?(如果我重复了这个问题,或者这是一个愚蠢的问题,我道歉。)
例如,假设我有一个具有函数public void foo();
的接口MyInterface
。假设我们有课:
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();
,结果应该是:
空构造函数。
具有内部的构造函数
我尝试在构造函数中使用new MyInterface { @Override public void foo() { ... } }
,但似乎不起作用。
是。存储变量并在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");
}
}
回答这个问题:据我所知,不是。或者至少不是直接地,您可以开始读取字节码,并在运行时对其进行更改,使其适应——所以,答案是否定的。
现在奇怪的部分是override
和depending on constructor
。它不在覆盖范围内。
根据CCD_ 10的状态来做不同事情的方法并不太奇怪。然而,使该方法成为类实例化方式的唯一性,我从未听说过。话虽如此,这里有一个相当丑陋的解决方案
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 ()
。
是的,这就是多个构造函数的设计目的,通过创建对象来允许变化。
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);
}
}
它甚至可以穿得很安全。
这里需要注意的是,该方法的实现完全相同,变体在构造函数中。构造函数的调用方式不同,这取决于调用者想要发生什么。