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的

 

posted @ 2022-04-02 16:17  hollg  阅读(135)  评论(0)    收藏  举报