最近朋友说了一个问题,关于抽象类能不能被实例化,然后我就突然解释不清楚为什么不可以,只是很粗浅地说了一句:类里的方法只定义没有声明,于是出现了这篇博客。
什么是抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
就比如水果,我们买水果的时候,不能直接告诉水果商贩我们就要买水果,因为我们需要告诉我们需要的是苹果还是香蕉这种具体的水果。在这个例子中,水果就相当于抽象类,苹果和香蕉就相当于具体的对象。
所以具体为什么抽象类不能被实例化呢
类里的方法只定义没有声明,形象一点说就是里面的方法只有一个名字,还不知道是用来做什么的怎么做的,所以实例化的时候都不知道要怎么实例化,所以怎么能实例化呢。
抽象类只在分配了在栈中的引用,没有分配堆中的内存。程序都有一个代码段,再内存中需要占据一定的内存,而抽象类没有具体的实现方法,无法具体的给它分配内存空间,所以为了安全,不JAVA不允许抽象类,接口直接实例化。
实际上抽象类更多提供的是一个框架的功能,参数比接口更详细些。
这样设计的理由和原因
考虑到某些类所具备的信息不足以实例化一个对象,才设计成抽象的。
因为这个类不能够被实例化,所以才设计成抽象的。比如水果的范围很广,当你需要对苹果和梨做新的,共同的修改或者添加的时候. 你现在就可以直接对他们的超类水果做就可以了。
程序都有一个代码段,再内存中需要占据一定的内存,而抽象类没有具体的实现方法,无法具体的给它分配内存空间,所以为了安全,不JAVA不允许抽象类,接口直接实例化。