class Base{
int x=10;
int method(){
return x;
}
}
class Sub extends Base{
int x=20;
int method(){
return x;
}}pubulic static void main(String args[]){
Base b=new Sub();
System.out.println(b.x);
System.out.println(b.method());}
结果为什么是
10,20
int x=10;
int method(){
return x;
}
}
class Sub extends Base{
int x=20;
int method(){
return x;
}}pubulic static void main(String args[]){
Base b=new Sub();
System.out.println(b.x);
System.out.println(b.method());}
结果为什么是
10,20
解决方案 »
- spring配置多数据源问题
- 如何获得跳转过来的前一页URL
- S2SH:无效Action配置引用一个未知的类
- 好像是bean 的id不能命名不能以/开始,要怎么解决?
- action根据什么来划分呢?
- java.lang.IllegalArgumentException: No origin bean specified大家救救我
- 连接不上MYSQL数据库,在线等待
- acegi问题求解,用localhost:8080访问没问题,用ip地址就刷新不及时
- 在struts中,配置多个应用的问题,急
- 请问,在struts中如何从session中去掉form
- 对j2ee初学者的建议--个人意见
- hibernate shema问题
这里b是父亲的类型。b.x,就是父亲的属性。
b.method()是父亲的方法,但是你重写了,就是你的了。
但是因为你声明b的类型是Base,所以这个变量是Base的x的值。
如果你将Sub的method方法做如下修改:
int method() {
return super.x;
}得到的结果是两个10。
你没有用super.x,则默认取得this.x。取得的自然是20了。
public static void main(String[] args)throws Exception{
//想在第三方类中使用super就不现实了。如下才能访问本身变量值。
Base b=new Sub();
//b的归属字节码是SUB,不是Base
System.out.println(b.getClass().getName());
//那sub字节码中的变量一定是20了
Field fieldX = b.getClass().getDeclaredField("x");
System.out.println(fieldX.get(b));
//那如下访问就偏偏是10呢,哦!原来变量的访问规则是由声明域决定,如C++,C#等皆是如此
System.out.println(b.x);
Sub c=new Sub();
System.out.println(c.x);
//java中的对象声明,换成编译词法应该是 【访问声明域 区域引用=对象地址】,所谓的接口编程更像权限制御。
}
}
public static void main(String[] args)throws Exception{
//想在第三方类中使用super就不现实了。如下才能访问本身变量值。
Base b=new Sub();
//b的归属字节码是SUB,不是Base
System.out.println(b.getClass().getName());
//那sub字节码中的变量一定是20了
Field fieldX = b.getClass().getDeclaredField("x");
System.out.println(fieldX.get(b));
//那如下访问就偏偏是10呢,哦!原来变量的访问规则是由声明域决定,如C++,C#等皆是如此
System.out.println(b.x);
Sub c=new Sub();
System.out.println(c.x);
//java中的对象声明,换成编译词法应该是 【访问声明域 区域引用=对象地址】,所谓的接口编程更像权限制御。
}
}
b在编译期为Base,运行期为Sub,成员变量是在编译期绑定的,方法在运行期绑定的(static final private方法除外);这种调用就是多态,向上转型。此外,成员变量是没有重写的,也就是说成员变量没有多态。只有成员方法才可以重写,才有多态。你那两个类都定义了x,虽然名字是一样的,可是没有重写。就相当于你定义了两个不同变量,一个为x1,另一个为x2.