# Java 抽象类能不能实例化

**URL:** <https://www.isharkfly.com/t/java/14751>\
**Category:** 程序语言\
**Tags:** java\
**Created:** [September 9, 2023, 3:36am UTC](https://www.isharkfly.com/t/java/14751 "2023-09-09T03:36:33Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [September 9, 2023, 3:36am UTC](https://www.isharkfly.com/t/java/14751/1 "2023-09-09T03:36:33Z")

</div>

短回答就是： **不能**

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/7/74c5fc37c316d986085585b68ae544338c76e701.png)  
这里有 2 个概念，什么是抽象类和什么是实例化。

## 实例化

实例化简单来说就是为 Java 中使用的对象分配存储空间。

## 抽象类

从代码上来说，抽象类就是一个用 `abstract` 关键字来修饰的类。

这个类除了不能被实例化以外，其他都能做。

在面向对象的概念中，所有的对象都是通过类来描绘的，但是反过来，并不是所有的类都是用来描绘对象的，如果一个类中没有包含足够的信息来描绘一个具体的对象，这样的类就是抽象类。

抽象类除了不能实例化对象之外，类的其它功能依然存在，成员变量、成员方法和构造方法的访问方式和普通类一样。

```auto
// 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();
	}
}

```

上面的代码运行时候将会出现错误：

```auto
prog.java:17: error: ClassOne is abstract; cannot be instantiated
        ClassOne obj = new ClassOne();
                       ^
1 error

```

因为你尝试实例化这个抽象类。

## 为什么不能实例化抽象类

很多人在这里都有点懵，为什么我就不能实例化抽象类。

正如我们上面说的，实例化就是为类分配需要的内容空间，以便于类去进行计算。

因为抽象类没有足够的信息， JVM 没有办法知道抽象类到底给他们分配什么。比如说没有具体的成员变量和成员方法。

你说，我们可以这样呀：

```auto
 HashMap hashMap = new HashMap();
 AbstractMap abstractMap = new TreeMap();

```

这样是对 abstractMap 进行实例化吗？这显然不是。

这是你用抽象类的名字定义了一个 Map，但是这个 Map 是用 TreeMap 实例化的。

最后你内存里面得到的是一个 TreeMap 而不是 abstractMap。

 ![2023-09-09_07-31-37](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/b/b533c8c43f5c78d1f995413eac8dccda632a4fe0.png)
