好的,所以我不确定这个问题是否已经存在,因为我不知道如何格式化它,但问题在于:同一个方法可以根据构造函数产生不同的结果吗? (如果我重复这个问题,或者这是一个愚蠢的问题,我道歉。)
例如,假设我有一个函数为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() { ... } }
,但似乎没有用。
答案 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)
回答这个问题:据我所知。或者至少不是直接的,你可以开始读取字节代码并在运行时更改它,使其适应 - 所以再次,答案是否定的。
现在奇怪的部分是override
和depending 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);
}
}
它甚至线程安全。
这里要注意的是该方法的实现完全相同,变体在构造函数中。而且它的构造函数根据调用者想要发生的事情而被不同地调用。