成员变量和方法的override的详解
类别: JAVA教程
原题:
//file: MyMain.class
class Base
{
int a=10;
public void show()
{
System.out.println(a);
}
}
class Ext extends Base
{
int a=200;
public void show(String s)
{
System.out.println(s);
}
}
public class MyMain
{
public static void main(String[] argv)
{
Ext obj=new Ext();
obj.show();
obj.show("OK");
}
}
请问,执行上面程序,运行是什么?
========================
关于这道题目,我给出了一个简单的原则,现在有空顺便说
清楚一点这个有趣的现象。
首先要说明,我认为,属性并非不可以override,
成员变量是可以override的,但是成员变量是在编译时解析的
(而方法是在运行时解析的)
这样一来,当子类要引用父类对象的属性时,实际上它会屏蔽
自己的同名属性,只去访问父类对象的属性,所以直接引用
变量名和通过方法来获取变量的效果是不一样的,
这里有个非常好的例子,有时间好好看看,想想
public class Shadow {
public static void main(String s[]) {
S1 s1 = new S1();
S2 s2 = new S2();
System.out.println(s1.s); // prints S1
System.out.println(s1.getS()); // prints S1
System.out.println(s2.s); // prints S2
System.out.println(s2.getS()); // prints S2
s1 = s2;
System.out.println(s1.s); // prints S1, not S2 -
// since variable is resolved at compile time
System.out.println(s1.getS()); // prints S2 -
// since method is resolved at run time
}
}
class S1 {
public String s = "S1";
public String getS() {
return s;
}
}
class S2 extends S1{
public String s = "S2";
public String getS() {
return s;
}
}
//file: MyMain.class
class Base
{
int a=10;
public void show()
{
System.out.println(a);
}
}
class Ext extends Base
{
int a=200;
public void show(String s)
{
System.out.println(s);
}
}
public class MyMain
{
public static void main(String[] argv)
{
Ext obj=new Ext();
obj.show();
obj.show("OK");
}
}
请问,执行上面程序,运行是什么?
========================
关于这道题目,我给出了一个简单的原则,现在有空顺便说
清楚一点这个有趣的现象。
首先要说明,我认为,属性并非不可以override,
成员变量是可以override的,但是成员变量是在编译时解析的
(而方法是在运行时解析的)
这样一来,当子类要引用父类对象的属性时,实际上它会屏蔽
自己的同名属性,只去访问父类对象的属性,所以直接引用
变量名和通过方法来获取变量的效果是不一样的,
这里有个非常好的例子,有时间好好看看,想想
public class Shadow {
public static void main(String s[]) {
S1 s1 = new S1();
S2 s2 = new S2();
System.out.println(s1.s); // prints S1
System.out.println(s1.getS()); // prints S1
System.out.println(s2.s); // prints S2
System.out.println(s2.getS()); // prints S2
s1 = s2;
System.out.println(s1.s); // prints S1, not S2 -
// since variable is resolved at compile time
System.out.println(s1.getS()); // prints S2 -
// since method is resolved at run time
}
}
class S1 {
public String s = "S1";
public String getS() {
return s;
}
}
class S2 extends S1{
public String s = "S2";
public String getS() {
return s;
}
}
- 上一篇: ==和equals是很有区别的
- 下一篇: java实现FTP功能(源代码)
-= 资 源 教 程 =-
文 章 搜 索