论坛首页 Java版 OO

java继承容易犯的错误

浏览 4315 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2008-04-12
引用
我觉得你这句话“抽象类,和类的差别就是,不可以有实体。“有待商榷。
你这句话要表达的意思应该是这样理解:abstract类不能创建对象,必须由其子类来创建对象。
我觉得这里应该是指用户不能创建abstract类的对象。但没有表明jvm不能初始化abstract类啊?
退一步,如果抽象类在jvm中没有被实例化,那么用户在子类中使用super调用抽象类的方法,怎么理解?


类的初始化和实例化是两码事。任何类在使用前都会经过装载-->连接-->初始化三个过程。
类的构造方法不能当成普通的方法,应当看成类似于static的方法
   
0 请登录后投票
时间:2008-04-12
foy 写道
引用
我觉得你这句话“抽象类,和类的差别就是,不可以有实体。“有待商榷。
你这句话要表达的意思应该是这样理解:abstract类不能创建对象,必须由其子类来创建对象。
我觉得这里应该是指用户不能创建abstract类的对象。但没有表明jvm不能初始化abstract类啊?
退一步,如果抽象类在jvm中没有被实例化,那么用户在子类中使用super调用抽象类的方法,怎么理解?


类的初始化和实例化是两码事。任何类在使用前都会经过装载-->连接-->初始化三个过程。
类的构造方法不能当成普通的方法,应当看成类似于static的方法

foy,类的初始化和实例化是两码事,就不讨论了。
我的观点是反对“父类根本就没有在堆内存空间中”。
   
0 请登录后投票
时间:2008-04-12
mfcai 写道
foy 写道
引用
我觉得你这句话“抽象类,和类的差别就是,不可以有实体。“有待商榷。
你这句话要表达的意思应该是这样理解:abstract类不能创建对象,必须由其子类来创建对象。
我觉得这里应该是指用户不能创建abstract类的对象。但没有表明jvm不能初始化abstract类啊?
退一步,如果抽象类在jvm中没有被实例化,那么用户在子类中使用super调用抽象类的方法,怎么理解?


类的初始化和实例化是两码事。任何类在使用前都会经过装载-->连接-->初始化三个过程。
类的构造方法不能当成普通的方法,应当看成类似于static的方法

foy,类的初始化和实例化是两码事,就不讨论了。
我的观点是反对“父类根本就没有在堆内存空间中”。


我觉得“父类根本就没有在堆内存空间中”这话是没有错的。
   
0 请登录后投票
时间:2008-04-13
其实这个问题是不是可以从Java初始化的顺序上来给出一个解释呢!?
其顺序如下:

1. 父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行

2. 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行

3. 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行

4. 父类构造方法

5. 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行

6. 子类构造方法

如此不就很明了了吗?
父类的实例成员在子类的实例成员初始化前已经初始化好了,打印出来的当然就是父类中定义的1了吧!
不知理解是否正确?!
还请各位酌定!
   
0 请登录后投票
时间:2008-04-13
我觉得

抽象的父类给我感觉就是其子类的参照

JVM在初始化子类前会先初始化父类中的成员,调用构造函数但而并非实例化父类

父类根本就没有在堆内存空间中,而他里面的成员是被先初始化到堆内存空间中
   
0 请登录后投票
时间:2008-04-14
我忽然想到另外一个问题
如果我要使用父类中的方法而要使用子类中的变量 可以吗?
我要用就是想让楼主题目中用父类函数打印出子类中的i可以吗?
   
0 请登录后投票
时间:2008-04-15
foy 写道
mfcai 写道
foy 写道
引用
我觉得你这句话“抽象类,和类的差别就是,不可以有实体。“有待商榷。
你这句话要表达的意思应该是这样理解:abstract类不能创建对象,必须由其子类来创建对象。
我觉得这里应该是指用户不能创建abstract类的对象。但没有表明jvm不能初始化abstract类啊?
退一步,如果抽象类在jvm中没有被实例化,那么用户在子类中使用super调用抽象类的方法,怎么理解?


类的初始化和实例化是两码事。任何类在使用前都会经过装载-->连接-->初始化三个过程。
类的构造方法不能当成普通的方法,应当看成类似于static的方法

foy,类的初始化和实例化是两码事,就不讨论了。
我的观点是反对“父类根本就没有在堆内存空间中”。


我觉得“父类根本就没有在堆内存空间中”这话是没有错的。



1、按照jvm规范,堆是运行时数据区域,类实例化的内存都由类分配,抽象类也是类,为什么抽象类就不在堆空间里呢?那你能告诉我,“父类根本就没有在堆内存空间中”,那父类在哪里实例化的呢?
2、对于你的那句“类的构造方法不能当成普通的方法,应当看成类似于static的方法”,我也不敢苟同.恕我愚钝,实在是不能明白为什么要和构造方法看成是static的方法??? static方法是类在装载的过程中,JVM会调用内置的<clinit>方法对其进行初始化调用。而构造方法是在对象创建时,JVM会调用内置的<init>方法来调用它。
   
0 请登录后投票
论坛首页 Java版 OO

跳转论坛:
JavaEye推荐