A extends B
B a = new A()
与A a = new A()B a = new A()时:
调用属性时,加入A和B中都定义了value属性;
在B中public int value = “B”;
在A中public int value = “A”;
则调用a.value 得到“B”;
调用方法时调用类A中的方法。而A a = new A()时:
属性和调用方法均是类A中的。
B a = new A()
与A a = new A()B a = new A()时:
调用属性时,加入A和B中都定义了value属性;
在B中public int value = “B”;
在A中public int value = “A”;
则调用a.value 得到“B”;
调用方法时调用类A中的方法。而A a = new A()时:
属性和调用方法均是类A中的。
解决方案 »
- javascript,实现一个功能,文本框内只能输入数字。。
- 关于Lucene中检索出现内存问题
- hibernate 主外键插入问题
- 刚学IBatis 遇到的问题,实在是看不出问题出在什么地方,请各位好心人帮帮忙看一看。万分感谢!!
- 请问大家使用的版本是多少?myeclipse,eclipse/
- 谁来讲讲Hibernate中通过Example来查询?
- webservice初级问题,大家帮帮忙!大送分
- 请教struts问题。在线!!!
- 如何用logic:iterate实现嵌套?
- SpringMVC接收参数问题。初学,在线等。就30分了
- 急求!'教师教学水品评估系统'源码和需求说明文档!!!
- VSS
这里的B继承了A,B可以继承A的方法,可以重写A的方法(多态)
而对于类的方法来说,是后期绑定;
来看代码:/**
* @author bzwm
*
*/
public class TestExtends { public static void main(String args[]) { Father f = new Child();
//类的属性是前期绑定,所以这里输出“Father”;
System.out.println(f.var);
//f的类型是Father,但是,却用Child的构造方法初始化的,所以引用指向Child;
//所以执行Child的getVal()方法,所以 return this.val,就输出子类了。
System.out.println(f.getVal());
}
}class Father { String var = "Father"; String getVal() {
return var;
}
}class Child extends Father { String var = "Child"; String getVal() {
return var;
}
}
当一个对象被实例化,它的父类会先被实例化,
实例化其实是对对象的成员变量的初始化;
在对象中有个隐藏的属性super,指向它的父类的对象,还有个隐藏的属性this指向对象本身;
类的方法,在类被加载的时候被加载到了方法区,
同个类的所有对象都持有相同的方法指针,
在java中,所有的方法都是后期绑定,
即动态绑定,
如果在this中找到了调用的方法,就执行,若没有就在super中找,
如果在this中没有,进入了super,则相当于this指向了super,你将无法再访问到原来的this里的属性和方法了,
只能再向上。
类的所有实例方法,在JVM执行它的时候,
会把this和super两个属性压入方法栈中,
若在方法的局部变量中找不到变量val,即val 不是局部变量,
则就会去this对象中找,找不到了再到super中找。说的不太清楚,先看着吧。