定义没有任何抽象方法的抽象类


Answers:


168

当然。

声明一个类抽象仅意味着您不允许自己实例化它。

声明一个方法抽象意味着子类必须为该方法提供一个实现。

这两个是单独的概念,尽管很明显,您不能在非抽象类中使用抽象方法。您甚至可以使用带有final方法的抽象类,但绝不能相反。


14

是的,您可以做到。您为什么不尝试这样做呢?


6
这不仅是OP。查看问题得到的所有支持!
Marc W

54
@ karim79不需要高高的马匹和所有倒酱的东西。尝试它并不能完全揭示为什么允许它,尽管可能会问到。
biziclop 2011年

7
@bizclop-亲自尝试可能会产生一个更有成效的问题。没有高马。这很简单。他的问题是“我能”而不是“为什么这么做...”。
karim79 2011年

8
如果可以通过简单的“是”或“否”来回答问题,则询问者应考虑改用,使用Google或尝试一下。
泰勒对待

3
@ karim79是的,这个问题本来可以更好地表达,但我想向前迈出一步并不需要花费太多的精力。
biziclop 2011年

8

是的你可以。java中使用的抽象类表示您无法创建该类的对象。子类必须使用抽象方法来提供该方法的实现。

因此,您可以轻松定义一个抽象类,而无需任何抽象方法。

例如:

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

这可以。


6

是的,您可以在没有任何抽象方法的情况下创建抽象类,而没有抽象方法的抽象类的最佳示例是HttpServlet
抽象方法是一种没有主体的方法,如果您在类中声明了至少一个方法,则该类必须声明为如果声明了抽象类,则将其抽象为强制性的BUT,但在类中声明抽象方法为非强制性的。

您不能创建抽象类的对象,这意味着它不能被实例化。


4

是的,您可以声明仅使用已经具有实现的方法无法实例化的类。如果您想在将来添加抽象方法,或者即使该类没有抽象属性,也不想直接实例化该类,这将很有用。


问题不在于空的抽象类,而在于没有抽象方法的抽象类。据我所知,没有充分的理由使用完全空的抽象类。
biziclop 2011年

1
答案固定。如果您有充分的理由以后要添加抽象方法,而不必处理重构任何其他父类,则使用空的抽象类可能很有用。
Gordon Gustafson

1
在层次结构的中间,如果该类的派生与父对象的其他派生具有不同的合同义务,则完全空的(继承规范除外)抽象类可能是有意义的。
2013年

3

是的,我们可以声明一个没有任何抽象方法的抽象类。将类声明为抽象的目的不是实例化该类。

所以两种情况

1)使用抽象方法的抽象类。

这些类型的类,我们必须从该抽象类继承一个类,并且必须重写该类中的抽象方法,例如:GenricServlet类

2)没有抽象方法的抽象类。

在这些类型的类中,我们必须从该抽象类继承一个类,例如:HttpServlet类的目的是,尽管如果您不在子类中实现逻辑,则可以获取父逻辑

请检查HttpServlet源代码


2

是的,我们可以有一个没有抽象方法的抽象类,因为它们都是独立的概念。声明一个类抽象意味着它不能自己实例化,只能被子类化。声明方法摘要意味着将在子类中定义Method。


为什么我不希望类不能实例化?有什么很好的理由吗?
karlihnos

2

是的,您可以定义一个没有抽象方法的抽象类。但是,如果内部没有方法,则最好使用接口


4
占用最少30个字符的限制的好主意。
Marc W

1
如果没有抽象方法,那么如何使用接口?接口默认情况下具有所有抽象的方法。
Usman Rana

1

是的,你可以这样做。

声明类抽象意味着该类将不会被任何其他类实例化。

并且在其中至少应有一个抽象方法,如果您没有声明方法可以的话,则可以在该类中声明抽象方法。

例:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

这肯定可以工作。


1

是的你可以。有时您可能会被问到这个问题,这样做的目的是什么?答案是:有时我们必须限制类自己实例化。在这种情况下,我们希望用户扩展Abstract类并实例化子类。


1

您可以,在我看来,您的问题更多。从一开始,我就说没有一个一成不变的答案。针对您当前的情况做正确的事。

对我而言,继承意味着“是”关系。想象一下狗类,可以通过更专业的子类型(阿尔萨斯犬,贵宾犬等)进行扩展。在这种情况下,将狗类抽象化可能是正确的做法,因为子类型是狗。现在让我们想象一下,狗需要项圈。在这种情况下,继承是没有意义的:在狗和项圈之间建立“是”关系是无稽之谈。这绝对是一种“ has-a”关系,领子是协作对象。使项圈变得抽象以使狗可以拥有一只是没有意义的。

我经常发现没有抽象方法的抽象类实际上在表达一种“ has-a”关系。在这些情况下,我通常会发现无需使用继承就可以更好地分解代码。我还发现,没有抽象方法的抽象类通常是代码异味,至少应导致在代码审查中提出问题。

同样,这完全是主观的。在某些情况下,没有抽象方法的抽象类很有意义,这完全取决于解释和证明。为您所做的任何事情做出最佳决定。


1

实际上,如果抽象类没有任何抽象方法,那是没有意义的。抽象类就像父亲。这个父亲有一些特性和行为,当您小的时候想成为父亲的孩子时,父亲说这个孩子(您)必须是这种方式,这就是我们的MOTO,如果您不想做,您会不是我的孩子。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.