Java 如何根据构造函数重写方法?
好吧,我不确定这个问题是否已经存在,因为我不知道如何格式化它,但问题是:同一个方法能否根据构造函数产生不同的结果?(如果我重复了这个问题或者这是一个愚蠢的问题,我道歉。) 例如,假设我有一个接口Java 如何根据构造函数重写方法?,java,methods,constructor,interface,overriding,Java,Methods,Constructor,Interface,Overriding,好吧,我不确定这个问题是否已经存在,因为我不知道如何格式化它,但问题是:同一个方法能否根据构造函数产生不同的结果?(如果我重复了这个问题或者这是一个愚蠢的问题,我道歉。) 例如,假设我有一个接口MyInterface,函数为public void foo()。假设我们有课: public class MyClass implements MyInterface { public MyClass() { // I want foo() to print "Empt
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=newmyclass()代码>和MyClass mc2=新的MyClass(5)然后调用mc1.foo()
和mc2.foo()代码>,结果应为:
空构造函数
带int的构造函数
我尝试在构造函数中使用新的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");
}
}
回答这个问题:据我所知不是这样。或者至少不是直接的,您可以开始读取字节码,并在运行时对其进行更改,使其适应——所以答案是否定的
现在奇怪的部分是覆盖
和取决于构造函数
。这不在本报告的范围之内
根据类的状态执行不同操作的方法并不奇怪。然而,使方法唯一化是我从未听说过的类的实例化方式。尽管如此,这是一个相当丑陋的解决方案
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 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);
}
}
它甚至是线程安全的
这里需要注意的是,方法的实现是完全相同的,变化在构造函数中。根据调用方希望发生的事情,调用构造函数的方式会有所不同。那么您希望使用不同的方法吗?保护变量?两个不同的班级你这样做是为了好玩吗?要点是什么?简短回答是的,但您需要编写代码,例如,您可以使用实例字段私有整数值
,在您的公共MyClass(int x)
构造函数中,您将x
的值分配给值
<代码>值=x
。然后在foo
中,测试value
,看它是否为null
如果(value==null)
,当value
为null
时,您将打印空构造函数。
,否则,您可以打印带有int的构造函数。
;作为example@MadProgrammer,正如我提到的一个保护变量。非常难看,我看不出有什么真正的原因,但谁知道,我可能错了。所以你想要不同的行为,这取决于你对创建对象的调用。听起来你需要两个不同的类来实现这个接口。所以如果我使用newmyclass(-10)
,它会用int打印构造函数,如果用户用实例化这个类,那么你可以存储一个布尔值来指示它是否使用了这个构造函数。或者可以将int设为整数,而不是检查是否大于零,而是检查它是否为null。默认构造函数将为null。这也可以工作,并且是最优雅的,使得布尔值也成为最终值。@Emz使用另一个(布尔值
)变量和整数
存储值之间有什么区别?您可以将x
设为final
,但结果仍然相同,只需一个变量