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类

必须实现抽象类中的所有抽象方法。但是您可以直接使用实现的具体方法

有关更多信息,请参阅:

是的,您必须实现抽象类中存在的所有方法。因为抽象类的目的纯粹是为函数创建一个模板,这些函数的实现由实现它们的类决定。因此,如果不实现它们,那么就是打破了抽象类的概念


为了回答您的第二个问题,您可以创建任意数量的自己的方法,而不考虑您要扩展的抽象类