static关键字详解(属性、方法、静态代码块、静态导入包)
import java.util.Scanner; //属性 public class Main { public static int age=10; public double score; public static void main(String[] args) { Main ma=new Main(); //建议:当你的变量是类变量时,建议使用“类名.变量”去访问 System.out.println(Main.age);//因为是静态变量,而且静态是跟类一起加载的,所以使用类去调用他时是正常存在的,不会报错 // System.out.println(Main.score);//使用类去调用时,会报错并提示,这属性不是static修饰的方法 System.out.println(ma.age);//正常运行 System.out.println(ma.score);//正常运行 } }
方法:
import java.util.Scanner; public class Main { public void run(){ System.out.println("run"); go();//非静态方法,可以调用静态方式,因为静态是跟类加载的,非静态是跟对象加载的,当去调用静态方法时,他已经存在了 } public static void go(){ System.out.println("go"); //静态方法不可以调用非静态方法,因为当静态方法创建时,非静态方法还没有创建,所以调用的话会出错 } run();//报错:Main.java:11: error: invalid method declaration; return type required public static void main(String[] args) { //调用静态方法 Main.go();//正常情况下是使用这个,类名.方法 go(); //调用非静态方法 // Main.run();//无法使用类名去点非静态方法,会报错:Main.java:17: error: non-static method run() cannot be referenced from a static context new Main().run();//new对象,但是不创建对象名调用方法 Main ma=new Main();//创建对象并调用方法 ma.run(); } }
代码块:
import java.util.Scanner; public class Main { //匿名代码块:程序是不会主动调用他的,只有创建对象的时候,才会自动创建,并且比构造器创建的更早 { //这个大括号是匿名代码块,就是这个块没有名字 System.out.println("匿名代码块");//创建顺序为:2 //作用:为对象或属性赋初始值 } //静态代码块:跟类一加载就执行,永久只执行一次 static { //这个大括号是静态代码块,也是跟随类加载而加载 System.out.println("静态代码块");//创建顺序为:1 } public Main(){ System.out.println("构造器");//创建顺序为:3 } public static void main(String[] args) { Main me1=new Main();//对象创建时,匿名代码块会把对象把构造器创建前执行 System.out.println("========="); //注:当有创建代码块的时候,无论怎么执行,都是会先再代码块,再走构造方法,那静态代码块只会再第一次才会执行,后面的不会再执行 Main me2=new Main();//当创建过一次对象后,我们再创建一个对象,那个就不会再执行静态的代码块,因为静态代码块是类执行的并且永久只执行一次 } }
静态导入包:
import java.util.Scanner; //静态导入包的方法 import static java.long.Math.PI; public class Main { public static void main(String[] args) { System.out.println(Math.PI);//未导入包时,调用方法的时候,我们要用包名调用 System.out.println(PI);//静态导入包后,我们直接写这个方法名即可 } }
静态方法:
特点:一:
1、跟着的加载而加载,可以通过“类.静态方法”的方法进行调用
2、4、调用方式
静态方法 非静态方法
类 yes no
对象 yes yes
用类去调用非静态方法会编译不通过
3、方法调用方法时
静态方法中,只能调用静态方法的属性(因为非static的生命周期不够)
非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
二:static的注意点:
1、在静态的方法内,不能使用this关键字、super关键字(这两个关键字都是基于你有对象的,你连对象都没有怎么用)
2、关于静态属性和静态方法的使用,大家都从生命周期的角度去理解
3、在声明一个sataic的private的属性时他的set、get方法都要是有static的
三:
1、在开发中如何确定一个属性是否要声明为static的?
>属性是可以被多个对象所共享的,不会跟着对象的不同而不同的。
比如账号和密码:如果账号都一样打钱进到底是打进谁的卡呢,再比如密码一样,你到处捡一个卡你不是就能领钱了吗?
但是利率这种是可以用static的
注:每个对象都有所不同就不要用static,只有这个变量在每个对象中是相同的就可以用static
>类中常量也常常声明为static
2、在开发中如何确定一个方法是否要声明为static的?
>操作静态属性有方法通常设置为static的
>工具类中的方法,习惯上声明为static的

浙公网安备 33010602011771号