Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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_Interface_Accessibility_Abstract Class_Field - Fatal编程技术网

Java:接口与抽象类(关于字段)

Java:接口与抽象类(关于字段),java,interface,accessibility,abstract-class,field,Java,Interface,Accessibility,Abstract Class,Field,根据我收集的信息,我想强制一个类使用特定的私有字段(和方法),我需要一个抽象类,因为接口只声明公共/静态/最终字段和方法。对吗 我刚刚开始了我的第一个大型java项目,我想确保以后不会伤害自己:)这是正确的。但这不一定是一个非此即彼的决定,您可以结合接口和抽象类的优点,在接口中提供一个框架实现。您可以在《有效的Java》第二版第18项(“首选接口而非抽象类”)中找到关于这种方法的非常有趣的描述。子类不能使用私有字段和方法(除非它们也是内部类)。但是,您可以使它们受到保护。这是正确的。接口是供公众

根据我收集的信息,我想强制一个类使用特定的私有字段(和方法),我需要一个抽象类,因为接口只声明公共/静态/最终字段和方法。对吗


我刚刚开始了我的第一个大型java项目,我想确保以后不会伤害自己:)

这是正确的。但这不一定是一个非此即彼的决定,您可以结合接口和抽象类的优点,在接口中提供一个框架实现。您可以在《有效的Java》第二版第18项(“首选接口而非抽象类”)中找到关于这种方法的非常有趣的描述。

子类不能使用私有字段和方法(除非它们也是内部类)。但是,您可以使它们受到保护。

这是正确的。接口是供公众使用的。私有实现需要是抽象的(或具体的)类。

如果你发现自己在猜测该选择哪一个,我建议你在接口方面出错-最好有一个应该是抽象类的接口,而不是相反。

你不想强制使用某些私有字段或方法。通常,您不关心实现,而是关心接口。因此,在几个接口中定义几个方法(取决于需要多少),并定义实现它们的类。这在将来对您的伤害可能最小。

接口仅定义了这一点——与实现类之外的世界的接口(契约)。超类(抽象类或非抽象类)的公共方法也执行相同的操作。您不应该试图要求子类具有某些私有成员——您正在尝试指定实现,而这正是OOP所要避免的

当您想在一个超类中定义一些共享行为时,您可以使用一个抽象类,但该类不能独立存在(它需要子类化)。共享行为可能需要自己的某种状态,在这种情况下,它可以定义私有字段,也可能有只有它才能使用的私有方法


即使从抽象类继承,也无法访问其私有字段/方法。

接口为行为定义契约。这就是它们需要的,而不是属性。

如果您想让子类定义特定的方法,使用接口就可以了。正如其他人所说,与其说是关于子类如何完成它,不如说是它将完成它的事实。

两者都提供是很常见的,因此您最终会得到:

public interface Sendable {
    public void sendMe();
}

这样,任何对抽象类中的默认实现感到满意的人都可以在不重写大量代码的情况下快速对其进行子类化,但是任何需要执行更复杂操作(或需要从不同基类继承)的人仍然可以实现接口并且是即插即用的。

我想强制类使用特定的私有字段(和方法) 你问题的这一部分是值得怀疑的:你认为你为什么要这样做


私有成员对于子类是不可见的,接口定义了公共接口,因此您唯一的选择就是使用抽象类……但我想不出任何理由为什么会有人希望这样做

如果您希望一个类使用另一个类的某些字段或方法,您可以将它们声明为受保护的

    public abstract class A {

      protected Object thing;
    }
可以被同一包中的另一个类访问(可以扩展类A,也可以不扩展)


这并不是真的“强迫”另一个类使用它,更像是“启用”。

除了接口中的最终字段/方法之外,这是正确的。+1我很惊讶这个问题有这么多字面上的答案,你是唯一一个解决这个问题背后的错误假设的人。你不想让AbstractSendable发送。是的。更正。真的,我想要一个不那么做作的例子,但我没有马上想到“如果一个类包含抽象方法,则该类本身必须声明为抽象。”您的代码实际编译吗?
    public abstract class A {

      protected Object thing;
    }
A a = new A();
a.thing.toString();