zoukankan      html  css  js  c++  java
  • java中的static关键词

      以下来自:http://www.cnblogs.com/codc-5117/archive/2011/12/04/2275298.html

      Static基本规则:
                 (1)一个类的静态方法只能访问静态属性。
                 (2)一个类的静态方法不能直接调用非静态方法。
                 (3)如果访问权限允许,static属性和方法可以使用对象加’.’方式调用,当然也可以使用实例加’.’方式调用。
                 (4)静态方法中不存在当前对象,所以不能使用this,当然也不能使用super。
                 (5)静态方法不能被非静态方法覆盖。
                 (6)构造方法不允许被声明为static的。

    学习笔记,材料来自:

    http://www.cnblogs.com/dolphin0520/p/3799052.html

    static关键词,可以加在方法上,成员变量上,代码块。 类就不要想了。

    1. static方法

      static方法可以在类没有实例化的情况话直接访问。 在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

    2. static变量

      static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

      static成员变量的初始化顺序按照定义的顺序进行初始化。

      static变量只会有一个内存空间,虽然后多个实例,但这些实例中的static变量会共享同一个内存空间。所以静态变量的值发生变更要格外注意,以免造成不必要的“bug”。

      static变量是在类装载的时候就被初始化的。

    3. static代码块

      可以用来初始化一些成员信息。

    public class testClassA {
    	public static int val = 1;
    	static {
    		System.err.println("11:" + val);
    		val = 2;
    		System.err.println("22:" + val);
    	}
    	public static int getVal() {
    		return val;
    	}
    }
    
    System.err.println(testClassA.getVal());
    

      结果:

    11:1
    22:2
    2
    

    4. static内部类

    以下来自:http://blog.csdn.net/jiangxinyu/article/details/8177326

    为何要用内部类?
    1). 内部类一般只为其外部类使用;
    2). 内部类提供了某种进入外部类的窗户;
    3). 也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外部类是否已经继承了某个接口。因此,内部类使多重继承的解决方案变得更加完整。

    public class ClassA {
    	public static String val = "1";
    	
    	public  ClassA() {
    	}
    	public static class ClassB {//静态内部类
    		public static int bVal = 2;
    	}
    	
    	public class ClassC {
    		public ClassC()
    		{
    			
    		}
    		
    		private void name() {
    			System.err.println("abc");
    		}
    	}
    }
    

      

    5. static静态导入 

    静态导包是为了简化代码,提高代码的阅读性,但是如果滥用阅读性会很糟糕。

    对于静态导入,一定要遵循两个规则(来自下面的资料):

    • 不使用*(星号)通配符,除非是导入静态常量类(只包含常量的类或接口)。
    • 方法名是具有明确、清晰表象意义的工具类。

    更多static静态导包资料:http://www.weixueyuan.net/view/6101.html

    import static java.lang.System.*;
    
    public class testClass {
        public static void main(String[] args) {
            err.println();//这里就不用system.err.println()了。
        }
    }

    6. 实现单例

    参考资料:http://devbean.blog.51cto.com/448512/203501/

    public class ClassA {
    
    	private static ClassA instance = null;
    
    	public static synchronized ClassA getInstance() {//静态方法生成实例 懒汉模式  用到的时候再实例化
    		if (instance == null) {
    			instance = new ClassA();
    		}
    		return instance;
    	}
    
    	public void test() {
    		System.err.println(1);
    	}
    }
    

      

    public class ClassA {
    
    	private static ClassA instance = new ClassA();// 饿汉模式,直接生成实例
    
    	public static ClassA getInstance() {
    
    		return instance;
    	}
    
    	public void test() {
    		System.err.println(1);
    	}
    }
    

    //使用volatile关键词,单例模式最优解决方案,不支持旧版jdk

    public class ClassA {
    
    	private volatile static ClassA instance = null;
    
    	public static ClassA getInstance() {
    		if (instance == null) {
    			synchronized (ClassA.class) {
    				if (instance == null) {
    					instance = new ClassA();
    				}
    			}
    		}
    		return instance;
    	}
    
    	public void test() {
    		System.err.println(1);
    	}
    }
    

      

    //静态内部类实现单例模式 兼容旧版jdk
    public class ClassA {
    	private ClassA() {
    
    	}
    
    	private static class InstanceClass {
    		private static ClassA instance = new ClassA();
    	}
    
    	public static ClassA getInstance() {
    		return InstanceClass.instance;
    	}
    
    	public void test() {
    		System.err.println(1);
    	}
    }
    

      

    ClassA.getInstance().test(); //使用方法
    

      

    7. 一些注意事项:

      1. 静态的成员变量可以被实例化后的类对象访问,静态方法也可以被对象访问,但是会有警告。

      2. 局部变量不可以static。

      3. static代码块优先于构造函数。

  • 相关阅读:
    JSON的一个例子(代码来源于网上)
    浅谈Event Flow、Process、Method及其Applications
    JS中object与constructor的分析
    浅谈for...in与for....of
    浅谈语言的过去与未来
    正则表达式的四个小应用
    初步了解DOM与BOM
    String Method的字符串变换的一个例子
    update 批量更新
    一个 Tomcat下两个项目。
  • 原文地址:https://www.cnblogs.com/yasire/p/5280154.html
Copyright © 2011-2022 走看看