int num;
//static属性可以被继承
// 可以和 final 联合使用
static int num2 = 10; //计数 有多少个ClassA 的实例被创建
final static int MON = 1;
//static 依然可被重写
// final static 方法也不能被重写
static void fun(){
System.out.println("!!!");
}
//静态方法不能加abstract
// public static abstract void fun2();
}
public class ClassB extends ClassA{
static final int version;
/*---static 代码块 ---*/
static{
//整个程序只执行一次的操作
// 比如 设定 加载资源的路径
// 在预加载的时候执行 可以有逻辑 在main运行之前就去执行
int number = 10;
version = 20;
if (ClassA.num2 == 0) {
}
ClassB obj = new ClassB();
}
//若重复 则子类说了算
static int num2=-90;
static void fun(){
System.out.println("-----");
//static方法中不能使用
// (非static)成员属性/方法
// static 在静态区加载时 main还没有执行
// 没有实例 自然就没有成员属性/方法
// age = 20;
// disp();
}
int age=0;
//成员方法中 可以直接使用 static方法/属性
void disp(){
fun();
num2 = 100;
}
}
public class ClassC {
//----工具类-------
// 仅仅负责逻辑处理
// 你给我条件 我去运算
// 不需要用到 实例本身 那么之间简化为static方法
void add(int a, int b){
}
static void factorial(int x){
}
}
/*------
* 类 (类对象 Class名) : 印花模子 预加载时创建
* 在静态区中 一个class有且只有一个
* 抽象类也有类对象
*
* 实例 (实例对象): 月饼 程序运行阶段 时被创建
* 引用在 栈区 实例本身在 堆区
* 可以有很多个
* -------*/
public class MainTest {
//成员属性 在实例对象的内部 有多少个实例 就有多少个num
int num=10;
void fun(){
System.out.println("成员 fun");
}
//静态属性(类属性)
// 静态属性放在类对象中 类对象只有一个
// 不论有多少个实例 静态属性只有一个
static int num2 = 20;
static void fun2(){
System.out.println("static fun2");
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
MainTest obj = new MainTest();
MainTest obj2 = new MainTest();
//访问 static成员 用类名.成员
// eclipse 也支持 实例.static成员 但不推荐
// System.out.println(MainTest.num2);
// System.out.println(obj.num);
//
// obj2.num = -10;
// obj2.num2 = -20; //实际上 还是 MainTest.num2
//
// System.out.println(obj.num2); //MainTest.num2
// System.out.println(obj.num);
// MainTest.fun2();
// obj.fun2();
/*--------static 和继承----------*/
if (true) {
ClassB b = new ClassB();
System.out.println(ClassB.num2);
System.out.println(ClassB.class);
ClassB.fun();
}
ClassC c = new ClassC();
c.factorial(10);
ClassC.factorial(10);
}
}