public class Main5 ... { public static void main(String[]args) ...{ //直接访问抽象类的静态字段和静态方法 System.out.println(ATest.a);//5 System.out.println(ATest.mul(2,6));//12 //最终静态字段 System.out.println(ATest.D);//30 //最终实例字段,错误 //System.out.println(ATest.C);//20 //---------------------------------------------------------------------- System.out.println(StaticTest.a);//5 System.out.println(StaticTest.D);//30 System.out.println(StaticTest.mul(2,5));//10 //---------------------------------------------------------------------- StaticTest st=new StaticTest(); System.out.println(st.a);//5 System.out.println(st.b);//6 System.out.println(st.C);//20 System.out.println(st.D);//30 System.out.println(st.mul(3,5));//15 System.out.println(st.sum(100,200));//300 System.out.println(st.sqr(3));//9 }} // 不能创建抽象类的实例,自然没办法通过它的实例来访问其实例方法和字段 // 那么是否可以直接访问抽象类的静态方法和静态域呢? // 如果抽象类的子类不为抽象类,则子类必须实现父类的所有抽象方法 abstract class ATest ... { //静态域和静态方法类似C++中的全局域和全局方法,即不需要创建类的实例就可以访问,且在内存中永远只有唯一的副本 //这恰恰弥补了实例域在这两个方面的不足。 static int a=5;//静态域,可以被继承,也可以被覆盖.随类的使用而创建,在内存中永远只有一个副本 int b=6;//实例域,可以被继承,也可以被覆盖 final int C=20; static final int D=30; //抽象方法,含抽象方法的类必须为抽象类 //抽象方法必须为实例方法 abstract int sum(int a,int b); //静态方法, static int mul(int a,int b) ...{ return a*b; } //实例方法 int sqr(int a) ...{ return a*a; }} class StaticTest extends ATest ... { //已经继承了其父类的所有方法和字段 //final类表示不可以被继承的类,即不能有子类 //final字段和方法,可以被继承,但不能被覆盖。 //静态域和静态方法类似C++,VB中的全局域和全局方法,即不需要创建类的实例就可以访问,且在内存中永远只有唯一的副本 //这恰恰弥补了实例域在这两个方面的不足。 //static int a=10;//覆盖了父类中的a,随类的使用而创建,在内存中永远只有一个副本 //int b=10;//覆盖了父类中的b,随每一个类的实例创建一个副本 //具体实现父类的抽象方法(overloading) int sum(int a,int b) ...{ return a+b; }}