我们接触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,我们会在后面的多线程详细说明类直接调用属性😎。
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