zoukankan      html  css  js  c++  java
  • java学习面向对象值static

    讲完了this这个关键字,我们继续前进,这节我们讲另外一个比较重要的东东,java当中的static,在main函数前面这个家伙都在那里一直挺着,你瞅见了么,你就不好奇么,你就不想知道他杵在那里做什么么?好,我们来看下,他到底是作什么的。

    看一下我们的代码:

    class StaticDemo
    {
    
    	int name;
    	String country;
    	void speak()
    	{
    
    		System.out.print(name+"sssss"+country);
    
    	}
    
    }
    
    class StaticShowDemo
    {
    
    	public static void main(String[] args) {
    			
    		StaticDemo sd = new StaticDemo();	
    
    	}
    
    }
    

      这里我们来考虑一种情况,当然这种情况会是经常有的,比如我们实例化了StaticDemo这个类的时候发现好多的类country都是一样的都是'CN',我们一个个的声明,就算我们初始化的时候默认声明country='cn',那么当你定义多个实例的时候,你会不会发现这个样子,堆内存的内存空间很浪费,保存同一个空间要拷贝这么多份,浪费就是犯罪。这里java为我们提供了一个static关键词来缓解这种状况。

      static的作用之一,就是为多个类的实例提供数据的共享,也就是说这个类中所有的对象用的一个static修饰的一个变量都是指向同一个地址。并且这个变量并不存在于堆空间当中,他在另外一块空间,叫做方法空间。

      那么这个时候,我们想要定义一个共享变量的时候,前面加static修饰就可以了。代码体现:

    class StaticDemo
    {
    
    	int name;
    	static String country;
    	void speak()
    	{
    
    		System.out.print(name+"sssss"+country);
    
    	}
    
    }
    

      这个时候country就已经跟他所属的类不在一起了,又自己开辟了一个空间进去了。

      Static 除了上述的共享内存比较特殊之外,他还有一个比较特殊的地方就是,他可以在类不示例化的情况下直接被调用,这个也证明了他存储的位置比较特殊。那么我们从这一点来思考一下,既然他能够在不进行实例化也就是不产生对象的情况下,可以被调用。从这一点我们就可以看出,他先于所有对象而存在着。也就是说这个类存在着这个static(专业名词叫做静态变量)变量就一直存在着,直到JVM虚拟机的消亡而结束。

    class StaticDemo
    {
    
    	int name;
    	static String country = "CN";
    	void speak()
    	{
    
    		System.out.print(name+"sssss"+country);
    
    	}
    
    }
    
    class StaticShowDemo
    {
    
    	public static void main(String[] args) {
    			
    		System.out.print(StaticDemo.country);//这里我们并没有实例化类,但是static修饰的静态变量我们可以直接调用。
    
    	}
    
    }
    

      static在内存当中体现内存图:

    static理解的一个很好的生活当中的例子:

    比如我们去上班,在我们上班的时候只有一个饮水机,每个人都有每个人的一个特殊的杯子。这里的static就是一个静态的,而杯子就是动态的。如果我们每个人都分配一个饮水机是不是很多余,相反如果我么都用同一个杯子的话,又太不个性(关键是不卫生啊),在我们没有去上班的时候,饮水机就已经存在了,然后我们带着杯子就去上班了。

    所以以上也是静态变量还有动态变量的区别,静态变量强调的是静态共享,而动态变量则强调的是各个对象的特殊性。

    Static的特点:

    1、处于一块特殊的区域(本地方法区),能够提供数据共享的需要,能够被所有的对象调用。

    2、类在不被实例化的情况下,依然可以调用。

    3、可以作为修饰符修饰静态变量,修饰成员变量。

    4、static多了一种调用方式,可以被类直接调用,调用的方式是类名.静态变量

    5、static存储的是共享数据,而对象当中的动态变量是各个对象特有的。

    动态变量(实例变量)和静态变量

    class StaticDemo
    {
    
    	int name;//动态变量、实例变量
    	static String country = "CN";//静态变量
    	void speak()
    	{
    
    		System.out.print(name+"sssss"+country);
    
    	}
    
    }
    

    成员变量和动态变量的区别:

    一、两个变量的生命周期不一样

      1、成员变量随着对象的创建而创建,随着对象的回收而消失。

      2、静态变量随着类的加载而存在,随着类的消失而消失。(类什么时候消失呢?一般随着JVM结束而结束,在类加载的类很多的时候,类本身就是对象,java会有一种机制来回收不经常用的类,再用的时候再重新加载,有自己的优化机制)。这也是静态变量的一个弊端,因为类不消失,他就一直存在。所以不要走极端,分开看待。

    二、存储的位置不一样,

      1、成员变量,存在与堆当中。

      2、静态变量存在于本地方法区内。

    三、别名不一样

      1、成员变量叫做动态变量或者实例变量

      2、静态变量叫做类变量

    四、调用方式不一样

      1、成员变量必须被对象所调用,也就是说必须对象创建完之后才能够调用。

      2、静态变量可以被类直接调用。

    这个就是成员变量还有类变量的一些区别。

  • 相关阅读:
    服务器监控
    hadoop
    tomcat7 配置
    tomcat
    列表加载
    自适应网页设计(Responsive Web Design)
    Android Native 代码NDK开发学习笔记
    NDK开发历程(一):android native code的调试方法
    Android原生(Native)C开发之一:环境搭建篇
    ajaxfileupload 传参数
  • 原文地址:https://www.cnblogs.com/sunchuanzhen/p/3330850.html
Copyright © 2011-2022 走看看