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
                             
    

      


      

  • 相关阅读:
    vmware 安装 centos7
    Centos7 开机启动命令行模式
    Get、Post 提交的乱码问题
    RabbitMQ消息队列(一):详细介绍
    spring boot 整合 RabbitMq (注解)
    CF Tavas and Nafas
    HDU 2295 Radar (DLX + 二分)
    CF Drazil and Factorial (打表)
    CF Drazil and His Happy Friends
    CF Drazil and Date (奇偶剪枝)
  • 原文地址:https://www.cnblogs.com/itcqx/p/5519464.html
Copyright © 2011-2022 走看看