再看了下上次写的关于继承的说明代码,发现关于静态变量和静态成员函数的继承问题没有考虑清楚。详见下面测试的代码
public class test {
public static void main(string[] args){
//静态变量a.x即是b.x
a a=new a();
b b=new b();
system.out.println("a.x="+a.getx());
system.out.println("b.x="+b.getx());
a.addtox(1);
b.addtox(1);
//同样也公用静态方法
a.getopsx();
b.getopsx();
//静态变量的可见度和静态函数的可见度都不变
system.out.println("a.x="+a.x);
system.out.println("b.x="+b.x);
}
}
class a {
public static int x=2; //1.
public static void getopsx(){
system.out.println("in a. x*2="+x*2);
a(){
public int getx(){
return x;
public void addtox(int i){
system.out.println("in a. add int i="+i+" to x");
x+=i;
class b extends a {
b(){
system.out.println("in b. add int i="+i+" to x");
//输出
//a.x=2
//b.x=2
//in a. add int i=1 to x
//a.x=3
//b.x=3
//in b. add int i=1 to x
//a.x=4
//b.x=4
//in a. x*2=8
动态绑定情况,只有普通方法才可以动态绑定
a a=new b();
//静态方法和静态变量,不动态绑定。使用引用类型
system.out.println(a.x); //warning
system.out.println(a.getopsx()); //warning
//普通变量,不动态绑定。使用引用类型
system.out.println(a.y);
//普通方法动态绑定,使用实际类型
system.out.println(a.getx());
system.out.println(a.gety());
a(){}
public static string x="i'm a!";
public static string getopsx(){
return "in a.use="+x;
public string y="in a.y";
public string getx(){
public string gety(){
return y;
class b extends a {
b(){}
public static string x="i'm b!"; //1.
return "in b.use="+x;
public string y="in b.y";
public string getsupery(){
return super.gety();
//i'm a!
//in a.use=i'm a!
//------------------
//in a.y
//i'm b!
//in b.y