论坛首页 Java企业应用论坛

java继承容易犯的错误

浏览 21665 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (4) :: 隐藏帖 (1)
作者 正文
   发表时间:2008-04-10  
It is interesting.
0 请登录后投票
   发表时间:2008-04-11  
4、jvm的执行过程
(1)子类B 的构造方法被调用,实例化一个B对象,B对象的成员被初始化
(2)jvm隐含的调用父类的构造方法,实例化一个A对象,A对象的成员被初始化。
(3)由于A对象的printI()未被屏蔽,所以调用的A对象的printI()函数。

疑问:
     针对楼主这个例子:jvm的执行过程应该是先加载父类,然后加载子类的吧。

我的意思就是:jvm先初始化父类的成员变量和构造函数,在初始化子类的成员变量和构造函数。不知道我的理解是否正确,请大虾们不吝指教,谢谢!
0 请登录后投票
   发表时间:2008-04-11  
看懂.学习
0 请登录后投票
   发表时间:2008-04-11  
如果哪个开发人员写这样的程序,直接开除就行了
0 请登录后投票
   发表时间:2008-04-11  
backbase 写道
4、jvm的执行过程
(1)子类B 的构造方法被调用,实例化一个B对象,B对象的成员被初始化
(2)jvm隐含的调用父类的构造方法,实例化一个A对象,A对象的成员被初始化。
(3)由于A对象的printI()未被屏蔽,所以调用的A对象的printI()函数。

疑问:
     针对楼主这个例子:jvm的执行过程应该是先加载父类,然后加载子类的吧。

我的意思就是:jvm先初始化父类的成员变量和构造函数,在初始化子类的成员变量和构造函数。不知道我的理解是否正确,请大虾们不吝指教,谢谢!

谢谢你的提醒,根据类的加载机制:应该先是父类的成员变量和构造方法,然后才是子类的成员变量和构造方法
在这个地方我表达的不对,抱歉。
0 请登录后投票
   发表时间:2008-04-12  
lsk 写道
mfcai 写道

(4)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承

改成这样试试看
public abstract class A {

	int i = 1;

	public void printI() {
		System.out.println("i=" + i);
	}
}

class B extends A {

	@Override
	public void printI() {
		System.out.println("i="+(++i));
	}

	public static void main(String[] args) {
		B b = new B();
		A a = new B();
		a.printI();
		b.printI();
	}
}




父类,无实体,
穿过父类的无发(子类的手)

父类根本就没有在堆内存空间中。。。
0 请登录后投票
   发表时间:2008-04-12  
dearmite 写道
lsk 写道
mfcai 写道

(4)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承

改成这样试试看
public abstract class A {

	int i = 1;

	public void printI() {
		System.out.println("i=" + i);
	}
}

class B extends A {

	@Override
	public void printI() {
		System.out.println("i="+(++i));
	}

	public static void main(String[] args) {
		B b = new B();
		A a = new B();
		a.printI();
		b.printI();
	}
}




父类,无实体,
穿过父类的无发(子类的手)

父类根本就没有在堆内存空间中。。。

也许这里,我们理解有偏差了.
我们知道,在Java中,只要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都能在堆 (Heap)中分配到空间。父类也能被new,那么请问为什么不存在堆内存空间中?
0 请登录后投票
   发表时间:2008-04-12  
抽象类,和类的差别就是,
不可以有实体。

B b = new B();  
        A a = new B();
这里的变量类型看似不同,

但是,内存中实际上都是B类。
这个和接口一样,
接口中不同样也可以定义变量么。(只是都变成了final)

指向类的时候,它就指到了类的首地址上!


  A a = new B();为什么不可能写成  A a = new A();

  A a = new B();  
实际上是,
A a ;
a= new B();
a 是抽象的,根本就无实体。
     
0 请登录后投票
   发表时间:2008-04-12  
B b;
sysout (b);

b= new B();  
sysout (b);
  A a;
sysout (a);
a = b;

sysout (a);

把这里的null,和类的首地址打出来,一看便知!!!

null 是栈中变量无任何指向。
这个和C++一样,

A a = new B();

和C++ 中  A *p = new B() p 这里放了B的首地址。
是一样的,JAVA的隐指针!


0 请登录后投票
   发表时间:2008-04-12  
dearmite 写道
抽象类,和类的差别就是,
不可以有实体。

B b = new B();  
        A a = new B();
这里的变量类型看似不同,

但是,内存中实际上都是B类。
这个和接口一样,
接口中不同样也可以定义变量么。(只是都变成了final)

指向类的时候,它就指到了类的首地址上!


  A a = new B();为什么不可能写成  A a = new A();

  A a = new B();  
实际上是,
A a ;
a= new B();
a 是抽象的,根本就无实体。
     

我觉得你这句话“抽象类,和类的差别就是,不可以有实体。“有待商榷。
你这句话要表达的意思应该是这样理解:abstract类不能创建对象,必须由其子类来创建对象。
我觉得这里应该是指用户不能创建abstract类的对象。但没有表明jvm不能初始化abstract类啊?
退一步,如果抽象类在jvm中没有被实例化,那么用户在子类中使用super调用抽象类的方法,怎么理解?
1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics