Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据构造函数重写方法?_Java_Methods_Constructor_Interface_Overriding - Fatal编程技术网

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
,但结果仍然相同,只需一个变量