1.这节是演示了为什么static修饰的字段/方法,创建该类下的所有对象可以共享的以及,证明直接使用类名来调用static成员的
package com.JAVABASIS6;
//创建人类这个类
class PersonStatic{
String name; //年龄
int age; //性别
//不属于某个对象,属于人类
static int totalNum = 5;
PersonStatic(String n,int a){
name = n;
age =a;
totalNum ++;
}
void die(){
totalNum –;
System.out.println(“去世”);
}
//只有人类才有毁灭,毁灭这个行为不属于某个人
static void destory(){
totalNum =0;
System.out.println(“人类毁灭”);
}
}
public class StaticDemo1 {
public static void main(String[] args){
System.out.println(PersonStatic.totalNum); //最开始totalNum输出为5
PersonStatic p1 = new PersonStatic(“will”,17);
System.out.println(p1.totalNum);//totalNum输出为6,使用p1.totalNum没错,但是会报感叹号,The static field PersonStatic.totalNum should be accessed in a static way;如果使用PersonStatic.totalNum就是真正正确的
PersonStatic p2 = new PersonStatic(“will”,17);
System.out.println(PersonStatic.totalNum);//totalNum输出为7
p2.die();
System.out.println(PersonStatic.totalNum); //输出为”去世,6”totalNum输出为6,
System.out.println(p2.totalNum);//totalNum输出为6,且通过对象p1和p2的调用可以发现,totalNum这个字段,是共享,每次调用后都会在前一次调用的结果再运算的。
p1.destory();//真正正确应该写成PersonStatic.destory,直接使用类名访问static成员
System.out.println(PersonStatic.totalNum); //输出为”人类毁灭,0”
}
}
//通过Xlad反编译工具,对StaticDemo1.class进行反编译得出的:如果没有使用类名.方法/字段,编译器会自行做优化处理,也从侧面证明是直接使用类名访问static成员
/**
package com.JAVABASIS6;
import java.io.PrintStream;
// Referenced classes of package com.JAVABASIS6:
// PersonStatic
public class StaticDemo1
{
public StaticDemo1()
{
}
public static void main(String args[])
{
System.out.println(PersonStatic.totalNum);
PersonStatic p1 = new PersonStatic(“will”, 17);
//原先是这样的,System.out.println(p1.totalNum);
System.out.println(PersonStatic.totalNum);
PersonStatic p2 = new PersonStatic(“will”, 17);
//原先是这样的System.out.println(p2.totalNum);
System.out.println(PersonStatic.totalNum);
//原先是这样的
PersonStatic.destory();
System.out.println(PersonStatic.totalNum);
}
}
*/
“`
2.内存分析
1.首先创建的totalNum字段是放在方法区,java首先加载方法区里面的(当需要用到的类就会在方法区加载),static创建的字段就放在这里,所以这就表明“随着类的加载而加载”的原因