Static关键字详解
加在方法上:静态方法
加在属性上:静态属性
静态变量:在静态方法区中
public class Student {
private static int age;//静态变量
private double score;//非静态变量
public static void main(String[] args){
Student s1 = new Student();
System.out.println(s1.score);
System.out.println(s1.age);//通过对象调用
System.out.println(Student.age);//通过类调用
System.out.println(Student.score);//此行编译报错,非静态static属性,不可直接使用类名调用变量
}
}
若类的属性定义时有static,则推荐使用类直接调用属性变量
静态变量对类而言在内存中只存在一个,唯一的,其可以被实例对象所共享。
对方法而言,若带static,静态方法,通过类即可调用:
public class Student {
public void run(){
//非静态方法
go();//或Student.go();
}
public static void go(){
//静态方法
}
public static void main(String[] args){
Student.go();//可行
Student.run();//编译报错
Student s1 = new Student();
s1.run();//可行
}
}
即:static静态方法可以直接通过类名进行调用,而非静态方法需要通过创建实例对象,再通过实际对象进行调用。且非静态方法中,可以调用非静态方法。静态方法中可以调用静态方法,但不可调用非静态方法。
(static的方法在加载时会跟类一起加载,而非静态方法在加载时并未加载,因此static方法可以直接调用,而非静态方法不行)
静态代码块
public class Person {
{
//代码块(匿名,只创建,但并不加载)
System.out.println("匿名代码块");
}
static{
//静态代码块,类加载时一同加载,帮助初始化一些数据,且只执行一次
System.out.println("静态代码块");
}
public Person() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Person person = new Person();
System.out.println("========================");
Person person1 = new Person();
}
}
输出:
静态代码块
匿名代码块
构造方法
========================
匿名代码块
构造方法
静态代码块在类加载时一同加载,帮助初始化一些数据,且只执行一次
static{
}
public class Test {
public static void main(String[] args) {
System.out.println(Math.random());//Math类的random方法
}
}
0.688664170417222
静态导入包:可省略类名直接通过 方法() 调用方法
import static java.lang.Math.random;
import static java.lang.Math.PI;
//静态导入包
public class Test {
public static void main(String[] args) {
System.out.println(random());
System.out.println(PI);
}
}
final是常量的修饰符:通过final修饰的类不能被继承,没有子类
public final class Person {
}
public class Student extends Person{
//会报错,因为Person通过final修饰,不可被继承
}