1.静态属性
定义两个变量,年龄、属性
要使用student就要先去new一个student
通过student对象可以直接调用
通过Student类也可直接调用
用类调用非静态的score报错了,非静态的字段不能这样调用
(如果是静态变量,推荐使用类名去 .变量)
静态的可以共享
2.静态方法
定义两个方法
run();非静态
go();静态方法
在直接调用run时显示报错,是不能直接调用run方法的,只有在把student 给new出来才可以
对象 . 方法
在调用go方法时,可以直接调用
或者去掉Student也可以直接调用
加了static就是从属于这个类,可以直接调用
非静态里的方法可以直接调用这个类中的静态方法
run(非静态)里面可以直接访问go(静态)
静态方法可以调用静态方法的,但是不可以调用非静态的
3.静态代码块
静态代码块static里面可以加载一些初始化的数据,静态代码块在类加载的时候它直接执行,永久执行一次
匿名代码块是创建对象的时候就自动创建了,在构造器之前,程序在执行的时候不能主动调用这些模块,匿名代码块的作用是赋一些初始值,因为它是和对象同时产生的,而且它在构造方法之前
输出
第一次new:首先可以看到第一个先输出了静态代码块,它和类一块儿加载,然后第二个执行了匿名代码块,第三个执行构造方法;
第二次new:可以看到静态代码块static只执行一次,第二次就没了,而其他的都是每次在创建了对象就要执行,先走匿名代码块,然后构造方法
4.静态导入包
输出一个Math.random();(随机数,每次输出的值不一样)
不想每次都写Math.只写random把Math省略,我们可以导入一个包
导入一个lang包,后面可以 . Math . random
但是此时报错,加一个static就好了
这就是静态导入包
上面导入包了,在输出语句中的调用时就不用Math.了,直接写random()调
5.final
它是常量的修饰符,通过final修饰的类不能被继承,没有子类了。
如果父类被final定义了
则它的子类Student不能继承了