• 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、静态变量可以被类直接调用。

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

  • 相关阅读:
    linux 解压tgz 文件指令
    shell 脚本没有执行权限 报错 bash: ./myshell.sh: Permission denied
    linux 启动solr 报错 Your Max Processes Limit is currently 31202. It should be set to 65000 to avoid operational disruption.
    远程查询批量导入数据
    修改 MZTreeView 赋权节点父节点选中子节点自动选中的问题
    关于乱码的问题解决记录
    我的网站优化之路
    对设计及重构的一点反思
    我的五年岁月
    奔三的路上
  • 原文地址:https://www.cnblogs.com/sunchuanzhen/p/3330850.html
Copyright © 2020-2023  润新知