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

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

java学习面向对象值static的更多相关文章

  1. java学习面向对象之static内存图解

    上一节当中描述了static的用法,以及成员变量和静态变量的区别.但是static除了可以修饰成员变量使之成为静态变量外,他还可以同时修饰函数,使之成为静态函数,我们来看一个例子: class Sta ...

  2. Java学习-047-数值格式化及小数位数四舍五入

    此小工具类主要用于数值四舍五入.数值格式化输出,很简单,若想深入研究,敬请自行查阅 BigDecimal 或 DecimalFormat 的 API,BigDecimal.setScale(位数,四舍 ...

  3. Java学习笔记之---static

    Java学习笔记之---static static不能修饰类,局部变量 (一)静态成员的特征 static+属性  静态属性 无论实例化出来多少个对象,都会共用同一块静态空间,类对象共享 静态成员从第 ...

  4. Java学习---面向对象的远程方法调用[RMI]

    基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...

  5. java学习面向对象之异常之一

    一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...

  6. java学习面向对象之匿名内部类

    之前我们提到“匿名”这个字眼的时候,是在学习new对象的时候,创建匿名对象的时候用到的,之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名. 匿名对象回顾: class N ...

  7. java学习面向对象之内部类

    什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中. 那么内部类都有什么特点呢? 1.内部类可以访问包裹他的类的成员. 2.如果包裹他的类想访问被其包裹的类的话就得实例 ...

  8. java学习面向对象之接口

    上一节当中我们说道抽象类,抽象类当中的方法可以是抽象的也可以是非抽象的,那么当抽象类中所有方法都是抽象的时候,我们就可以把它重新定义为接口.代码示例: abstract class Animal { ...

  9. java学习面向对象之父子构造函数初始化

    在之前讲到java面向对象继承的时候,我们只讲到了两个比较重要的知识点,一个是父子类当中有同名的成员变量,这个时候,我们引入了super这个关键字来区分这两个同名成员变量,除此之外,我们还讲到了父子同 ...

随机推荐

  1. JS 拼凑字符串

    和Java一样,JS中直接用"+"号拼凑字符串是很耗费资源的,所以在大量拼凑字符串的情景中,我们也需要一个类似于StringBuffer的工具, 下面利用Array.join()方 ...

  2. 【IBM】Merlin 给 Java 平台带来了非阻塞 I/O

    Merlin 给 Java 平台带来了非阻塞 I/O 新增的功能大幅降低了线程开销 Java 技术平台早就应该提供非阻塞 I/O 机制了.幸运的是,Merlin(JDK 1.4)有一根几乎在各个场合都 ...

  3. Red Hat Enterprise Linux 6安装步骤

    首先,准备安装环境,此次实验是在VMware Workstation虚拟机环境下来实现的,下面就开始安装: 点击Create a New Vitrual Machine来新建一个虚拟机,选择自定义安装 ...

  4. centos mysql 编译安装

    centos mysql 编译安装 1.安装 创建MySQL用户 sudo useradd mysql 下载MySQL的源码包,我们这里使用的时5.5.18 安装依赖 sudo yum -y inst ...

  5. 解决Chrome谷歌浏览器不支持CSS设置小于12px的文字

    在最新版的谷歌里.已经不在支持这个属性啦 谷歌浏览器Chrome是Webkit的内核,有一个 -webkit-text-size-adjust 的私有 CSS 属性,通过它即 可实现字体大小不随终端设 ...

  6. 自定义Window 服务

    自定义window 服务 开发到使用的流程: 1.完成对应的代码之后(代码在底下),右键MyService.cs 添加安装程序 2.添加window服务安装程序打开Service1.cs[设计]页面, ...

  7. 函数对象的prototype总结

    通过看 http://www.cnblogs.com/mindsbook/archive/2009/09/19/javascriptYouMustKnowPrototype.html 该文章和对代码的 ...

  8. SQL 优化,全

    性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂的SQL语句,要设 ...

  9. Flightgear 编译

    一.FlightGear简介 FlightGear 始于1997年,是一个开源的多平台飞行模拟器. 二.FlightGear编译过程 FlightGear平台的说明文档见:http://wiki.fl ...

  10. 在O(1)时间删除链表结点

    //给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 1 struct ListNode //结点结构 { int m_nValue; ListNode* m_pNext; ...