六static

来源:互联网 发布:健康医疗大数据应用 编辑:程序博客网 时间:2024/05/16 01:30


 

3.6static静态关键字

 用法1,是一个修饰符,用于修饰成员(成员变量和成员函数),被修饰之后的成员,就会被从栈内存中拿出来,但是大家还可以访问,节省了内存

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

eg:System.out.printlin(Person.country);//这里边的Person就是一个类,而country是一个被static修饰过的成员变量()国籍

那为什么不是所有的成员都用static修饰呢,那不是更好吗。因为static修饰的成员必须是共享的,就是大家都有的共同点,比如说每个对象都是一个国籍,就是Chain

,大家的名字都是不一样的,就不能用static修饰,就像每个学生都可以有自己的电脑一样,还用每个人都准备一台饮水机吗,不用,因为饮水机就是共享的,就可以用static修饰

 

被静态修饰过的成员从栈内存中拿了出来,但是也不再堆内存中,去了方法区(共享区)数据区。

//类中的共享数据和方法都在共享区。

 

static的特点

1,随着类的加载而加载。随着类的消失而消失(生命周期最长)//就是类在内存中开辟了一个空间,那么被static所修饰的成员就会诞生。

2优先于对象存在//因为是随着类加载而加载的,在对象没诞生的时候就有他了

3,被所有对象所共享

4,可以被类直接调用

*/

 

class Person

{

       String name://成员变量,也叫实力变量

       static String country ="CN";//静态变量,也叫类变量,一看到是被static修饰就要想到他的

                                //几个特点,共享,可以直接被类调用,随着类加载

       public void show()

       {

              System.out.println(name+";;;"+country);

       }

}

 

/*

类变量和实例变量的区别:

1存放位置,类变量随着类的加载而存在共享区中

           实例变量对随着对象的建立而存在于堆中

2生命周期:类变量生命周期长,随着类的消失而消失

          实例变量生命周期随着对象消失而消失。

 

 

 

静态的使用注意事项:

 

1.静态方法只能访问静态的成员//y因为静态成员是随着类的产生而产生,他如果访问非静态成员,那些非静态成员还没创建呢啊,别忘了,静态成员可以直接被类调用,而不用创建对象,eg:Person.show();

但是非静态方法可以访问静态成员,因为静态先在了,而且静态的都是共享的,

2.静态方法中不可以用this,super关键字修饰,因为静态方法,优先于对象存在,this代表对象,那时候还没对象呢。你this代表什么去?所以静态方法不可以用this。

3,主函数是静态的。

静态有利有弊,

利:对对象的共享数据进行单独空间的存贮,节省内存,没有必要每个对象中都存储一份,

    可以直接被类名调用。

弊:生命周期过长,不能释放内存,

    访问出现局限性,静态只能访问静态。

 

————————————————————————————————————————————————————————————

/*

 public static void main (Steing[] args)

 主函数,是一个特殊的函数,作为程序的入口,被jvm调用

public:代表着该函数的访问权限是最大的

static:代表着主函数随着类的加载就已经存在了。

void:主函数没有具体的返回值

main:不是关键字,但是是一个特殊的单词,可以被jvm识别。

函数的参数:(String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串,也就是字符串类型的数组

 

主函数是固定格式的,jvm识别。

但是唯一可以改变的的是args,他是个变量名,你换成arr都行(随口说一下,args是arguments的缩写)

 

jvm在调用主函数的时候,传入的是new String[0];

*/

 

 

使用静态,从两方面下手

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

什么时候定义静态的变量呢?

当对象中出现了共享数据时,该数据被静态所修饰,对象中特有的数绝被定义成非静态的,

name每个人都有,那是属性,不是共享数据,是对象特有数据,

共享数据时每个人都有的,都是一样的

 

什么时候定义静态的函数呢?

当功能内部没有访问到静态数据(对象独有数据),那么该功能可以定义为静态的。

 

/*

静态的应用

 

每个程序中都用共性的功能,可以将这些功能抽取,独立封装,以便服用。

*/

——————————————————————————

别人给你个封装工具类,你怎么用啊,你都不知道里边有什么功能,所以需要说明书啊

 

java程序的说明书,开始用文档注释来完成:

/**

 这是一个可以对数组进行操作的工具类,该类提供了,获取最大值,排序等

@author 张三

@version v1.1(版本号)

*/

文档注释只能注释public和protect修饰的的方法,因为别的权限不够大,private和默认修饰符都不会被生成帮助说明书

 

 

——————————————————————————————————————————————————————————

静态代码块

格式:

static

{

       静态代码块中的执行语句;

}

特点:随着类的加载而加载,只执行一次。优先于主函数、

作用:给类初始化的

 

——————————————————————————————————————————————————————————

Person p =new Person("zhangsan",20);

  这句话都做了什么事?

  1.因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中。

  2.执行该类中的静态代码块,如果有的话,给person.class类进行初始化

  3.在堆内存中开辟空间,分配内存地址

  4.在堆内存中建立对象的特有属性,并进行默认初始化

  5.对属性进行显示初始化。

  6.对对象进行构造代码块初始化,

  7.对对象进行相应的构造函数初始化。

  8.将内存地址付给内存中p的变量。

设计模式:解决某一类问题行之有效的方法,java中有23中

单例设计模式:解决一个类在内存中只存在一个对象。


原创粉丝点击