java的问题

[复制链接]
查看11 | 回复5 | 2010-8-13 17:46:33 | 显示全部楼层 |阅读模式
class kk{
public int a=1;
public static int b=5;
}
public class k{
public static void main(String args[]){
kk c=new kk();
kk d=new kk();
d.a=d.a+1;
d.b=d.b+5;
c.a=c.a+1;
c.b=c.b+5;
System.out.println("d.a=:"+d.a+ "d.b=:"+d.b);
System.out.println("c.a=:"+c.a +"c.b=:"+c.b);
}} 解析下这个输出结果 为什么?

回复

使用道具 举报

千问 | 2010-8-13 17:46:33 | 显示全部楼层
那是因为你在定义整形变量b的时候,又给它定义了一个静态修饰(static),程序在运行的时候,运行的流程是这样的,首先因为a这个变量你没有给他定义(static),所以d.a和c.a它们得到的结果实际上就是来自于调用之前a已经定义好的值,也就是调用最开始的那个1来进行计算,然后将这个结果重新赋给a,但是因为变量b存在静态修饰符,所以b这个变量在前后两次调用时存在着不同,因为在第一次调用的时候,也就是计算d.b的时候,调用b得到的结果是5,进行运算之后d.b的值就是10,此时经过这一步,10这个值就代替了原先你定义好的值5,在计算c.b的时候,程序再次调用b的值,而此时调用到的结果就变成了10,再经过计算,c.b的结果就变成了15,而这个15又重新赋给b
回复

使用道具 举报

千问 | 2010-8-13 17:46:33 | 显示全部楼层
首先从main开始执行d.a=d.a+1;得到a=2d.b=d.b+5;得到b=10c.a=c.a+1;得到a=1+1 注意此处仍是1+1,a=2c.b=c.b+5;得到b=10+5b=15b是static类型的是全局变量而a不是要是把a也改成static的最后a就输出3了
回复

使用道具 举报

千问 | 2010-8-13 17:46:33 | 显示全部楼层
这个主要就是类变量和成员变量的区别了。static修饰的变量称为类变量,在类加载的时候就被初始化了,在对象之间共享的。没有被static修饰的变量称为实例变量,实例变量是在创建类的对象的时候初始化的。
回复

使用道具 举报

千问 | 2010-8-13 17:46:33 | 显示全部楼层
static属性是在对象之间共享的,一般我们调用它直接用 类名.属性(static),而不需要用new去创建对象。所以不管你创建几个对象来调用这个属性,属性的值都是存在同一个内存区域的,你先是给b赋值b+5,后又赋值b+5,就变成了15 还不懂的话,你去掉c.b=c.b+5;这一行,运行看看http://younglibin.javaeye.co
回复

使用道具 举报

千问 | 2010-8-13 17:46:33 | 显示全部楼层
static修饰的属性和方法是属于这个class的,初始化class后不管有多少个对象,static属性和方式都只有1个因此d.b和c.d实际都是kk.b建议你写代码最后规范已点,否则不方便读
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行