黑马程序员技术交流社区
标题:
关于static的问题
[打印本页]
作者:
罗亚东
时间:
2011-10-9 19:42
标题:
关于static的问题
class Chinese
{
private static int count=0;
private static String country="中国";
String name;
int age;
public Chinese()
{
System.out.println(++count);
}
}
class TestChinese
{
public static void main(String[] args)
{
new Chinese();
new Chinese();
new Chinese();
}
}
程序打印出是1 2 3,但如果count不是static的,为什么打印的都是1呢?视频上听的不太懂?
作者:
欧阳超
时间:
2011-10-9 20:01
那是因为static修饰的变量是类变量,所以每个new一次count加上1.
如果不是static变量,每new一个对象count的值都会为0,他们是成员变量,不是类变量,所以当++count
执行时打印1.
作者:
许冉
时间:
2011-10-9 20:04
静态数据只有一份,存储在方法区
被所有对象共享
创建第一个对象时 创建一个count 这时count 是1
创建第二个对象时 并没有重新创建count变量,用的就是创建好的那个count ,因为所有对象共享静态变量, 这时count已经是1了 ,再操作就是在这个基础上操作
依次类推,第三个对象,第四个对象....
如果count不是静态的,存储在堆中,那么每次创建一个对象,就生成一个新的count变量,所以每次创建新对象,count都是0
作者:
王思兰
时间:
2011-10-9 20:20
count如果没被static修饰,那每次创建对象时,都是从0开始,并没有累加,被static修饰后会存储在静态区
作者:
苏志伟
时间:
2011-10-9 20:23
我觉得把!还是你面向对象的概念没弄透彻!并不是这个static的静态的问题!
这里把这个count声明为静态的!那么他就是一个常量了!你用new关键字创建的是这个类的每个实例,都会共享这个成员,如果这个成员变量不是static的那么在用new关键字创建实例的时候,每个人都会有自己的一个count成员!
举一个例子,假如有一个类是Person类,每个人都有自己的age属性,和name属性!不能许多人共享一个名字,一个年龄!所以他们两就不是静态的! 人类有个人口总数,那么这时候这个属性就要生命为静态的了!
自己再给总结一下把,不知道正不正确,可以参考:静态的就是这个类所拥有的属性,非静态的一定是这个实例对象的属性!
静态的可以直接用类名,点成员变量来访问!而非静态的必须用实例对象来调用,这是个小特性,如果你了解了面向对象,这个问题是原理不难理解的!
在补充一句!面向对象的设计思想!就是为了让程序编写更贴近显示生活!
哥们,这个问题弄明白了!这不弄明白了,后面可就麻烦了.....!
作者:
王家俊
时间:
2011-10-10 01:46
因为static类型的数据是属于类所有的。使用同一个类创建多个对象时对象虽然产生了多个,但类却只加载了一次,那个static的数据count也就随着类的加载而只“加载”一次,每创建一个对象都要调用一次构造方法,构造方法中正好又使用了static的count,此时count达到了共享,这样count就不断的++了。如果去掉了count前面的static的话,这时count就属于对象所有了,就是count只有在对象产生后才有,而每个对象只产生自己中的count,count这时没有被共享,简单说就是各个对象只有各自的count,他们互不相干,所以你去掉了count前的static就出现了你所说的总是0的情况。
作者:
张洋铭
时间:
2011-10-10 18:17
这个问题给你举个例子说明
1. 黑马论坛,是大家一起用的吧,谁来访问都这么一个论坛。像这样大家共用的就是static的
2. 假设有3个人在论坛上发帖子,A发完,帖子数变成1,B发完变成2,C发完变成3。这个能理解吧
3. 现在黑马论坛不用static修饰了,那就相当于是个体独有的,一人一个黑马论坛。
A来访问,就是A黑马论坛,A在论坛里发个帖,帖子数为1。
B来访问,就是B黑马论坛,B在论坛里发个帖,帖子数为1。
C来访问,就是C黑马论坛,C在论坛里发个帖,帖子数为1。
4.估计你看完,对static的理解就哦了!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2