? 之前上课老师有问到过:“为什么抽象类不能被实例化?”
? 我也看了很多大佬们的帖子,都写得很好很棒!但是有一些说法我个人可能觉得有点问题: ? 比如:第一个观点:" ? 什么是抽象类? ? ? ? ? ? ???????????????????????????抽象:就是不具体的意思。 ? ? ? ? ? ???????????????????????????类是对对象的具体描述,而抽象类不具体,没有方法体,(提供的成员不足以生成一个具体对象),那么就无法生成一个不具体的对象。就好比,你可以实例化一个苹果,但你不能实例化一个水果(这个现实中存在的实物)。" ? ? ? ? ? ??第二个观点:" ? ?在java中任何类和接口都可以定义静态变量,抽象类和普通类的区别在于,抽象类没有构造方法并且系统也不会自动生成它的构造方法,所以它不能实例化"。 ? ? ? ? ? ? 这里的解释和例子都没有毛病!但是第一个观点说”提供的成员不足以生成一个具体对象“,生成一个对象我的理解:“不就是通过关键字new来实现的吗?” 但是抽象类不是可以用匿名内部类实现的,就像这样
但是在这里要说明直接去new抽象类,肯定是不行的,编译器会提示”XXX类是抽象的; 无法实例化“的错误。
扩展:匿名内部类,就是不需要对class的定义,直接用new 后面跟一个基类(接口),然后类体里面实现方法即可,然后JVM会调用编译器生成的构造器来生成这个内部类对象,并且编译器会生成这个内部类的类结构。匿名内部类主要是语法简单,但是它不同于一般类通过class定义所以不方便阅读。匿名内部类还有一些限制:匿名内部类不仅可以扩展类(可以实现伪多重继承),也可以实现接口,但是不能两者同时进行,且只能实现一个接口!
然后第二个例子说:"抽象类没有构造方法并且系统也不会自动生成它的构造方法,所以它不能实例化" ? ? ? ?但是在抽象类中是可以有构造方法的,只是它不可以直接创建抽象类的实例对象。 ? ? ? ?因为实例化子类的时候,就会初始化父类,不管父类是不是抽象类都会调用父类的构造方法,初始化一个类,先初始化父类。?
? ? ? 上面的只是我个人看到之后的见解,有什么错误请大神们留言,继续学习!
?
?
?
|