Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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_Inheritance_Methods_Interface_Abstract Class - Fatal编程技术网

Java 使用接口的抽象类或公共方法

Java 使用接口的抽象类或公共方法,java,inheritance,methods,interface,abstract-class,Java,Inheritance,Methods,Interface,Abstract Class,Shape.java public interface Shape { String draw(); void calcSomething(); } public class Square implements Shape { @Override public String draw() { return "SQUARE"; } @Override public void calcSomething() {

Shape.java

public interface Shape {
    String draw();

    void calcSomething();
}
public class Square implements Shape {
    @Override
    public String draw() {
        return "SQUARE";
    }

    @Override
    public void calcSomething() {

    }
}
Square.java

public interface Shape {
    String draw();

    void calcSomething();
}
public class Square implements Shape {
    @Override
    public String draw() {
        return "SQUARE";
    }

    @Override
    public void calcSomething() {

    }
}
当我实现一个
接口时
,我实现的方法必须是
public

我想将
draw()
设为公共方法,但
calcSomething()
设为私有或受保护的方法

我经历过 . 没有直接的方法可以做到这一点

所以我计划使用抽象类,而不是使用接口

Shape.java
使用抽象类

public abstract class Shape {
    abstract public String draw();

    abstract protected void calcSomething();
}
public class Square extends Shape {
    @Override
    public String draw() {
        return "SQUARE";
    }

    @Override
    protected void calcSomething() {

    }
}
Square.java
实现
Shape
抽象类

public abstract class Shape {
    abstract public String draw();

    abstract protected void calcSomething();
}
public class Square extends Shape {
    @Override
    public String draw() {
        return "SQUARE";
    }

    @Override
    protected void calcSomething() {

    }
}
我应该选择哪一个。我应该使用接口并将
calcSomething()
公开还是应该使用抽象类并将
calcSomething()
保护引用:

实现一个接口可以使一个类在其承诺提供的行为方面变得更加正式。接口在类和外部世界之间形成契约

为了让外部世界访问这些方法,它们必须是公开的

如果您不希望该方法是公共的,即可从外部世界调用,那么它不属于接口

如果希望
calcSomething()
可以从
Shape
中的其他代码调用,则。。。哎呀,
Shape
中没有其他代码。这是一个界面。
好的,如果您想从
Square
中的其他代码调用
calcSomething()
,则需要它是一个抽象(或存根)方法。例如,这就是工作原理。

引用:

实现一个接口可以使一个类在其承诺提供的行为方面变得更加正式。接口在类和外部世界之间形成契约

为了让外部世界访问这些方法,它们必须是公开的

如果您不希望该方法是公共的,即可从外部世界调用,那么它不属于接口

如果希望
calcSomething()
可以从
Shape
中的其他代码调用,则。。。哎呀,
Shape
中没有其他代码。这是一个界面。

好的,如果您想从
Square
中的其他代码调用
calcSomething()
,则需要它是一个抽象(或存根)方法。例如,它就是这样工作的。

观点:我会使用第二个,以便能够将形状坐标本身存储在
列表中。但是抽象类只有在您希望存储此
形状的信息,同时为继承类的
抽象
实现留出空间时才有意义。作为一个侧节点,如果我正在读取方法
draw
,我宁愿希望它绘制一些东西,而不是仅仅返回一个
字符串。我可能会考虑重命名这个方法来表示它真正在做什么。为什么<代码> CalcStuts<代码>私有如果它在接口中?我有不同的类来实现形状。它们都使用相同的方法名来计算某些东西。我只是想在接口上添加该方法@鲁茨哈拉巴尼。我这样想可能是错误的。如果我不高兴,请纠正我wrong@KevinEsche这只是一个例子。你能给我发送编辑请求吗?@AmanTuladhar这听起来不对。您需要重写该方法。为什么要保密?您正在为您的API(接口)编写一个实现。观点:我将使用第二个实现,以便能够将形状坐标本身存储在
列表中。但是抽象类只有在您希望存储此
形状的信息,同时为继承类的
抽象
实现留出空间时才有意义。作为一个侧节点,如果我正在读取方法
draw
,我宁愿希望它绘制一些东西,而不是仅仅返回一个
字符串。我可能会考虑重命名这个方法来表示它真正在做什么。为什么<代码> CalcStuts<代码>私有如果它在接口中?我有不同的类来实现形状。它们都使用相同的方法名来计算某些东西。我只是想在接口上添加该方法@鲁茨哈拉巴尼。我这样想可能是错误的。如果我不高兴,请纠正我wrong@KevinEsche这只是一个例子。你能给我发送编辑请求吗?@AmanTuladhar这听起来不对。您需要重写该方法。为什么要保密?您正在为API(接口)编写一个实现。