原来在一个类中的成员变量,每new一个对象就有一份
对于static成员变量来说,这个成员变量只有一份,而且这一份是这个类中所有的对象共享
Static成员变量分配在data seg中(静态变量存放在数据区)
当某一个Cat对象被new出来时,数据区里面有一个变量sid
Id 和 name为非静态成员变量(每个对象单独一份)
静态变量(Static)只有一份不管new多少个对象,没有new对象在data seg中也同样保存一份
静态变量属于整个类的不属于单个对象(不属于专门的某个对象)
怎么对静态变量的值访问呢?
1、任何一个对象都可以访问这个静态的值,访问的时候访问的都是同一块内存
2、即便没有对象也可以访问这个值,用 类名 + . 访问
某一个类名 + . 后面有一个东西(一定是静态的)
System为类名
System.out后面的out是静态的变量
Cat.sid = 100; 执行这个代码时
Cat mimi = new Cat(“mimi”);
(“mimi”)字符串常量分配在data seg中
字符串也是一种引用类型,字符串也是一个对象
形参name分配一个空间在栈内存中,然后吧mimi这个字符串传递给name,相当于把mimi这个对象的引用交给name里,所以name指向mimi
构造方法完成时
执行下面的代码
Cat pipi = new Cat(“pipi”);
Cat mimi = new Cat(“mimi”);
Cat(String name) {
// TODO Auto-generated constructor stub
this.name = name;
id = sid++;
}
执行上面代码的 this.name = name;
id = sid++;
时如下图 id为100 sid为 101
Cat mimi = new Cat(“pipi”);
Cat(String name) {
// TODO Auto-generated constructor stub
this.name = name;
id = sid++;
}
执行上面代码的 this.name = name;
id = sid++;
时如下图 id为101 sid为 102
Sid为基础类型,占一块内存,没有引用
静态变量能够计数用,每当new一个对象是可以为其计数,自动往上加
private static int sid = 0;没有static时Cat.sid = 100;会出错
(因为现在sid是专门属于某一个对象,只有new一个对象出来这个对象才有sid,如果不new任何对象sid是不存在的)所以注释掉Cat.sid = 100;
当private static int sid = 0;没有static时画图如下:
id = 9;
写在main方法里会报错因为:main方法是静态方法不需要new对象就可以执行了,但是id是非静态变量需要new对象才可以访问(无法直接访问)
方法是针对某一个对象来调用的
动态方法针对某一个对象来调用的
静态方法不是针对某一个对象来调用的(没有对象也可以调用)
例如:(类名 )Cat.+静态方法
所以正因如此:在static方法里头不能访问非static成员
在main方法里访问不了非静态的变量、访问不了非静态方法
非静态方法针对某一个对象来调用的,没这个对象怎么调用
Sid一定是放在堆内存,sid是一个类的成员变量
成员变量只有在new出来的时候才在堆内存里分配,new出这个对象来才分配
静态方法不能够访问非静态成员,静态的方法不再是针对某个对象来调用,所以不能访问非静态成员,非静态成员专属于某一个对象,想访问非静态成员必须new一个对象出来
可以通过以下访问静态成员
也可以new出一个对象来调用
Pipi最后访问sid是2000