• 关于Java的静态:静态类、静态方法、静态变量、静态块等


    原文地址:Java static keyword - Class, Method, Variable, Block, import - JournalDev

    很少看到文章能把静态这个问题解释的很清楚,有些文章绕来绕去很复杂。这篇解释静态问题的小文通透而容易理解。所以我把它翻译一下,让大家能好好理解关于静态。

    其实对于Java静态的引入,考虑目标是使用和运行的便捷,不需要再实例化,特别是一些工具性质的代码段。当不用再实例化时,就可以相当于直接使用,增加了公共代码复用的便捷性。

    从Java8开始,还支持了静态接口,使得接口的使用更便捷和灵活。另外对于接口还支持了默认方法,也就是如果使用这种定义也可以在方法中加入代码了。接口在程序中的作用越来越重要了。

    -------------------------------以下说明Java的静态问题--------------

    Java的static关键字,在Java程序中经常会使用的。

    一般来说,Java中的静态概念用于在Java中创建类级别的变量,静态变量和静态方法是类的一部分,而不是类的实例。

    关于Java的静态

    Java的静态形式有5中类型:静态变量、静态方法、静态块、内部静态类和静态接口方法(Java8以上支持)

    1、静态变量

    我们用Static表示变量的级别,一个类中的静态变量,不属于类的对象或者实例。因为静态变量与所有的对象实例共享,因此他们不具线程安全性。

    通常,静态变量常用final关键来修饰,表示通用资源或可以被所有的对象所使用。如果静态变量未被私有化,可以用“类名.变量名”的方式来使用。

    //static variable example
        private static int count;
        public static String str;
        public static final String DB_USER = "myuser";
    

    2、静态方法

    与静态变量一样,静态方法是属于类而不是实例。

    一个静态方法只能使用静态变量和调用静态方法。通常静态方法通常用于想给其他的类使用而不需要创建实例。例如:Collections class(类集合)。

    Java的包装类和实用类包含许多静态方法。main()方法就是Java程序入口点,是静态方法。

    //static method example
        public static void setCount(int count) {
            if(count > 0)
            StaticExample.count = count;
        }
        
        //static util method
        public static int addInts(int i, int...js){
            int sum=i;
            for(int x : js) sum+=x;
            return sum;
        }
    

    从Java8以上版本开始也可以有接口类型的静态方法了。

    3、静态块

    Java的静态块是一组指令在类装载的时候在内存中由Java ClassLoader执行。

    静态块常用于初始化类的静态变量。大多时候还用于在类装载时候创建静态资源。

    Java不允许在静态块中使用非静态变量。一个类中可以有多个静态块,尽管这似乎没有什么用。静态块只在类装载入内存时,执行一次。

    static{
            //can be used to initialize resources when class is loaded
            System.out.println("StaticExample static block");
            //can access only static variables and methods
            str="Test";
            setCount(2);
        }
    

    4、静态类

    Java可以嵌套使用静态类,但是静态类不能用于嵌套的顶层。

    静态嵌套类的使用与其他顶层类一样,嵌套只是为了便于项目打包。

    让我们来看一个使用静态的样例程序:

    StaticExample.java

    package com.journaldev.misc;
    
    public class StaticExample {
    
        //static block
        static{
            //can be used to initialize resources when class is loaded
            System.out.println("StaticExample static block");
            //can access only static variables and methods
            str="Test";
            setCount(2);
        }
        
        //multiple static blocks in same class
        static{
            System.out.println("StaticExample static block2");
        }
        
        //static variable example
        private static int count; //kept private to control it's value through setter
        public static String str;
        
        public int getCount() {
            return count;
        }
    
        //static method example
        public static void setCount(int count) {
            if(count > 0)
            StaticExample.count = count;
        }
        
        //static util method
        public static int addInts(int i, int...js){
            int sum=i;
            for(int x : js) sum+=x;
            return sum;
        }
    
        //static class example - used for packaging convenience only
        public static class MyStaticClass{
            public int count;
            
        }
    
    }
    

    接下来,在测试程序中使用这些静态变量、静态方法和静态类。

    TestStatic.java

    package com.journaldev.misc;
    
    public class TestStatic {
    
        public static void main(String[] args) {
            StaticExample.setCount(5);
            
            //non-private static variables can be accessed with class name
            StaticExample.str = "abc";
            StaticExample se = new StaticExample();
            System.out.println(se.getCount());
            //class and instance static variables are same
            System.out.println(StaticExample.str +" is same as "+se.str);
            System.out.println(StaticExample.str == se.str);
            
            //static nested classes are like normal top-level classes
            StaticExample.MyStaticClass myStaticClass = new StaticExample.MyStaticClass();
            myStaticClass.count=10;
            
            StaticExample.MyStaticClass myStaticClass1 = new StaticExample.MyStaticClass();
            myStaticClass1.count=20;
            
            System.out.println(myStaticClass.count);
            System.out.println(myStaticClass1.count);
        }
        
    }
    

    执行结果如下:

    原文地址:Java static keyword - Class, Method, Variable, Block, import - JournalDev

    很少看到文章能把静态这个问题解释的很清楚,有些文章绕来绕去很复杂。这篇解释静态问题的小文通透而容易理解。所以我把它翻译一下,让大家能好好理解关于静态。

    其实对于Java静态的引入,考虑目标是使用和运行的便捷,不需要再实例化,特别是一些工具性质的代码段。当不用再实例化时,就可以相当于直接使用,增加了公共代码复用的便捷性。

    从Java8开始,还支持了静态接口,使得接口的使用更便捷和灵活。另外对于接口还支持了默认方法,也就是如果使用这种定义也可以在方法中加入代码了。接口在程序中的作用越来越重要了。

    -------------------------------以下说明Java的静态问题--------------

    Java的static关键字,在Java程序中经常会使用的。

    一般来说,Java中的静态概念用于在Java中创建类级别的变量,静态变量和静态方法是类的一部分,而不是类的实例。

    关于Java的静态

    Java的静态形式有5中类型:静态变量、静态方法、静态块、内部静态类和静态接口方法(Java8以上支持)

    1、静态变量

    我们用Static表示变量的级别,一个类中的静态变量,不属于类的对象或者实例。因为静态变量与所有的对象实例共享,因此他们不具线程安全性。

    通常,静态变量常用final关键来修饰,表示通用资源或可以被所有的对象所使用。如果静态变量未被私有化,可以用“类名.变量名”的方式来使用。

    //static variable example
        private static int count;
        public static String str;
        public static final String DB_USER = "myuser";
    

    2、静态方法

    与静态变量一样,静态方法是属于类而不是实例。

    一个静态方法只能使用静态变量和调用静态方法。通常静态方法通常用于想给其他的类使用而不需要创建实例。例如:Collections class(类集合)。

    Java的包装类和实用类包含许多静态方法。main()方法就是Java程序入口点,是静态方法。

    //static method example
        public static void setCount(int count) {
            if(count > 0)
            StaticExample.count = count;
        }
        
        //static util method
        public static int addInts(int i, int...js){
            int sum=i;
            for(int x : js) sum+=x;
            return sum;
        }
    

    从Java8以上版本开始也可以有接口类型的静态方法了。

    3、静态块

    Java的静态块是一组指令在类装载的时候在内存中由Java ClassLoader执行。

    静态块常用于初始化类的静态变量。大多时候还用于在类装载时候创建静态资源。

    Java不允许在静态块中使用非静态变量。一个类中可以有多个静态块,尽管这似乎没有什么用。静态块只在类装载入内存时,执行一次。

    static{
            //can be used to initialize resources when class is loaded
            System.out.println("StaticExample static block");
            //can access only static variables and methods
            str="Test";
            setCount(2);
        }
    

    4、静态类

    Java可以嵌套使用静态类,但是静态类不能用于嵌套的顶层。

    静态嵌套类的使用与其他顶层类一样,嵌套只是为了便于项目打包。

    让我们来看一个使用静态的样例程序:

    StaticExample.java

    package com.journaldev.misc;
    
    public class StaticExample {
    
        //static block
        static{
            //can be used to initialize resources when class is loaded
            System.out.println("StaticExample static block");
            //can access only static variables and methods
            str="Test";
            setCount(2);
        }
        
        //multiple static blocks in same class
        static{
            System.out.println("StaticExample static block2");
        }
        
        //static variable example
        private static int count; //kept private to control it's value through setter
        public static String str;
        
        public int getCount() {
            return count;
        }
    
        //static method example
        public static void setCount(int count) {
            if(count > 0)
            StaticExample.count = count;
        }
        
        //static util method
        public static int addInts(int i, int...js){
            int sum=i;
            for(int x : js) sum+=x;
            return sum;
        }
    
        //static class example - used for packaging convenience only
        public static class MyStaticClass{
            public int count;
            
        }
    
    }
    

    接下来,在测试程序中使用这些静态变量、静态方法和静态类。

    TestStatic.java

    package com.journaldev.misc;
    
    public class TestStatic {
    
        public static void main(String[] args) {
            StaticExample.setCount(5);
            
            //non-private static variables can be accessed with class name
            StaticExample.str = "abc";
            StaticExample se = new StaticExample();
            System.out.println(se.getCount());
            //class and instance static variables are same
            System.out.println(StaticExample.str +" is same as "+se.str);
            System.out.println(StaticExample.str == se.str);
            
            //static nested classes are like normal top-level classes
            StaticExample.MyStaticClass myStaticClass = new StaticExample.MyStaticClass();
            myStaticClass.count=10;
            
            StaticExample.MyStaticClass myStaticClass1 = new StaticExample.MyStaticClass();
            myStaticClass1.count=20;
            
            System.out.println(myStaticClass.count);
            System.out.println(myStaticClass1.count);
        }
        
    }
    

    执行结果如下:

    StaticExample static block
    StaticExample static block2
    5
    abc is same as abc
    true
    10
    20
    

    可见,静态块代码是最先被执行的,而且是只在类载入内存时执行。

    静态import

    一般,Java允许用静态成员使用类引用,从Java1.5开始,我们可以使用静态import而不用类引用。下面是一个简单的静态import的例子。

    package com.journaldev.test;
    
    public class A {
    
    	public static int MAX = 1000;
    	
    	public static void foo(){
    		System.out.println("foo static method");
    	}
    }
    
    package com.journaldev.test;
    
    import static com.journaldev.test.A.MAX;
    import static com.journaldev.test.A.foo;
    
    public class B {
    
    	public static void main(String args[]){
    		System.out.println(MAX); //normally A.MAX
    		foo(); // normally A.foo()
    	}
    }
    

    第2段代码用了import语句,导入静态类使用import static,后面跟着的是静态成员的全称。

    为了导入一个类中的所有的静态成员,可以这样写“import static com.journadev.test.A.*”,这只有在我们要多次使用一个类的静态变量时,才这样写,但这种写法的可读性不好。

    StaticExample static block

    StaticExample static block2
    5
    abc is same as abc
    true
    10
    20
    

    可见,静态块代码是最先被执行的,而且是只在类载入内存时执行。

    静态import

    一般,Java允许用静态成员使用类引用,从Java1.5开始,我们可以使用静态import而不用类引用。下面是一个简单的静态import的例子。

    package com.journaldev.test;
    
    public class A {
    
    	public static int MAX = 1000;
    	
    	public static void foo(){
    		System.out.println("foo static method");
    	}
    }
    
    package com.journaldev.test;
    
    import static com.journaldev.test.A.MAX;
    import static com.journaldev.test.A.foo;
    
    public class B {
    
    	public static void main(String args[]){
    		System.out.println(MAX); //normally A.MAX
    		foo(); // normally A.foo()
    	}
    }
    

    第2段代码用了import语句,导入静态类使用import static,后面跟着的是静态成员的全称。

    为了导入一个类中的所有的静态成员,可以这样写“import static com.journadev.test.A.*”,这只有在我们要多次使用一个类的静态变量时,才这样写,但这种写法的可读性不好。

  • 相关阅读:
    SQL Server索引进阶:第十二级,创建,修改,删除
    SQL Server索引进阶第十一篇:索引碎片分析与解决
    Object.create()和new object()和{}的区别
    vue 前后端分离nginx部署
    实现组件props双向绑定解决方案
    prop不同数据类型设置默认值
    vue + element ui 阻止表单输入框回车刷新页面
    Vue.js中 watch(深度监听)的最易懂的解释
    vue-resource和axios区别
    JS中 reduce() 的用法
  • 原文地址:https://www.cnblogs.com/lwj820876312/p/7248634.html
Copyright © 2020-2023  润新知