黑马程序员技术交流社区
标题:
问个基础问题,有点困惑
[打印本页]
作者:
τ、高童鞋ゝ
时间:
2012-4-19 18:36
标题:
问个基础问题,有点困惑
静态变量和实例变量的区别
我知道在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
那在程序运行时他们有什么区别?能举个示例跟好
作者:
liqian
时间:
2012-4-19 18:42
1.类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。
而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。
2.在程序运行时的区别:
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
作者:
常万
时间:
2012-4-19 18:49
1、所属不同
静态成员变量也称为类变量,它属于整个类,而且它多了一种调用方式直接用类名调用。
实例变量,是被对象调用的,是所属具体对象的。
2、生命周期不同
静态成员变量是随着类的加载而加载的,也是随着类的消亡而消亡,生命周期与所属的类的生命周期一致
实例变量随着对象的加载而加载,随着对象的消失而消失。按对象的生命周期存在。
3、存储位置不同
静态成员变量存储在方法区的静态方法区中
实例变量存储对象所属堆内存中
4、共享不同
静态成员变量被所有的类对象所共享
实例变量是对象中的特有数据
这个论坛有帖子....
作者:
王德南
时间:
2012-4-19 18:50
类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。
而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。
作者:
τ、高童鞋ゝ
时间:
2012-4-19 18:53
public class VarTest
{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest()
{
staticVar++;
instanceVar++;
System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
}
我这样写是不是static修饰的Var永远只分配一个staticVar变量,同时也创建了多个实例化对象?
作者:
李宗鹏
时间:
2012-4-19 20:32
一: 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
二:
java类的成员变量有两种:
一种是被static关键字修饰的变量,叫类变量或者静态变量
另一种没有static修饰,为实例变量
作者:
光sail
时间:
2012-4-19 21:06
本帖最后由 光sail 于 2012-4-19 21:19 编辑
static 关键字:可以用于修饰属性,也可以用于修饰方法,还可以用于修饰类.
static 修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯 一一份静态的成员变量;一个对象对该静态成员变量进行了修改,其他对象的该静态成员变量的值也会随之发生变化。如果一个成员变量是static 那么我们可以通过类名.成员变量名的方式来使用它(推荐使用这种方式)。
static 修饰方法:static 修饰的方法叫做静态方法。对于静态方法来说,可以使用类名.方法名的方式来访问。
静态方法只能继承,不能重写(Override)。
class StaticTest{
static int i=9;
public static void main(String[] args) {
StaticTest st=new StaticTest();
StaticTest st1=new StaticTest();
st.add();
st1.add();
System.out.println(i);
}
public int add(){
i++;
return i;
}
}
复制代码
打印输出为11,st和st1对象共同拥有变量i。
作者:
τ、高童鞋ゝ
时间:
2012-4-19 22:16
啊哦,版主...回答的好也是问的好啊,哈哈 ,厚脸皮一下···
作者:
付左军
时间:
2012-4-19 22:18
这么说吧,静态变量相当于共享属性,共有的,实例变量必须是创建对象后才有的
作者:
黑马-刘昌文
时间:
2012-4-19 22:54
静态变量是类所有的,也被称为类变量,被所有的实例对象所共享,而实例变量只是每个实例所拥有的!
作者:
林豪
时间:
2012-4-19 22:58
1、静态对象的数据在全局是唯一的,一改都改。如果你想要处理的东西是整个程序中唯一的,弄成静态是个好方法。
2、非静态的东西你修改以后只是修改了他自己的数据,但是不会影响其他同类对象的数据。
3、静态对象和非静态对象都是对象,是对象都是要实例化的。不同之处就是2者的数据表现和存储方式不一样。
4、静态的好处:
引用方便。对于公用类型的变量,直接用 类名.静态方法名 或者 类名.静态变量名就可引用并且直接可以修改其属性值,不用getter和setter方法。
保持数据的唯一性。此数据全局都是唯一的,修改他的任何一处地方,在程序所有使用到的地方都将会体现到这些数据的修改。
有效减少多余的浪费。
作者:
蒋亮
时间:
2012-4-20 00:07
τ、高童鞋ゝ 发表于 2012-4-19 18:53
public class VarTest
{
public static int staticVar = 0;
静态变量属于类,加载类的时候就会被分配内存空间,在内存中只有一份拷贝,每创建一个实例对象,staticVar将加1.
实例变量属于实例对象,只有在创建了实例对象之后才会被分配内存空间,无论创建多少个实例对象,instanceVar的值只加1一次,为1.
作者:
张超超
时间:
2012-4-20 10:09
java类的成员变量有俩种:
一种是被static关键字修饰的变量,叫类变量或者静态变量
另一种没有static修饰,为实例变量
类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。
而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。
public class Temp {
int t; //实例变量
public static void main(String args[]){
int t=1; //局部变量
System.out.println(t); //打印局部变量
Temp a= new Temp(); //创建实例
System.out.println(a.t); //通过实例访问实例变量
}
}
结果为:
1
0 (成员变量具有缺省值 而局部变量则没有)
把代码改为
public class Temp {
static int t; //类变量
public static void main(String args[]){
System.out.println(t); //打印类变量
int t=1; //局部变量
System.out.println(t); //打印局部变量
Temp a= new Temp(); //创建实例
System.out.println(a.t); //通过实例访问实例变量
}
}
结果则为
0
1
0
补充:
静态变量stat是一个公共变量,无论哪个对象改变了它的值,对其他所有该类对象都有效。静态变量的一个重要作用是当作同类各个对象之间传递信息使用,类似于C语言中的全局变量。但这样破坏了数据的封装原则,往往会留下隐患,所以使用这类变量时需要万分谨慎。
静态变量的另一个用途是定义静态常量,比如:
public static double PI = 3.1415926;
这样的静态常量可以无需创建对象就直接使用,省略了创建对象的步骤,类似于C语言中用define定义的常量。这样定义常量,不仅使用方便,而且节省内存空间。在JDK中,存在着大量的这种静态常量。
作者:
韩新凯
时间:
2012-4-20 10:16
去看看毕老师的static那块的基础视频吧,很详细。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2