A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刁镜元 于 2013-8-26 08:25 编辑

今天学习了抽象类的,当讲到到抽象类有构造方法,但是不能创建对象时,心想因为定义抽象类的目的都是让子类extends抽象类实现抽象方法,没有实例方法,创建对象没有意义也是在情理之中,当时乍这么想也就过去了,可是,课后仔细一想,似乎不太对劲。假使一个类extends了一个抽象类,并且实现了所有的抽象方法,那么这个子类就可以创建对象,毫无问题,但是,我们知道,当一个子类创建对象时JVM会向上调用父类的构造器,并在堆内存中创建父类的对象,这样矛盾就来了——一方面,抽象类不能创建对象,另一方面,子类又可以向上调用父类的构造方法创建父类(抽象类)的对象完成子类的初始化。太纠结了。。。。。。
大神们不要潜水了,来解答小弟的疑惑吧!
深夜发帖,不易啊

点评

金币可以兑换马粮,进而兑换商品  发表于 2013-8-25 07:30

评分

参与人数 2技术分 +2 收起 理由
张智文 + 1 新人 鼓励鼓励你~~
EYE_SEE_YOU + 1

查看全部评分

6 个回复

倒序浏览
这个问题吧。其实因该说很多人都纠结过吧。
也没有一个特别明确的答案。
我说说我的看法吧。
抽象类之所以有构造方法,是因为抽象类即使规定不能被直接实例化,但是为了能让其子类能够正常实例化。
构造函数还是需要的。并且,构造函数的作用并不仅限于对象实例化,还可以作用于属性的初始化。
抽象类的构造函数也可以充当这样的一个作用。
不过从网上看过一些文章说,抽象类并不是不应该有构造方法,而是不应该有公开的构造方法。
就像上面说的,抽象类的构造方法的作用都是作用于子类的。那么抽象类的构造方法也因该是protected的才对。。。。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报

回帖奖励 +10

  1.         public enum TrafficLamp{
  2.                 RED(30){
  3.                         public TrafficLamp nextLamp() {
  4.                                 return GREEN;
  5.                         }
  6.                 },
  7.                 GREEN(45){
  8.                         public TrafficLamp nextLamp() {
  9.                                 return YELLON;
  10.                         }
  11.                 },
  12.                 YELLON(5){
  13.                         public TrafficLamp nextLamp() {
  14.                                 return RED;
  15.                         }
  16.                 };
  17.                 public abstract TrafficLamp nextLamp();
  18.                
  19.                 private int time;
  20.                
  21.                 //构造方法
  22.                 private TrafficLamp(int time){
  23.                         this.time = time;
  24.                 }       
  25.         }
复制代码
这是枚举中的一段例子~看看能明白不?

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 王广亚 于 2013-8-25 10:10 编辑

“当一个子类创建对象时JVM会向上调用父类的构造器,并在堆内存中创建父类的对象,”我在你的问题中发现了这句话。不知道是我在看视频中漏了这个知识点还是子类创建对象时只是调用父类的构造函数,并没有jvm在堆内存中创建父类的对象呢!?如果是子类创建对象时只是调用父类的构造函数,并没有jvm在堆内存中创建父类的对象的话,我想你提问的问题就不成立。
回复 使用道具 举报
如果您的问题已经解决
请更改分类未解决为已解决
保持队形,谢谢合作

详情参考 如何修改分类

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1 给力。。

查看全部评分

回复 使用道具 举报
抽象类可以没有抽象方法,也可以全部是抽象方法,如果子类继承的父类是抽象类,子类必须重写父类里所有的(是所有的)抽象方法,才能被实例化,也就是创建对象,要不然子类也将是个抽象类,抽象类不能被实例化
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马