天天看点

静态变量和静态成员函数的继承

再看了下上次写的关于继承的说明代码,发现关于静态变量和静态成员函数的继承问题没有考虑清楚。详见下面测试的代码

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

继续阅读