Java 抽象类能不能实例化
短回答就是:不能
这里有 2 个概念,什么是抽象类和什么是实例化。
实例化
实例化简单来说就是为 Java 中使用的对象分配存储空间。
抽象类
从代码上来说,抽象类就是一个用 abstract
关键字来修饰的类。
这个类除了不能被实例化以外,其他都能做。
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
// Java program to demonstrate abstract class
// cannot have instance
public abstract class ClassOne {
public void printSomething()
{
System.out.println("Hello in abstract class");
}
}
class CreateClassOne {
public static void main(String[] args)
{
// instance of abstract
// class "ClassOne"
ClassOne obj = new ClassOne();
}
}
上面的代码运行时候将会出现错误:
prog.java:17: error: ClassOne is abstract; cannot be instantiated
ClassOne obj = new ClassOne();
^
1 error
因为你尝试实例化这个抽象类。
为什么不能实例化抽象类
很多人在这里都有点懵,为什么我就不能实例化抽象类。
正如我们上面说的,实例化就是为类分配需要的内容空间,以便于类去进行计算。
因为抽象类没有足够的信息, JVM 没有办法知道抽象类到底给他们分配什么。比如说没有具体的成员变量和成员方法。
你说,我们可以这样呀:
HashMap hashMap = new HashMap();
AbstractMap abstractMap = new TreeMap();
这样是对 abstractMap 进行实例化吗?这显然不是。
这是你用抽象类的名字定义了一个 Map,但是这个 Map 是用 TreeMap 实例化的。
最后你内存里面得到的是一个 TreeMap 而不是 abstractMap。