【发布时间】:2011-06-16 05:59:26
【问题描述】:
我可以在不添加抽象方法的情况下定义抽象类吗?
【问题讨论】:
-
装饰器模式中有一个很好的例子,见here。
WindowDecorator和CoffeeDecorator都是abstract类,但都不包含abstract方法。
标签: java class inheritance methods abstract
我可以在不添加抽象方法的情况下定义抽象类吗?
【问题讨论】:
WindowDecorator 和 CoffeeDecorator 都是 abstract 类,但都不包含 abstract 方法。
标签: java class inheritance methods abstract
其实抽象类没有抽象方法是没有意义的。抽象类就像一个父亲。这个父亲有一些属性和行为,当你作为孩子想做父亲的孩子时,父亲说孩子(你)必须这样,是我们的MOTO,如果你不想做,你不是我的孩子。
【讨论】:
你可以,我心中的问题是你应该更多。从一开始,我就会说没有硬性和快速的答案。为您当前的情况做正确的事。
对我来说,继承意味着“is-a”关系。想象一个狗类,它可以通过更专业的子类型(Alsatian、Poodle 等)进行扩展。在这种情况下,将狗类抽象化可能是正确的做法,因为子类型是狗。现在让我们假设狗需要项圈。在这种情况下,继承没有意义:在狗和项圈之间建立“is-a”关系是无稽之谈。这绝对是一种“有”的关系,衣领是一个合作对象。将项圈抽象为狗可以拥有一个是没有意义的。
我经常发现没有抽象方法的抽象类实际上是在表达一种“有”的关系。在这些情况下,我通常发现不使用继承可以更好地分解代码。我还发现没有抽象方法的抽象类通常是代码异味,至少应该会导致代码审查中提出问题。
同样,这完全是主观的。在某些情况下,没有抽象方法的抽象类是有意义的,这完全取决于解释和证明。为您正在从事的工作做出最佳决定。
【讨论】:
当然。
声明一个类抽象只意味着你不允许它自己实例化。
声明方法抽象意味着子类必须提供该方法的实现。
这两个是独立的概念,但显然你不能在非抽象类中拥有抽象方法。您甚至可以使用 final 方法创建抽象类,但不能反过来。
【讨论】:
是的,我们可以声明一个没有任何抽象方法的抽象类。将类声明为抽象的目的不是实例化该类。
那么两种情况
1) 带有抽象方法的抽象类。
这些类型的类,我们必须从这个抽象类继承一个类,并且必须覆盖我们类中的抽象方法, 例如:GenricServlet 类
2) 没有抽象方法的抽象类。
这些类型的类,我们必须从这个抽象类继承一个类, 例如:HttpServlet 类 这样做的目的是,如果你不在子类中实现你的逻辑,你可以获得父逻辑
【讨论】:
是的,你可以定义一个没有抽象方法的抽象类。但是,如果内部没有方法,则最好使用接口
【讨论】:
是的,你可以。有时您可能会被问到这个问题,这样做的目的是什么? 答案是:有时我们必须限制类自己实例化。在这种情况下,我们希望用户扩展我们的抽象类并实例化子类
【讨论】:
是的,你可以创建没有任何抽象方法的抽象类,没有抽象方法的抽象类最好的例子是 HttpServlet
抽象方法是一种没有主体的方法,如果您在类中声明了至少一个方法,则该类必须声明为抽象类,但如果您声明了抽象类,则它不是强制在类中声明抽象方法。
你不能创建抽象类的对象,这意味着它不能被实例化。
【讨论】:
是的,你可以这样做。
声明类抽象意味着该类不会被任何其他类实例化。
其中应该至少有一个抽象方法,其含义是,如果您没有声明方法,则可以在该类中声明抽象方法。
示例:
public abstract class abs {
protected int cx = 0, cy = 0;
public void p() {
System.out.print("hello");
}
}
这肯定会奏效。
【讨论】:
是的,我们可以有一个没有抽象方法的抽象类,因为它们都是独立的概念。声明一个类抽象意味着它不能被自己实例化,只能被子类化。声明方法抽象意味着 Method 将在子类中定义。
【讨论】:
是的,你可以。 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);
}
}
这很好。
【讨论】:
是的,您可以声明一个您不能仅使用已经实现的方法自行实例化的类。如果您想在将来添加抽象方法,或者如果您不希望直接实例化该类(即使它没有抽象属性),这将很有用。
【讨论】:
是的,你可以做到。你为什么不尝试这样做呢?
【讨论】: