如何以及何时使用抽象类

use*_*313 34 java oop abstract-class

这是我在Java中的测试程序.我想知道抽象类在这里有多重要,为什么我们为此使用抽象类.

它是强制性的还是最好的方法; 如果是这样的话?

class Shape1 {
    int i = 1;
    void draw() {
        System.out.println("this is shape:" + i);
    }
}

class Shape2 {
    int i = 4;
    void draw() {
        System.out.println("this is shape2:" + i);
    }
}


class Shape {
    public static void main(String args[]) {
        Shape1 s1 = new Shape1();
        s1.draw();

        Shape2 s2 = new Shape2();
        s2.draw();
    }
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*mas 20

您可以在此处使用抽象类或接口,以便创建提供void draw()方法的公共基类/接口,例如

abstract class Shape() {
  void draw();
}

class Circle extends Shape {
   void draw() { ... }
}

...

Shape s = new Circle();
s.draw();
Run Code Online (Sandbox Code Playgroud)

我通常使用一个界面.但是,您可以在以下情况下使用抽象类:

  1. 您需要/想要提供通用功能或类成员(例如int i您的成员).
  2. 您的抽象方法除了公共访问之外还有其他任何东西(这是接口允许的唯一访问类型),例如在我的示例中,void draw()将具有包可见性.


Nan*_*nne 5

抽象类与您的子类具有"is-a"类型关系.例如,你可以有一个抽象类Shape,它有任何形状的东西(比如绘制函数),然后是一个类SquareShape.每个方形都是一个形状,但并非所有形状都是方形.

在您的示例中,您有2个形状类型,以及具有2个这些形状类型的类.abstract我认为这不是你应该定义的关系.

你可能想对你的名字做一些事情,因为这是一个相当小的例子,很难看到文件的真正含义,以及它们应该如何工作.


Nic*_*uet 5

抽象类是一个类,它至少有一个未实现的方法,或关键字abstract。例如,抽象方法可能如下所示:

public abstract String myMethod(String input);

(请注意,该方法以分号结尾)。

一个类可能如下所示:

public abstract class MyClass {

    public abstract String myMethod(String input);

    public String anotherMethod(String input) {
        return intput + " additional text";
    }
}
Run Code Online (Sandbox Code Playgroud)

抽象类不能被实例化。抽象类需要一个子类来实现缺失的行为,以便它可以被实例化。

抽象类的主要目标是提供公共行为的共享实现——促进代码的重用。

在 Java 中,可以通过使用类的组合而不是从广泛定义的抽象类继承来实现相同的效果。这允许更多模块化、功能特定的类促进代码重用,从而提高可维护性。

我的建议是仅在绝对必要时才使用抽象类,尤其要避免将其用作充满各种功能的技巧包。

在 Scala 中,人们会使用特征,这是解决这个问题的一种优雅方式。但是,它确实需要大量关注才能正确完成。

编辑:从 Java 8 开始,接口中的默认方法是另一种添加常见行为的方法。


Roh*_*ngh 5

常见的东西+不常见的东西=抽象类

什么时候使用?

抽象类最适合有大量可重用代码的场景,您不想一次又一次地编写这些代码+每个类都有一些特定的内容。

例子?

仪式:

常见的东西:唱国歌、升国旗等
具体的东西: 印度国旗、印度国歌(印度)、中国国旗、中国国歌(中国)等。

在此输入图像描述

如何使用它?

1) 创建一个抽象类
2) 将所有内容放入公共方法中
3) 将所有内容放入子类特有的抽象方法中

示例代码在哪里?

基类:

public abstract class BaseCeremony{

    Flag natonalFlag;
    Anthem anthem;

    //**** Common Task ******//
    public void startCeremony(){
        configure();
        hoistFlag();
        singAnthem();
    }

    public void hoistFlag(){
        natonalFlag.hoist();                       
    }

    public void singAnthem(){
        anthem.anthem();                       
    }

    private void configure(){
        natonalFlag = provideFlag();
        anthem = provideAnthem();
    }

    //**** Differs in all part ******//
    public abstract Flag provideFlag();
    public abstract Anthem provideAnthem();

}
Run Code Online (Sandbox Code Playgroud)

在子类中,您只需提供不常见部分的实现。
儿童班

public class IndianCeremony extends BaseCeremony{

       public Flag provideFlag(){
            return new IndianFlag();
       }

       public Anthem provideAnthem(){
            return new IndianAnthem();
       }
}
Run Code Online (Sandbox Code Playgroud)

奖金

  • 抽象类是一个不完整的类,这就是您无法创建其对象的原因。
  • 抽象类应该至少有一个抽象方法才有资格成为抽象类
  • Android中抽象类的实现示例


sgo*_*les 2

抽象类,顾名思义就是抽象的。

抽象类不讲实现部分。事实上,我们扩展了抽象类以提供其抽象方法的实现。它也可以有非抽象方法。

检查这里:Java中抽象类的使用

编辑 :

示例代码:

abstract class Shapes {

 int i=1;
 abstract void draw(); 

 // Remember : Non-abstract methods are also allowed 
 void fill() {
     System.out.println("Non abstract method - fill");
 }
}

class Shape1 extends Shapes {

 int i=1;
 void draw(){
 System.out.println("This is Shape 1:"+i);
 }
}

class Shape2 extends Shapes {
    int i=2;
    void draw() {
        System.out.println("This is Shape 2:"+i);
    }
}

class Shape {

public static void main(String args[])
       {
        Shape1 s1 = new Shape1();
        s1.draw();                     // Prints This is Shape 1:1

        Shape2 s2 = new Shape2();
        s2.draw();                     // Prints This is Shape 2:2
       }
  }
Run Code Online (Sandbox Code Playgroud)

  • 这不是真的。一个抽象类可以有大量的实现。它也可以有抽象方法,需要扩展类来实现,但它当然可以有实现。接口没有实现,抽象类可以(是的,您可以拥有一个仅包含抽象方法的抽象类,但不一定是这样)。当然,你不能拥有抽象类的实例。 (2认同)