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;
}}
... {
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;
}}