public class JavaKey {
public final int a;
public static int b;
private static int c;
public JavaKey() {
a = 1;// 未初始化会出现编译错误。
}
public void testStaticFunction() {
System.out.println(JavaKey.b);
System.out.println(b);
System.out.println(JavaKey.c);
System.out.println(c);
}
public static void showStatic(){
//System.out.println(a);//编译错误,不可接触非static的变量,即实例变量。和每个对象相关的。
System.out.println("This is parent's static function");
}
public void showOverride(){
System.out.println("This is parent's override function");
}
public static void main(String[] args) {
JavaKey k = new JavaKey();
k.testStaticFunction();
System.out.println(k.a);
System.out.println(k.b);// 因为是同一个类的静态函数,所以可以访问,即使是private
System.out.println(k.c);// 调用的是整个类,所有实例共享的一个变量。
System.out.println(JavaKey.b);
System.out.println(JavaKey.c);
System.out.println(b);
System.out.println(c);
}
}
public class TestStatic extends JavaKey {
// @override
public static void showStatic() {
System.out.println("This is child's static function");
}
public void showOverride(){
System.out.println("This is child's override function");
}
public static void main(String[] args) {
JavaKey k = new JavaKey();
k.testStaticFunction();
System.out.println(k.a);
System.out.println(k.b);// 调用的是整个类,所有实例共享的一个变量。
// System.out.println(k.c);//private的,所以不可见。
System.out.println(JavaKey.b);
// System.out.println(JavaKey.c);
k.showStatic();//parent
k.showOverride();//parent
k=new TestStatic();
k.showStatic();//parent!!!而静态方法是在编译时确定的,即使随后将k修改为了子类。
k.showOverride();//child!!!区别啊!
//多态性,运行时动态决定调用子类的方法。
TestStatic t=new TestStatic();
t.showStatic();//child!!!,同上面对比
t.showOverride();//child
JavaKey.showStatic();//parent
TestStatic.showStatic();//child
}
}
Final class
public final class FinalClass {
int a;//final的成员变量不是final。
//没有机会被重载,因为final类不能被继承
public void function()
{
System.out.println("I am a function in final class");
System.out.println("a="+a);//default是0
}
public static void main(String[] args) {
FinalClass f=new FinalClass();
f.function();
}
//final类不能被继承,所以成员函数默认是final的
/*class Subclass extends FinalClass{
}*/
}
总结
1:static是静态的,在编译时便确定。
可用类型.静态成员/静态方法().或者实例名.也可用实例名.成员/方法。
1.1:Java不支持abstract同static同用在方法上,static意味着和类相关,abstract意味方法要子类实现(二者无逻辑上的冲突吧)。
static方法不可被重载的,而abstract方法需要子类重载。
2.1:Abstract类,可以有static成员或者方法。通过类名.成员/方法。
2:final是指“不可修改”.
若是变量则必须初始化,有且仅有一次。
方法,不可被override;
类不可被继承--〉类的成员不可被override。因此不能同abstract同用, 因为虚类必须被继承。