static关键字
| 一、static关键字:被static修饰的数据是共享的数据,单独放在一处内存中 |
|
【】如果对象里面有相同数据,没有必要各存一份,可以单独拎出来去共享。static修饰的数据,单独放一处内存,作为共享数据 【】共享方法只能访问共享成员,非共享成员都在对象中,多以共享不能访问非共享里面不能直接有对象的内容。 |
|
【一】被共享(静态)修饰完的数据是被对象所共享的数据 【】country是几个对象的属性都是cn,所以可以单独把country=cn单独存在一处地方,各个对象共享这个区域
|
|
【二】共享数据先在类中,而后各个对象才能来取。 类本身也是作为对象形式长期存储在内存中。因此被静态修饰的数据也存在类中,随着类加载而出现,随着类消失而消失。 |
|
【三】被静态共享修饰的数据,不仅可以被对象调用,还可以被类名调用。 因为这个数据一旦static就放到共享内存区,就可以通过类名调用了;static修饰的随着类的加载就在对象出现前先存在了
|
|
【四】被静态共享修饰的数据,多了一种调用方式(类名即可调用),而且不用创建对象就能调用成员。 【】虽然被静态共享修饰数据调用起来更方便。但不能都被静态共享修饰。 都一样的相同数据能共享,可以被静态共享修饰,特有数据,不能被共享,需要单独被其对应的对象收起来 同时,共享的数据轻易不能修改,一改全变了;没被共享的数据,各个对象可自主修改。 【】比如,一个教室最好不是每人配一个饮水机而是共用一台,最好每个人都配一个杯子而不是共用一个。 饮水机随着教室(类)出现而出现,随着教室消失而消失;杯子随着你们(对象)而出现消失 |
|
【】static:修饰类里面成员,都相同的成员可以单独放置,在类加载时就存在在对象出现前就已经出现,所以不仅可以对象名调动,也可以不先建立对象再调用可以直接用类名调动 |
| 二、成员变量和静态变量的不同之处 |
|
【】被static修饰的成员变量一般称为静态共享变量,为了和一般成员变量做区分。静态共享变量是可以被类名调用的。所以,静态共享变量也叫类变量,类能直接访问的变量,或者说类存在它才存在的变量。 【】不被static修饰的变量是成员变量又叫实例变量,实例就是对象,对象存在成员变量才能存在,成员变量就是对象实例中的变量。
静态共享变量(类变量)----- 成员一般变量(实例变量) |
|
【】一般,虚拟机结束,类就消失了;类本身是一个对象,在内存中本身也是按照对象形式来存储的; 加载好多类进虚拟机后,一个类很长时间不用了,垃圾回收机制会对其进行回收清除掉,再用的时候就会再加载这个类。 【】静态共享变量生命周期太长,所以不要全定义成静态共享变量;虽然静态共享变量生命周期长,但总好过全定义成非共享的成员变量,占用超多内存空间的。静态共享的出现本就是为了节省内存空间而设计的。 |
|
【】静态共享变量建议用类名调用,这样阅读性强,比较清晰 【】更准确的说,静态共享变量不用创建对象就能使用调用 |
![]() |
|
【】堆里面不可能只放一个变量,堆里面放的都是实体,静态共享变量不在堆内存。 栈内存用完立刻释放,栈的生命周期较短,随着方法加载而加载进来,里面是局部变量。静态变量不在栈内存。 【】内存有5片,寄存器给cpu使用,本地方法区给系统底层用,除了栈和堆,还有方法区。 静态共享变量存在于共享数据区的静态小区,这个方法区也叫方法区、数据区、共享区、共享数据区。 方法就存放在方法区。 |
| 三、静态共享关键词在使用过程注意的细节 |
|
【】静态共享,既能修饰变量,也能修饰方法。
|
|
【】静态共享修饰的随着类的加载而出现,存储在共享数据区的静态区中,非共享随着对象出现而存储在堆内存中,静态共享可以被类名调用。 内存中静态共享先存在,非静态共享后存在或不存在。如果静态成分调用非静态,就面临对象未建立而非静态部分不存在的情况,干脆禁止静态调用非静态。就是说,先存在调用后存在有可能出问题。但后存在的调用先存在的,一定能访问到。后在的可以访问先在的,先在的不能访问后在的。 【】静态共享在访问上有局限性。一旦方法被静态共享修饰,就只能访问静态共享成员(变量、函数),访问非静态共享就失败。 后在的非静态共享可以访问先在的静态共享,非静态可以访问非静态(非静态可以使用时对象已建立,非静态都存在了)。
【】因为共享比对象先加载,共享方法没有对象就没法使用非共享的成员变量,没有对象没法使用this关键字
【】主函数是共享的,在主函数所在的同一个类中,其他函数都需要加上static修饰语才能被主函数使用。 【】主函数是共享的,想要调用一个所在类中的函数,则该类的函数必须被static共享修饰才行。这样会导致该类成员全部加共享。那么该类数据就都共享了。 所以一般类中其他函数不加静态,在主函数中创建对象后,利用对象去调用该类的函数。
对象是万能的
本类中,成员可以直接引用本类成员,但是要考虑静态一般的问题。主函数所在的类中,被共享修饰的成员可以直接引用。 |
|
总之,共享比对象先加载,因此共享里面没办法使用非共享 使用this这些对象的东西 |
|
【】这是一般引用共享和一般非共享。 |
|
1共享修饰的成员, 时间上:共享变量内存中随着类的加载而先存在,,成员变量随着对象出现而后存在 位置上:单独存储在共享数据方法区的静态小区。 作用上:被各个对象所共享 特点上:共享只能直接引用共享,共享不能直接引用一般。 2对象是万能的,在共享方法中创建的对象可以调用其拥有的任何共享和非共享成员 3被共享修饰的成员还可以被类名调用,最好用类名调用,阅读性强 4共享只能引用共享----【静中有静,静(静)】,共享不能引用一般。 一般可以引用共享和一般 5共享中不能使用对象的this,因为这是非共享的东西 6问题在于共享不能引用一般,解决方法:1将引用的一般给共享修饰2创建对象,用对象可以引用一切成员。
|














浙公网安备 33010602011771号