面向对象--继承--继承中的static

继承中的static

程序示例

/*
   子类中什么都没有定义,为什么可以继承父类中的静态成员??
       因为父类中的静态成员可以看作是一个全局共享的。
*/
class A{
  //父类中的静态成员可以看作是一个全局共享的
  
  //定义一个父类的静态成员变量
    public static int a = 10;
  
  //定义一个父类的静态成员方法
    public static void fun(){
    System.out.println("hello");
    }  
}

class B extends A{
  
//开始子类中什么都不定义。但是为了方便理解这里定义一个fun2方法
      public void fun2(){
        a = 200;
        System.out.println(a);
      }
  
//了解了全局静态共享之后,我又在子类B中定义了一个和父类fun()声明一样的方法
      public static void fun(){
        //实现内容不同
        System.out.println("world");  
/*
定义之后我再运行程序就会发现我调用的fun()方法输出的是world了,为什么不是hello了呢?
因为在子类中写了静态fun()方法的话,就相当于子类本身的fun()方法了,
这时候我再运行b.fun();调用的就是子类本身的fun()方法了
子类中的fun()与父类中的fun()没有任何关系,只能说是子类自己的fun()方法。
如果我再把子类B的fun()方法注释掉,调用的就会是父类A的fun()方法,因为就近原则。
*/
      }
}

public class ExtendsQuestion {
    public static void main(String[] args) {
        B b = new B();
      //当子类中什么都没有定义的时候也可以使用父类的静态成员变量,输出结果为10
      System.out.println(b.a); 
      //当子类中什么都没有定义的时候也可以使用父类的静态成员方法,输出hello
        b.fun();  
      
      //然后我定义并调用了fun2方法,输出结果为200
        b.fun2(); 
      //然后我再输出b.a,结果为200。我们发现a的值被我们改变了,这是为什么呢?
      System.out.println(b.a);  
/*
因为在堆内存中,子类对象的空间上不仅有this标记指代自身,还有super标记指代直接父类的引用,
子类对象可以通过super标记访问方法区中父类的静态区中的静态成员。所以父类的静态成员就相当于子类的全局共享。
出现继承关系之后,父类中的静态成员又叫做全局静态共享
*/
    }
}
posted @ 2021-12-11 20:02  赤兔胭脂小吕布  阅读(24)  评论(0编辑  收藏  举报