zoukankan      html  css  js  c++  java
  • Java static的用法以及原理(06)

    静态:static

    用法:是一个修饰符,用于修饰成员(成员变量,成员函数),

      当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调:类名.静态成员

        类名.静态成员

    存在:方法区,共享区,数据区(非堆内存、栈内存的另一个存储区),Static 块仅在该类被加载时执行一次。

     

    static特点:

    1,随着类的加载而加载,也就是说静态会随着类的消失而消失,说明他的生命周期最长

    2,优先于对象的存在。(静态先存在,对象后存在。)

    3,被所有对象所共享

    4,可以直接被类名调用

      由于静态static不依赖于任何对象就可以进行访问,因此对于静态来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

      内部类中不能存在static修饰的成员,因为static随着类加载产生,内部类依附于宿主类,系统加载:宿主类-->静态-->内部类,而内部类的静态是随着内部类加载产生,与加载类就加载static矛盾,所以内部类中不能存在static修饰

    实例变量和类变量的区别:
    1,存放位置。
      类变量随着类的加载而存在于方法区中。
      实例变量随着对象的建立而存在于堆内存中。
    2,生命周期:
      类变量生命周期最长,随着类的消失而消失。
      实例变量生命周期随着对象的消失而消失。

    静态使用注意事项:

    1,静态方法只能访问静态成员,非静态方法既可以访问静态也可以访问非静态。(Java虚拟机(JVM)加载类时,就会执行该static,静态优先于其他产生对象产生)。

    2,静态方法中不可定义this,super等关键字:

        (this:this代表当前对象,static于类加载的时候存在优先于实例对象的产生,static调用非静态时并未产生对象,所以this不代表任何对象为null,未进行初始化操作。)

    3,主函数是静态方法。 

    静态有利有弊:

    利:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一格对象中都存储一份。可以直接被类名调用。

    弊:生命周期过长,访问出现局限性(静态虽好,只能访问静态) 

    static和final一块用表示什么 
    1,static final用来修饰成员变量和成员方法,可简单理解为"全局常量"
    2,对于变量,表示一旦给值就不可修改,并且通过类名可以访问。 
    3,对于方法,表示不可覆盖,并且可以通过类名直接访问。

    类成员变量:

    static修饰:静态变量或类变量

    无static修饰:实例变量

      静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存(方法区,共享区,数据区),在加载类的过程中完成静态变量的内存分配,可用类名.成员,当然也可以通过对象来访问(但是这是不推荐的,对象产生新的开辟内存空间,static优先于对象的产生,节省内存)。 

      不能直接访问所属类的实例变量和实例方法

      static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

    什么时候使用静态:

      因为静态修饰的内容有成员变量和函数。

      使用静态变量(类变量):当对象中出现共享数据时,该数据被静态所修饰。对象中的特有数据要定义成非静态存在于堆内存中。

      使用静态函数:当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的

    静态代码块。
      格式:
        static{
            静态代码块中的执行语句。
          }

      特点:随着类的加载而执行,只执行一次,并优先于主函数。用于给类进行初始化的。

    class StaticCode
      {
    	int num = 9;
    	StaticCode()
    	{
    		System.out.println("b");
    	}
    
    	static
    	{
                //只执行一次,并优先于主函数。
        
    		System.out.println("a");
    	}
    	{
    		System.out.println("c"+this.num);
    	}
    
    	StaticCode(int x)
    	{
    		System.out.println("d");
    	}
    	public static void show()
    	{
    		System.out.println("show run");
    	}
    }
    
    class StaticCodeDemo 
      {
    	static
    	{
    		System.out.println("b");//(1)
    	}
    	public static void main(String[] args) 
    	{
    	
                //尽管new StaticCode两次,但是静态代码块只执行一次
    	 (1)new StaticCode();
    		 new StaticCode();
    		 System.out.println("over");   //b c a over     
                    //构造代码块优先于对象产生
                    //优先级:静态代码库>代码块>对象产生
    	  (2)new StaticCode(4);//b c a c9 d 
    		//StaticCode.show();//b c a  show run c9 
                (3)当构造代码对象为空时,没有任何意义,未使用该类,所以哪怕是静态成员也不存在
    		//StaticCode s = null;
               (4)
    		//s = new StaticCode();//b c a  c9 b
    
    
    	}
    	static
    	{
    		System.out.println("c");//(2)
    	}
    }
    //d:>java0217day06>java StaticCodeDemo 先加载b c
                             
    

      


      

  • 相关阅读:
    不可小视视图对效率的影响力
    Maximum Margin Planning
    PhysicsBased Boiling Simulation

    Learning Behavior Styles with Inverse Reinforcement Learning
    Simulating Biped Behaviors from Human Motion Data
    Nearoptimal Character Animation with Continuous Control
    Apprenticeship Learning via Inverse Reinforcement Learning
    回报函数学习的学徒学习综述
    Enabling Realtime Physics Simulation in Future Interactive Entertainment
  • 原文地址:https://www.cnblogs.com/itcqx/p/5519464.html
Copyright © 2011-2022 走看看