java多态的疑问 这个流程是怎么走的?

放肆的青春-_- 发布于 2012/06/18 11:02
阅读 456
收藏 0
class J_SuperClass{//创建一个类
	int m_data;//成员变量
	J_SuperClass(){//构造方法
		mb_add(1);//调用mb_add方法,里面传1
	}
	public void mb_add(int i){//mbadd方法,可以解释为m_data=m_data+1;
		m_data+=i;//m_data默认值是0.//0=0+6=6
	}
public void mb_print(){//创建mb_print方法
	System.out.println(m_data);//打印m_data方法
}
	
}

class J_SubClass extends J_SuperClass{//创建一个类,继承super类
	J_SubClass(){//构造函数
		mb_add(2);//在方法mb_add(2)传入一个参数2
	}
	public void mb_add(int i){//覆写mb_add函数
		m_data+=i*2;//m_data= m_data+2*2
	}
}

public class J_Test {//创建一个类
	public static void mb_method(J_SuperClass a){//创建一个静态方法,不存在覆盖,里面穿入父类类型的 a引用
		a.mb_add(6);//a引用的方法传入6
		a.mb_print();//a引用的方法
	}
	//第二步,在父类中mb_add方法传入一个6,然后调用打印方法
	
	public static void main(String[] args) {
		mb_method(new J_SubClass());//本类mb_method方法里面创建一个匿名对象
		//可以解释为J_SuperClass a = new J_SubClass();
		//第一步

	}

}
加载中
0
sunyzc
sunyzc

貌似就是java对象初始化顺序问题

http://s-zc.com/?p=1092

0
zhengjunbo
zhengjunbo

首先从 父类的构造器开始初始化

J_SuperClass 初始化后  m_data = 1*1=2

J_SubClass 初始化后  m_data = 2*2+2=6;

进入J_Test中的静态方法,调用的是重写过的J_SubClass的mb_add。所以是6*2+6=18.

初始化和重写的问题。

算法与编程之美
算法与编程之美
回复 @zhengjunbo : 表示好的编程习惯还是自己手动初始化成员变量比较好,虽然很多是编译器能够帮我们做到的,但如果编译器由于某种bug没有能够做到初始化,到时运行时的bug就比较难于调试了
zhengjunbo
zhengjunbo
回复 @justin_cn : 成员变量自动初始化。数值型的为0。String和其他类型的为NULL
算法与编程之美
算法与编程之美
话说m_data初始化了吗?
0
jeffsui
jeffsui
先有爹,再有儿,爹构造,子构造,爹方法,子方法
0
算法与编程之美
算法与编程之美
表示不敢苟同楼主的代码风格,总是感觉很别扭,太多注释都是没有意义的。。。。。。
算法与编程之美
算法与编程之美
回复 @晕dows : 呵呵,个人的编程习惯不一样,也许是从c++转过来的。。
晕dows
晕dows
回复 @zhengjunbo : 我说的是命名方式啊,java都是驼峰式的,你这是那种方式的命名啊。。。你的java是和php老师学的么。。。
算法与编程之美
算法与编程之美
@zhengjunbo 哦,原来是这样哈,非常感谢您的回复。
zhengjunbo
zhengjunbo
回复 @晕dows : 这是很多个java类在写在一起。只是只能有一个public的class而已。我学这种初始化的时候,都是这么写的,不然五六个类分开写,足以让新手搞不定了
晕dows
晕dows
而且明显不是java的类,变量和方法名的命名方式,蛋蛋一阵阵的疼
0
算法与编程之美
算法与编程之美

成员变量m_data初始化了吗?表示。。。

 

0
zhengjunbo
zhengjunbo

引用来自“justin_cn”的答案

成员变量m_data初始化了吗?表示。。。

 

首先,如果对JAVA的基础 有一定了解的话,就应该明白。类里面的变量都是默认初始化,而且更多时候尽量不要去手动初始化,毕竟那是没有意义的。如果这都出现了BUG。那么你整个JVM就已经有问题了不能使用。毕竟这是语法上的规定。另外方法里变量就必须初始化。如果没有初始化又没有赋值的话,会直接报错。另外还有一点。我见过很多老的程序员喜欢,成员变量也一定初始化。使用完了对象一定赋空值。第一,这是毫无意义的担心,这些虚拟机已经帮你解决了这些。我们只需要做的是,在必须要的时候做必要的赋值。第二,最重要的是在没必要的赋值,会导致不小心赋错,比如不该为NULL的是时候赋为了null导致空指针,或者隐藏错误。跟满世界的注释一样,没必要的操作同样会影响阅读,影响阅读,也是一个非常致命的。如果你阅读过程序的话。那种格式差。逻辑差的代码是非常难以阅读的。比如我对你写的这段话,想必你也读的很头疼把
0
算法与编程之美
算法与编程之美
非常感谢您的回复,表示自己学到了很多有关java变量初始化方面的知识,非常感谢
0
我用一眼看世界
重点不是初始化,而是重载函数的问题。
alevi
alevi
这不是重载,只是子类覆写父类的方法
返回顶部
顶部