class Super {
int nonStat = 2;
int nonStatMethod() {
return 4;
}
}public class Sub extends Super {
int nonStat = 20; public static void main(String[] args) {
Super s = new Sub();
System.out.println("Non-Static is " + s.nonStat); }
}为什么输出的是2而不是20
int nonStat = 2;
int nonStatMethod() {
return 4;
}
}public class Sub extends Super {
int nonStat = 20; public static void main(String[] args) {
Super s = new Sub();
System.out.println("Non-Static is " + s.nonStat); }
}为什么输出的是2而不是20
解决方案 »
- 点击按钮后作图
- 多个TextField是用FocusAdapter进行验证,急急急.........................
- taglib directive for "bean" does not exist or Tld is not found是什么原因?
- 请问一个关于字符界面输入输出的问题
- 看sun的swing tutorial的简单问题
- jcreater中的函数提示怎么设置啊?
- 那里有免费jrun下载,在线等
- 新来扎到 有一个问题想问
- 请教:weblogic可以实现www服务,是否也有ftp服务?websphere呢?
- 还是数据类型方面的问题
- jclass 以及 jctable 在实际应用中多不多?
- 对象的问题呢
楼主【dreamhunter_lan】截止到2008-07-23 16:36:11的历史汇总数据(不包括此帖):
发帖的总数量:0 发帖的总分数:0 每贴平均分数:0
回帖的总数量:8 得分贴总数量:1 回帖的得分率:12%
结贴的总数量:0 结贴的总分数:0
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:---------------------结分的百分比:---------------------
无满意结贴率:---------------------无满意结分率:---------------------
如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
属性的值取父类还是子类并不取决于我们创建对象的类型,而是取决于我们定义的变量的类型。
楼主请看清上面这段代码,虽然对象s是以Sub类来创建的,但它还是属于Super类的实例,所以它拥有的属性和方法都是Super类的,而不是Sub类的,这样,输出结果当然是2了。用书上的话来说,这就是上转型对象。
就比如说,老虎是哺乳类动物。Super相当于哺乳类,Sub相当于老虎
而s只是属于哺乳类,并不是老虎,所以s只是拥有哺乳类的行为,而没有老虎的行为
understand?
int nonStat = 2;
int nonStatMethod() {
return 4;
}
} public class Sub extends Super {
int nonStat = 20; public static void main(String[] args) {
Super s = new Sub();
System.out.println("Non-Static is " + s.nonStat); }
} 为什么输出的是2而不是20答:什么是多态。属性(变量)是没有多态的。方法的覆盖构成多态。
这里要清楚动态绑定和静态绑定,属性(变量)是根据的对象的类型进行静态绑定的,s的对象类型是Super.Super.nonStat自然是2了,
要想让他输入20,那么就要通过强制类型转换((Sub)s).nonStat的值就会输出成20了。
简单是说就是属性是静态绑定,方法是动态绑定。方法才有多态。
* nonStat = 2 *
* ***************** *
* * nonStat = 2 * = super *
* * * *
* * * *
* ***************** *
* *
* *
* *
***********************************
内存
package test;class Super {
int nonStat = 2; int nonStatMethod() {
return 4;
}
}public class Sub extends Super {
int nonStat = 20;
//新增一个成员变量
int test = 100; public static void main(String[] args) {
Super s = new Sub();
System.out.println("Non-Static is " + s.nonStat);
//有问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
System.out.println(s.test);
}
}
编译是无法通过的,对于s而言,test是不可见的,nonStat同理
在处理Java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以“找到”子类,而对象的属性还是父类的属性。
现在再进一步变化,在父类和子类中同时定义和赋值同名的成员变量name,并试图输出该变量的值。
public class Father { protected String name="父亲属性"; public void method() { System.out.println("父类方法,对象类型:" + this.getClass()); } }
public class Son extends Father { protected String name="儿子属性"; public void method() { System.out.println("子类方法,对象类型:" + this.getClass()); } public static void main(String[] args) { Father sample = new Son();//向上转型 System.out.println("调用的成员:"+sample.name); } }
结果3:
调用的成员:父亲属性这个结果表明,子类的对象(由父类的引用handle)调用到的是父类的成员变量。所以必须明确,运行时(动态)绑定针对的范畴只是对象的方法。
现在试图调用子类的成员变量name,该怎么做?最简单的办法是将该成员变量封装成方法getter形式。 public class Father { protected String name = "父亲属性"; public String getName() { return name; } public void method() { System.out.println("父类方法,对象类型:" + this.getClass()); } } public class Son extends Father { protected String name="儿子属性"; public String getName() { return name; } public void method() { System.out.println("子类方法,对象类型:" + this.getClass()); } public static void main(String[] args) { Father sample = new Son();//向上转型 System.out.println("调用的成员:"+sample.getName()); } }
结果4:
调用的成员:儿子属性
将Super里的变量定义成private的还可以访问到么?~·