Java 直接使用抽象类。这是要避免的吗?

Java 直接使用抽象类。这是要避免的吗?,java,abstract-class,Java,Abstract Class,我经常读到抽象类只是用来扩展它们。我有一个直接使用抽象类的项目。 例如,负责从网络摄像头流中捕获图片的类: import org.opencv.core.Mat; import org.opencv.highgui.VideoCapture; public abstract class Photographer { //create camera object static VideoCapture camera; static Mat image; publi

我经常读到抽象类只是用来扩展它们。我有一个直接使用抽象类的项目。 例如,负责从网络摄像头流中捕获图片的类:

import org.opencv.core.Mat;
import org.opencv.highgui.VideoCapture;

public abstract class Photographer {
    //create camera object
    static VideoCapture camera;
    static Mat image;
    public Photographer(){
        camera = new VideoCapture();
        image = new Mat();
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //capture image
    public final static Mat capture() {

        camera.open(1);
        camera.read(image);
        camera.release();
        return image;
    }

}
我的想法是,因为这个类只有一个函数,不需要任何参数,我可以将它定义为抽象的,所以我不必为它创建一个实例,只是为了得到一张图片

这是使用抽象概念的错误想法吗?我怎样才能以正确的方式实现它

谢谢你的帮助


derb

如果以下任何语句适用于您的情况,请考虑使用抽象类:

You want to share code among several closely related classes.
You expect that classes that extend your abstract class have many common methods or fields, or require access modifiers other than public (such as protected and private).
You want to declare non-static or non-final fields. This enables you to define methods that can access and modify the state of the object to which they belong.

有关相同的详细信息,您可以检查此

如果以下任何语句适用于您的情况,请考虑使用抽象类:

You want to share code among several closely related classes.
You expect that classes that extend your abstract class have many common methods or fields, or require access modifiers other than public (such as protected and private).
You want to declare non-static or non-final fields. This enables you to define methods that can access and modify the state of the object to which they belong.

对于相同的细节,您可以检查这个

抽象类的思想是表示一些具有更详细“版本”的抽象。例如,“汽车”、“车辆”、“机械装置”可以是大众高尔夫的抽象概念

我的想法是,因为这个类只有一个函数,不需要任何参数,所以我可以将它定义为抽象类


我认为这不是一个正确的抽象类用法,因为我在上面写过这样的原因——这个类并不代表任何东西的抽象,也不打算扩展。

抽象类的概念是代表一些具有更详细“版本”的抽象。例如,“汽车”、“车辆”、“机械装置”可以是大众高尔夫的抽象概念

我的想法是,因为这个类只有一个函数,不需要任何参数,所以我可以将它定义为抽象类

我认为这不是一个正确的抽象类用法,因为我在上面写过一些原因——这个类不代表任何东西的抽象,也不用于扩展。

您正在以静态方式使用capture()方法。静态和抽象是完全不相关的概念

如果您真的想在这种情况下处理抽象,我会在抽象类中使用类似的内容

public Mat capture() {

    camera.open(1);
    camera.read(image);
    camera.release();

    implemenntCapature();

    return image;

}

public abstract implemenntCapture();
如果您有Wedding摄影师或WarPhotographer,则他们可以将自己的行为添加到他们的工具Capture()

例如:

您正在以静态方式使用capture()方法。静态和抽象是完全不相关的概念

如果您真的想在这种情况下处理抽象,我会在抽象类中使用类似的内容

public Mat capture() {

    camera.open(1);
    camera.read(image);
    camera.release();

    implemenntCapature();

    return image;

}

public abstract implemenntCapture();
如果您有Wedding摄影师或WarPhotographer,则他们可以将自己的行为添加到他们的工具Capture()

例如:


我看不出您在哪里实例化了
摄影师
,所以您没有“使用”那个抽象类。事实上,您对静态变量和函数的滥用表明您还没有(尚未)掌握Java的OO概念。当实例化一个类没有意义,并且它具有其他人可能继承的
公共功能时,它应该是
抽象的
。例如,如果您有一个抽象类
Person
和另外两个类
Man
Woman
继承自它,那么允许实例化
Person
是没有意义的。因此,在这种情况下,坚持使用
Person
作为抽象类是更好的设计决策。因此,在您的情况下,您仍然需要让另一个类继承自
摄影师
,因为您无法实例化,但它在这方面有什么帮助呢?我看不出您在哪里实例化
摄影师
,所以您不“使用”那个抽象类。事实上,您对静态变量和函数的滥用表明您还没有(尚未)掌握Java的OO概念。当实例化一个类没有意义,并且它具有其他人可能继承的
公共功能时,它应该是
抽象的
。例如,如果您有一个抽象类
Person
和另外两个类
Man
Woman
继承自它,那么允许实例化
Person
是没有意义的。因此,在这种情况下,坚持使用
Person
作为抽象类是更好的设计决策。因此,在您的情况下,您仍然需要让另一个类继承自
摄影师
,因为您无法实例化,但它在这方面有什么帮助呢?谢谢您的链接。下面是一段:类成员抽象类可能有静态字段和静态方法。您可以将这些静态成员与类引用(例如AbstractClass.staticMethod())一起使用,就像与任何其他类一起使用一样。由此我了解到,我可以像现在这样使用我发布的类。是吗?@HerrDerb哦,是的,你可以这样做,除了你的代码在你调用它时会抛出一个NullPointerException,因为
camera
是空的,因为你在使用之前没有初始化它…@HerrDerb,问题是抽象类被认为适用于其他情况,即使你可以这样做(正在修复您的初始化代码),使类
抽象
你只会让其他开发人员感到困惑,你什么也得不到。感谢你的链接。下面是一段:类成员抽象类可能有静态字段和静态方法。你可以将这些静态成员与类一起使用引用(例如AbstractClass.staticMethod())就像你对其他任何类一样。从这一点我了解到,我可以像现在一样使用我发布的类。是吗?@HerrDerb哦,是的,你可以这样做,只是你的代码在调用它时会抛出一个NullPointerException,因为
camera
为null因为你在使用之前没有初始化它…@HerrDerb,