zoukankan      html  css  js  c++  java
  • 关于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.*”,这只有在我们要多次使用一个类的静态变量时,才这样写,但这种写法的可读性不好。

  • 相关阅读:
    1052 Linked List Sorting (25 分)
    1051 Pop Sequence (25 分)
    1050 String Subtraction (20 分)
    1049 Counting Ones (30 分)
    1048 Find Coins (25 分)
    1047 Student List for Course (25 分)
    1046 Shortest Distance (20 分)
    1045 Favorite Color Stripe (30 分)
    1044 Shopping in Mars (25 分)
    1055 The World's Richest (25 分)
  • 原文地址:https://www.cnblogs.com/lwj820876312/p/7248634.html
Copyright © 2011-2022 走看看