关于java中static详解
我们接触static的时候不是在学习面向对象的时候接触的,是在学习方法的时候就有过接触,我们之前对static的了解只是静态的修饰,本篇文章我们对static这个修饰符做一个详细的理解😀。
- static 如果在属性上,叫做静态属性。
- static 如果在方法上,叫做静态方法。
一、static静态属性
1、我们来新建一个软件包,创建一个学生类Student类。
package oop.Demo09;public class Student
{private static int age;//静态属性private double score;//非静态属性
}
2、我们在这个类里面,定义一个main方法(psvm)
package oop.Demo09;public class Student
{private static int age;//静态属性private double score;//非静态属性public static void main(String[] args) {Student student = new Student();int age1 = student.age;System.out.println(Student.age);//通过类调用,叫做类变量System.out.println(student.age);//通过对象调用}
}
3、如果我们用类Student,直接调用score,编译器会报错,因为非静态的类不可以直接调用。
4、我们如果要用很多类,去操作属性,就会用到static,我们会在后面的多线程详细说明类直接调用属性😎。
二、static静态方法
package oop.Demo09;public class Student
{private static int age;//静态属性private double score;//非静态属性public void run()//静态方法{System.out.println("run");}public static void go()//非静态方法{System.out.println("go");}public static void main(String[] args) {//如果我们想调用run,需要实例化Student student = new Student();student.run();//如果我们想调用go,可以直接类调用Student.go();//因为go在当前的类里面,也可以直接调用go();}
}
因为静态方法,是跟着这个类一起加载的,加载Student的时候,就有go方法了。
三、静态代码块
package oop.Demo09;public class Person
{{//代码块(匿名代码块)}static{//静态代码块(静态代码块)}
}
静态代码块,用于加载一些初始化的数据,类加载的时候直接执行,永久只执行一次。
1、我们在代码块,静态代码块中都写一行代码,并且写一个构造器ALT+INS
package oop.Demo09;public class Person
{{System.out.println("匿名代码块");}static{System.out.println("静态代码块");}public Person(){}public static void main(String[] args) {Person person = new Person();}
}
2、我们定义一个main方法,来看一下这几样东西的加载顺序,我们执行一下代码输出一下结果。
静态代码块
匿名代码块
构造方法
我们可以看到,先执行了static代码块,然后执行了匿名代码块,最后执行了构造方法,我们再来new一下Person。
package oop.Demo09;public class Person
{{System.out.println("匿名代码块");}static{System.out.println("静态代码块");}public Person(){}public static void main(String[] args) {Person person = new Person();System.out.println("===========");Person person = new Person();}
}
静态代码块
匿名代码块
构造方法
===========
匿名代码块
构造方法
我们可以看到,静态代码块不执行了,执行的是匿名代码块和构造,这就是我们上面说的,静态代码块只执行一次。
- 匿名代码块:赋初始值。
四、静态导入包
1、我们再创建一个test类。
package oop.Demo09;public class Test {public static void main(String[] args) {System.out.println(Math.random());//数学工具类返回随机数的方法}
}
我们执行以下代码,第一次返回。
0.017777263064599036
我们执行以下代码,第二次返回。
0.780661495903694
2、我们不想每次都写出Math,就可以提前导入😉
package oop.Demo09;
import static java.lang.Math.random;//静态导入包
public class Test {public static void main(String[] args) {System.out.println(random());}
}
3、我们也可以导入PI。
package oop.Demo09;
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);}
}
4、我们Ctrl+左键 ,点击进入Math类,会发现Math类是final修饰的,常量修饰就不会有子类了,不会被继承。
public final class Math
- final以后,断子绝孙!🤣