【问题标题】:Overriding of Abstract Method in Java [closed]在 Java 中重写抽象方法 [关闭]
【发布时间】:2013-06-30 19:24:36
【问题描述】:

抽象方法的属性是它没有主体,所以当具体类扩展抽象类时,它必须实现那个抽象方法。

所以我的问题是,当抽象方法没有主体时,如何覆盖它?它不是被实现了,而不是被覆盖了吗?

【问题讨论】:

标签: java inheritance abstract-class


【解决方案1】:

带有抽象方法的抽象类。

该方法也标有abstract,并且没有正文。

public abstract class A {
    public abstract void method();
}

扩展抽象类A 的类B 中的具体化。此外,该方法丢失了abstract 关键字并获取了正文。

public class B extends A {
    @Override
    public void method() {
        System.out.println("Hello");
    }
}

【讨论】:

  • 这里的非抽象方法覆盖了抽象方法,所以我对此有点困惑。
  • 是的,abstract 是一种“标志”,表明此方法必须在未来的某些方法中被覆盖。重写的方法必须具有相同的方法签名,但会丢失 abstract 关键字。
【解决方案2】:
public abstract class BaseClass {
    public abstract void doSomething();
}

public class ConcreteClass extends BaseClass {
    @Override
    public void doSomething() {
        System.out.println("Hi!");
    }
}

public class AnotherConcreteClass extends BaseClass {
    @Override
    public void doSomething() {
        System.out.println("Hello!");
    }
}

所执行的doSomething 方法的实现将取决于您正在调用doSomething 的对象的运行时类型。

【讨论】:

    【解决方案3】:

    只需为方法提供一个实现,就可以为它提供一个主体。

    public abstract class Base {
       public abstract void someMethod(); // no implementation here
    }
    
    public class Sub extends Base {
       @Override
       public void someMethod() {
        //It is Overridden
       }
    }
    

    【讨论】:

      【解决方案4】:
      public abstract class A {  
          public abstract String getValue();
      }
      
      public class B extends A {
      
          @Override
          public String getValue(){
              return "I'm Overriden";
          }
      }
      

      在任何其他课程中都一样。

      【讨论】:

        【解决方案5】:

        当您在子类中实现超类方法时,它将被覆盖。所以即使超类的方法是抽象的,如果你在子类中实现它,它也会覆盖它。

        所以,

        public class SuperClass{
           public abstract void someMethod();
        }
        
         public class SubClass{
           public void someMethod(){
        
                   System.out.println("subclass method");
        
           }
         }
        

        【讨论】:

          【解决方案6】:

          Foo.java

          public abstract class Foo {
            public abstract void doStuff();
          }
          

          Bar.java

          public class Bar extends Foo {
              @Override
              public void doStuff() {
                  // doStuff
              }
          }
          

          【讨论】:

            【解决方案7】:

            通过提供实现,可以像覆盖其他普通方法一样覆盖抽象方法。

            【讨论】:

              【解决方案8】:

              这与任何其他方法覆盖相同:

              public abstract class AbstractClass {
                  public abstract void abstractMethod();
              }
              
              ...
              
              public class ConcreteClass {
              
                  @Override
                  public void abstractMethod() {
                      ....
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 2013-01-02
                • 1970-01-01
                • 1970-01-01
                • 2021-03-13
                • 1970-01-01
                • 2014-12-14
                • 2021-12-16
                • 2013-10-24
                • 2014-05-30
                相关资源
                最近更新 更多