继承中的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标记访问方法区中父类的静态区中的静态成员。所以父类的静态成员就相当于子类的全局共享。
出现继承关系之后,父类中的静态成员又叫做全局静态共享
*/
}
}