Java 我应该实现抽象类中的所有方法吗?
下面是代码片段:Java 我应该实现抽象类中的所有方法吗?,java,oop,Java,Oop,下面是代码片段: public abstract class MyAbstractClass { public abstract void a(); public abstract void b(); } public class Foo extends MyAbstractClass { public void a() { System.out.println("hello"); } public void b(){
public abstract class MyAbstractClass {
public abstract void a();
public abstract void b();
}
public class Foo extends MyAbstractClass {
public void a() {
System.out.println("hello");
}
public void b(){
System.out.println("bye");
}
}
public class Bar extends MyAbstractClass {
public void a() {
System.out.println("hello");
}
public void delta() {
System.out.println("gamma");
}
}
我有几个问题:
我应该在抽象类中实现所有的方法吗
Q-2:-实现类可以有自己的方法吗?如果子类是非抽象的,您不仅应该,而且必须实现所有抽象方法。否则,如果调用该方法,该子类的对象将不知道该做什么
防止这种情况发生的唯一方法是,如果子类也被声明为抽象的,那么它首先就不能被实例化。一个明确实现的类也可以定义它自己的方法,如果在派生类中没有实现抽象类的所有方法,那么将这个派生类也标记为抽象类
但是在链的末尾,您必须创建一个具体的类来实现抽象子父类中未实现的所有方法。是的,实现类只需要实现抽象类中标记为抽象的方法。Q-1:-我应该实现抽象类中的所有方法吗 是的,您必须实现所有抽象方法。 Q-2:-实现类可以有自己的方法吗 是的,您可以声明自己更具体的方法。
是的,当您实现一个接口时,您必须实现它的所有方法。这就是定义接口的目的。是的,您可以在实现接口的类中拥有自己的方法。您不必实现抽象类的所有方法。但是您必须实现它的所有抽象方法 事实上,扩展抽象类与扩展普通类没有区别。这与实现接口不同。因为您正在扩展,所以您正在创建一个子类,因此您可以根据需要添加任意多的方法和属性。当您扩展接口或抽象类时,您正在创建与该超类的某种契约。你在合同中说:
public interface I{
public void m();
}
public abstract class A1 implements I{
//No need to implement m() here - since this is abstract
}
public class B1 extends A1{
public void m(){
//This is required, since A1 did not implement m().
}
}
public abstract class A11 extends A1{
//Again No need to implement m() here - since this is abstract
public abstract void newA11Method()
}
public class B11 extends A11{
//This class needs to implement m() and newA11Method()
}
我将在我的超类中实现所有未实现的方法
如果你不这样做,实现所有未实现的方法,那么你就是在破坏你的合同。一种不违反合同的方法是将子类抽象化,同时也是一种表达方式
我还没有实现合同中的所有类,我将
让我的子类实现它们
对于您的类bar,现在必须实现b或使bar成为抽象类,否则您将无法履行与MyAbstractClass的契约
基本思想是:
接口:我的方法都没有实现。子类必须实现我的所有方法才能实现我。注意:我相信Java 8中添加了默认接口,这可能会稍微改变这一点
例如:
public interface myInterface
{
//My subclasses must implement this to fulfill their contract with me
public void methodA();
//My subclasses must implement this to fulfill their contract with me
public void methodB();
}
public abstract class myAbstractClass
{
//My subclasses must implement this to fulfill their contract with me
public abstract void methodC();
public void helloWorld()
{
System.out.println("Hello World");
}
}
public abstract class myAbstractClass2 implement myInterface
{
@Override
public void methodA()
{
// this fulfills part of the contract with myInterface.
// my subclasses will not need to implement this unless they want to override
// my implementation.
}
//My subclasses must implement this to fulfill their contract with me
public abstract void methodD();
}
摘要:我可以实现我的一些方法,但我也会将方法保留为抽象的,这样我的子类就必须实现,因为它们可以实现那些类来更好地满足它们的需求
例如:
public interface myInterface
{
//My subclasses must implement this to fulfill their contract with me
public void methodA();
//My subclasses must implement this to fulfill their contract with me
public void methodB();
}
public abstract class myAbstractClass
{
//My subclasses must implement this to fulfill their contract with me
public abstract void methodC();
public void helloWorld()
{
System.out.println("Hello World");
}
}
public abstract class myAbstractClass2 implement myInterface
{
@Override
public void methodA()
{
// this fulfills part of the contract with myInterface.
// my subclasses will not need to implement this unless they want to override
// my implementation.
}
//My subclasses must implement this to fulfill their contract with me
public abstract void methodD();
}
抽象类还可以扩展接口,以便实现一些方法。但是它们也可以保留一些未实现的方法,以便子类可以实现它们。如果未实现接口方法,则不需要将其声明为抽象的,因为它已经存在于合同中
例如:
public interface myInterface
{
//My subclasses must implement this to fulfill their contract with me
public void methodA();
//My subclasses must implement this to fulfill their contract with me
public void methodB();
}
public abstract class myAbstractClass
{
//My subclasses must implement this to fulfill their contract with me
public abstract void methodC();
public void helloWorld()
{
System.out.println("Hello World");
}
}
public abstract class myAbstractClass2 implement myInterface
{
@Override
public void methodA()
{
// this fulfills part of the contract with myInterface.
// my subclasses will not need to implement this unless they want to override
// my implementation.
}
//My subclasses must implement this to fulfill their contract with me
public abstract void methodD();
}
所以本质上,抽象类与它的超类没有严格的约定,因为它可以将它的方法委托给它的子类
Regular类:我用Regular来表示非接口和非抽象类。我必须从我所有的超类中实现所有未实现的方法。这些类有一个有约束力的契约
例如:
public class mySubClass extends myAbstractClass2
{
@Override
public void methodB()
{
//must be implemented to fulfill contract with myInterface
}
@Override
public void methodD()
{
//must be implemented to fulfill contract with myAbstractClass2
}
public void myMethod()
{
//This is a method specifically for mySubClass.
}
}
是的,当您扩展抽象时,您应该为中显示的所有内容提供实现。否则,您应该将其实现类设置为abtract类 必须实现抽象类中的所有抽象方法。但是您可以直接使用实现的具体方法 有关更多信息,请参阅:
是的,您必须实现抽象类中存在的所有方法。因为抽象类的目的纯粹是为函数创建一个模板,这些函数的实现由实现它们的类决定。因此,如果不实现它们,那么就是打破了抽象类的概念
为了回答您的第二个问题,您可以创建任意数量的自己的方法,而不考虑您要扩展的抽象类