可以扩展抽象类,因此可以从扩展抽象类的子类调用/使用抽象类的所有类成员(变量+方法)。 那么,为什么JAVA禁止创建抽象类的对象?
答案 0 :(得分:1)
Java不允许直接实例化抽象类,因为没有意义......如果你有:
abstract class Person {
abstract String getName();
int getAge() {
return 72;
}
}
允许这样称呼它
public static void main(String... args) {
System.out.println(new Person().getName());
}
那么事情是没有意义的。
但是,由于抽象类可以已经实现了方法,因此您的注释:
所以抽象类的所有类成员(变量+方法)都可以从扩展抽象类的子类中调用/使用。
简单地说你错过了 来自子类 的部分,子类被认为是具体的。换句话说,仍然可以使用那些方法和变量,但它们必须在具体类型上使用(这将是在上面的示例中为getName
提供实现的类型,以使事情再次有意义)
答案 1 :(得分:1)
使类抽象是开发人员指定某个类可能无法实例化的工具。
这可能有很多原因。
其中一个典型用法是template method pattern,您在抽象基类中声明使用抽象方法,子类的具体实现实现声明的抽象方法。
或者您可能有一个复杂的类层次结构,其中超类本质上不具体。例如,地理标记语言3.2.1中的PolygonType
层次结构:
PolygonType extends
AbstractSurfaceType extends
AbstractGeometricPrimitiveType extends
AbstractGeometryType extends
AbstractGMLType
设计师可能已经在这里要求只有像PolygonType
这样的具体类应该是可实例化的,而不是像AbstractGeometryType
这样的更高级别的抽象。让所有Abstract*
abstract
实际上对使用此架构或库的开发人员强制执行此想法。
答案 2 :(得分:0)
有理由创建一个抽象类。假设您有一个工厂类Car
来创建不同车型的汽车实例。所以每辆车都会有一些共同的属性,比如车轮数量,颜色,速度计等。但是每辆车在创建其中一个之前必须具备所有这些属性。但是汽车可以是不同类型的汽车,例如卡车(重型车辆),迷你厢式车(中型)和小型家用汽车等。但是每辆汽车都有其特定属性并不常见。例如引擎。因此,作为汽车架构的设计者,您将把汽车的所有常见属性放在一个公共类中,但是这样一个类的实例化没有任何意义。因此,您将使其成为抽象的,并且您将无法将类继承到特定的车辆类型,如下所示: -
public abstract class Utility{
}
public class Truck extends Utility{
}
public class MiniVan extends Utility{
}
答案 3 :(得分:0)
那么,为什么JAVA禁止创建抽象类的对象?
在抽象类具有抽象方法的情况下,限制的原因是抽象方法不起作用。例如,鉴于此:
# Timer
import time
import winsound
print " TIMER"
#Ask for Duration
Dur1 = input("How many hours? : ")
Dur2 = input("How many minutes?: ")
Dur3 = input("How many seconds?: ")
TDur = Dur1 * 60 * 60 + Dur2 * 60 + Dur3
# Ask to Begin
start = raw_input("Would you like to begin Timing? (y/n): ")
if start == "y":
timeLoop = True
# Variables to keep track and display
CSec = 0
Sec = 0
Min = 0
Hour = 0
# Begin Process
timeLoop = start
while timeLoop:
CSec += 1
Sec += 1
print(str(Hour) + " Hours " + str(Min) + " Mins " + str(Sec) + " Sec ")
time.sleep(1)
if Sec == 60:
Sec = 0
Min += 1
Hour = 0
print(str(Min) + " Minute(s)")
if Min == 60:
Sec = 0
Min = 0
Hour += 1
print(str(Hour) + " Hour(s)")
elif CSec == TDur:
timeLoop = False
print("time\'s up")
input("")
while 1 == 1:
frequency = 1900 # Set Frequency To 2500 Hertz
duration = 1000 # Set Duration To 1000 ms == 1 second
winsound.Beep(frequency, duration)
这句话应该做什么?
public abstract class Animal {
public abstract int getLegCount();
}
允许您创建无法正常工作的实例将是一件坏事。
在没有抽象方法的情况下,限制是为了保持一致性。在允许您实例化一些抽象方法时,它不会为任何真正的目的服务。在这种情况下,如果您想要来实例化该类,则只需从类声明中删除System.out.println("An animal has " + (new Animal()).getLegCount() + " legs");
关键字。
答案 4 :(得分:0)
抽象类旨在提供由其所有直接和间接子类共享的部分实现。通常,抽象类将包含至少一个抽象方法。如果是这样,那么这个方法必须由抽象类的每个具体子类声明。如果没有每个抽象方法的实现,抽象类就无法完全实现。
考虑以下示例。
public abstract class Shape {
public abstract void draw();
}
public class Circle extends Shape {
@Override
public void draw() {
// draw a circle
}
}
public class Square extends Shape {
@Override
public void draw() {
// draw a square
}
}
允许实例化Shape对象是没有意义的,因为如果它不知道它是什么类型的形状,它就不知道如何绘制自己。 Shape类没有为实例化提供足够的信息。
抽象类的目的是重用代码并允许通过抽象超类引用以多态方式处理不同的子类类型。