Java “static”关键字详解
定义静态属性和费静态属性
有如下一段代码:
package com.OOP.demo07;
//static:
public class Student {
private static int age;//静态变量
private double score;//非静态变量
public static void main(String[] args) {
Student student = new Student();
System.out.println(Student.age);
//System.out.println(Student.score);//这种情况便会报错
System.out.println(student.score);
System.out.println(student.age);
}
}
该段代码定义了一个Student类,并用关键字static定义了一个静态变量age,和一个非静态变量score。在以下的测试代码中,我们发现类可以直接调用静态变量,不能调用非静态变量。
定义静态方法和非静态方法
看如下一段代码:
package com.OOP.demo07;
//static:
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) {
Student student = new Student();
System.out.println(Student.age);
//System.out.println(Student.score);//这种情况便会报错
System.out.println(student.score);
System.out.println(student.age);
Student.go();
//Student.run();//这种情况便会报错
student.run();
student.go();
}
}
我们接着上一节的代码定义了一个非静态方法run(),和一个静态方法go()。测试结果与上一节类似,类可以直接调用使用static关键字定义的静态方法,而不能调用非静态方法。
static代码块
在类的定义过程中,我们可以自己写入代码块,代码块又分为匿名代码块和用static关键字定义的静态代码块。同时还应该包括我们的构造器方法。有如下一段代码:
package com.OOP.demo07;
public class Person {
{//赋初始值
System.out.println("匿名代码块"); //代码块(匿名代码块)
}
static {//只执行一次
System.out.println("静态代码块");
}
public Person() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Person person1 = new Person();
System.out.println("====================");
Person person2=new Person();
}
}
我们运行代码,以进行测试,运行结果如图所示:
根据运行结果我们可以得出以下结论:
- 创建对象时,执行顺序为静态代码块、匿名代码块、构造器方法。
- 静态代码块只执行一次。
- 匿名代码块可以用作赋初始值。
静态导入包
我们可以思考,我们想借助Math类的random方法随机生成数,需要如此调用。
package com.OOP.demo07;
public class Test {
public static void main(String[] args) {
System.out.println(Math.random());
}
}
可是如果我们做如下操作:
package com.OOP.demo07;
import static java.lang.Math.random;//静态导入包
public class Test {
public static void main(String[] args) {
System.out.println(random());
}
}
我们便直接使用random便可以随机生成数,这便是静态导入包操作
以上便是我总结的static关键字的一些用法,我也是一个新手菜鸟,肯定不全面不详尽,还望大家多多包涵!!