第一次测试:
父类:
public class Parent {
protected static void staticmethod(){
System.out.println("parent");
}
protected void say(){
System.out.println("this is parent");
}
}
Java代码
子类:
public class Son extends Parent {
@Override
protected void say() {
// TODO Auto-generated method stub
System.out.println("this is son");
}
protected static void staticmethod(){
System.out.println("son");
}
}
调用:
Java代码
Parent son1 = new Son();
son1.staticmethod();
son1.say();
Son son2 = new Son();
son2.staticmethod();
son2.say();
Parent p1 = new Parent();
p1.staticmethod();
p1.say();
输出结果:
Java代码
parent
this is son
son
this is son
parent
this is parent
即为: 父类的 static 方法 子类不能覆盖,但是子类能与父类有相同说明的static方法,
如上:protected static void staticmethod(),
但是
Java代码
son1.staticmethod()
输出
parent
同时
Java代码
son2.staticmethod();
输出
son
第二次测试:
修改子类:
Java代码
public class Son extends Parent {
@Override
protected void say() {
// TODO Auto-generated method stub
System.out.println("this is son");
}
protected static void staticmethod(){
System.out.println("son");
}
private Son() {
// TODO Auto-generated constructor stub
}
private static Son son ;
public static Son getInstance(){
if (son == null){
son = new Son();
}
return son;
}
}
然后调用:
Java代码
Parent son1 = Son.getInstance();
son1.staticmethod();
son1.say();
Son son2 = Son.getInstance();
son2.staticmethod();
son2.say();
System.out.println(son1 == son2);
Parent p1 = new Parent();
p1.staticmethod();
p1.say();
输出:
Java代码
parent
this is son
son
this is son
true
parent
this is parent
及 son1 == son2,区别只是引用不同,输出结果与第一次测试相同
由此说明: 子类不能覆盖或者重写父类 静态函数,如果有同名且声明相同的函数,这不是覆盖。
对象存储在 堆 区域中,static存储在静态存储区,当程序执行,类的代码被加载到内存,类的静态变量就分配了内存空间,他是属于类的也就是没个实例对象都是对于以个静态变量,静态变量的内存空间知道程序退出才释放所占用的内存空间