美文网首页
java static 详解

java static 详解

作者: 在中国喝Java | 来源:发表于2023-01-04 10:42 被阅读0次

    1、static目的
    java中的static关键字主要用于内存管理。

    2、static范围
    使用范围:java static关键字可以用在变量、方法、代码块和嵌套类伤。

    作用范围:static关键字属于类,而不是类的实例。

    静态(static)修饰如下:

    变量:称为类变量、静态变量
    方法:称为类方法、静态方法
    代码块:称为静态代码块
    嵌套类:称为静态内部类
    3、静态变量
    类的成员变量可以分为以下两种:

    静态变量(或称为类变量),指被 static 修饰的成员变量。
    实例变量,指没有被 static 修饰的成员变量。
    静态变量与实例变量的区别如下:
    1)静态变量

    运行时,Java 虚拟机只为静态变量分配一次内存,加载类过程中完成静态变量的内存分配。
    在类的内部,可以在任何方法内直接访问静态变量。
    在其他类中,可以通过类名访问该类中的静态变量。
    2)实例变量

    每创建一个实例,Java 虚拟机就会为实例变量分配一次内存。
    在类的内部,可以在非静态方法中直接访问实例变量。
    在本类的静态方法或其他类中则需要通过类的实例对象进行访问。
    静态变量在类中的作用如下:

    静态变量可以被类的所有实例共享,因此静态变量可以作为实例之间的共享数据,增加实例之间的交互性。
    如果类的所有实例都包含一个相同的常量属性,则可以把这个属性定义为静态常量类型,从而节省内存空间。例如,在类中定义一个静态常量 PI。
    静态变量的好处:它能使程序存储器高效(即它节省内存)。

    class Student8 {
    int rollno;
    String name;
    static String college = "ITS";

    Student8(int r, String n) {
        rollno = r;
        name = n;
    }
    
    void display() {
        System.out.println(rollno + " " + name + " " + college);
    }
    
    public static void main(String args[]) {
        Student8 s1 = new Student8(111, "Karan");
        Student8 s2 = new Student8(222, "Aryan");
    
        s1.display();
        s2.display();
    }
    

    }//原文出自【易百教程】,商业转载请联系作者获得授权,非商业请保留原文链接:https://www.yiibai.com/java/static-keyword-in-java.html

    4、静态方法
    同成员变量,成员方法也可以分为以下两种:

    静态方法(或称为类方法),指被 static 修饰的成员方法。
    实例方法,指没有被 static 修饰的成员方法。
    静态方法与实例方法的区别:

    静态方法,属于类,而不属于类的对象。
    1)它通过类直接被调用,无需创建类的对象。
    2)静态方法中,不能使用 this 关键字,也不能直接访问所属类的实例变量和实例方法;
    3)静态方法中,可以直接访问所属类的静态变量和静态方法。
    4)同this 关键字,super 关键字也与类的实例相关,静态方法中不能使用 super 关键字。
    实例方法,可直接访问所属类的静态变量、静态方法、实例变量和实例方法。
    静态方法与静态变量好处:

    1. 属于类级别,无需创建对象就即可直接使用,使用方便。

    2. 全局唯一,内存中唯一,静态变量可以唯一标识某些状态。

    3. 类加载时候初始化,常驻在内存,调用快捷方便。

    静态方法与静态变量缺点:

    1. 静态方法不能调用非静态的方法和变量。

    2.不能使用this和super关键字。

    静态方法与静态变量适用场景:

    1. 静态方法,最适合工具类中方法的定义;比如文件操作,日期处理方法等。

    2.静态方法,适合入口方法定义;比如单例模式,因从外部拿不到构造函数,所以定义一个静态的方法获取对象非常有必要。

    3.静态变量适合全局变量的定义;举例:用一个布尔型静态成员变量做控制标志。

    5、静态代码块
    定义:静态代码块,是 Java 类中的 static{ } 修饰的代码。

    作用:用于类初始化时,为类的静态变量赋初始值,提升程序性能。
    静态代码块的特点如下:

    静态代码块,有点类似于一个方法,但不可以存在于任何方法体内。
    静态代码块,可以置于类中的任何地方,类中可以有多个静态初始化块。
    Java 虚拟机在加载类时执行,将只需要进行一次初始化的操作放在 static 代码块。
    类中含多个静态代码块,Java虚拟机将按它们在类中出现的顺序依次执行,且都执行一次。
    同静态代码块与静态,不能直接访问类的实例变量和实例方法,需通过类的对象访问。
    public class StaticCode {
    public static int count = 0;
    {
    count++;
    System.out.println("非静态代码块 count=" + count);
    }
    static {
    count++;
    System.out.println("静态代码块1 count=" + count);
    }
    static {
    count++;
    System.out.println("静态代码块2 count=" + count);
    }

    public static void main(String[] args) {
        System.out.println("*************** StaticCode1 执行 ***************");
        StaticCode sct1 = new StaticCode();
        System.out.println("*************** StaticCode2 执行 ***************");
        StaticCode sct2 = new StaticCode();
    }
    

    }

    6、静态类
    java中一个类要被声明为static的,只有一种情况,就是静态内部类(内嵌类)。如在外部类声明为static的,程序会编译都不会通过。

    1、静态内部类,跟静态方法一样,只能访问静态成员变量和方法,不能访问非静态方法和属性。

    2、普通内部类,可以访问任意外部类的成员变量和方法。

    3、静态内部类,可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法。

    4、静态内部类,可以单独初始化。

    Inner i = new Outer.Inner();
    普通内部类初始化:

    Outer o = new Outer();
    Inner i = o.new Inner();
    适用场景:当外部类需要使用内部类,而内部类无需外部类资源,并且内部类可以单独创建时,考虑采用静态内部类的设计,在知道如何初始化静态内部类。

    public class Outer {
    private String name;
    private int age;

    public static class Builder {
        private String name;
        private int age;
    
        public Builder(int age) {
            this.age = age;
        }
    
        public Builder withName(String name) {
            this.name = name;
            return this;
        }
    
        public Builder withAge(int age) {
            this.age = age;
            return this;
        }
    
        public Outer build() {
            return new Outer(this);
        }
    }
    
    private Outer(Builder b) {
        this.age = b.age;
        this.name = b.name;
    }
    

    }

    静态内部类,调用外部类的构造函数来构造外部类;静态内部类可被单独初始化,于是在外部就可以有下面的实现:

    public Outer getOuter()
    {
    Outer outer = new Outer.Builder(2).withName("Yang Liu").build();
    return outer;
    }
    静态类总结:

    1.如果类的构造器或静态工厂中有多个参数,设计这样类时,最好使用Builder模式,特别是当大多数参数都是可选的时候。

    2.如果现在不能确定参数的个数,最好一开始就使用构建器即Builder模式。

    相关文章

      网友评论

          本文标题:java static 详解

          本文链接:https://www.haomeiwen.com/subject/uhprcdtx.html