Java学习20-- static关键字总结

Static关键字总结

在Java中,static 是一个关键字,用于修饰类的成员(包括变量、方法和内部类)。它有几个主要的用途和含义:

静态变量(Static Variables):
    也称为类变量。它们不属于任何一个对象实例,而是属于类本身。
    静态变量在内存中只有一个副本,无论创建多少个对象实例,它们都共享这个静态变量的副本。
    通常,静态变量用于跟踪与类相关的某些统计信息。

public class Counter {  

    public static int count = 0;  

  

    public Counter() {  

        count++;  

    }  

}
静态方法(Static Methods):
    静态方法属于类,而不是类的任何特定实例。
    静态方法可以直接通过类名调用,而无需创建类的实例。
    静态方法只能访问静态数据成员(即静态变量和其他静态方法),不能访问非静态数据成员。

public class MathUtils {  

    public static int add(int a, int b) {  

        return a + b;  

    }  

}
静态代码块(Static Block):
    静态代码块是类的一部分,它在类被加载时执行,而且只执行一次。
    静态代码块通常用于初始化静态变量。

public class Example {  

    static {  

        System.out.println("Class is being loaded.");  

    }  

}
静态内部类(Static Nested Classes):
    静态内部类是一个定义在另一个类内部的类,但它不需要外部类的实例就可以被实例化。
    静态内部类可以访问外部类的静态成员,但不能访问非静态成员。

public class Outer {  

    public static class Inner {  

        // ...  

    }  

}
静态导入(Static Imports):
    从Java 5开始,static 关键字还可以用于导入静态成员(如静态方法和静态变量)。
    这允许你在代码中直接使用静态成员,而无需使用类名作为前缀。

import static java.lang.Math.PI;  

import static java.lang.Math.sin;  

  

public class Test {  

    public static void main(String[] args) {  

        double value = sin(PI);  

        System.out.println(value);  

    }  

}

总的来说,static 关键字在Java中提供了多种用途,允许开发人员更灵活地组织和控制代码。

应用举例:

  • 观察下例,理解为什么有些method 例如go可以直接调用,而有些method需要创建object后调用比如run
public class student {
    //static静态属性
    private static int age;//static静态的变量
    private double score;//静态的变量

    public void run() {
    }
    public static void go() {

    }
    public static void main(String[] args) {
        student s1= new student();
        System.out.println(s1.age);//通过对象s1去调用age
        System.out.println(s1.score);//通过对象s1去调用score
        System.out.println(student.age);//age为static的变量,所以student class调的动
        //System.out.println(student.score);//score不是static的变量,所以一写直接报错,student class调不动

        s1.run();//run没法直接调用,run();这样无法调用,需要寄托在对象上
        go();//因为go是static的 而且目前就在student里面,所以直接调
        student.go();//这句其实等于上面一句
     
    }
}


输出结果

0
0.0
0

  • 观察下例,代码块★☆✬ 部分的先后输出顺序是什么?为什么。

小tips:以前讲过的static伴随着class在程序最开始运行时候就加载了,只加载一次。


public class human {

    {
        //匿名代码块
        System.out.println("★ 匿名代码块");
    }
    static {
        //静态代码块
        System.out.println("☆ 静态代码块");
    }
    public human(){
        System.out.println(" ✬ 这里是构造方法");
    }

    public static void main(String[] args) {
        human x= new human();
        System.out.println("====分隔线=====");
        human y= new human();
    }
}



运行结果

☆ 静态代码块
★ 匿名代码块
 ✬ 这里是构造方法
====分隔线=====
★ 匿名代码块
 ✬ 这里是构造方法


  • 随机数生成

import static java.lang.Math.random;
import static java.lang.Math.PI;
//这叫做静态导入包

//思考:为什么写成import java.lang.Math.random;会报错
//注意这里不加static是无法导入成功的
//通过final修饰的class不能再有子类;ctrl+鼠标双击Math有惊喜

public class non_s {
    public static void main(String[] args) {
        System.out.println(Math.random());//生成随机数标准写法
        System.out.println(random());//生成随机数简易写法,配合import使用
		    System.out.println(PI);
    }
}


结果运行:
//会产生类似下面的随机数

0.6666269235416441
0.18718877180311122
3.141592653589793

你可能感兴趣的:(java,学习,开发语言)