静态成员和非静态成员的区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态成员和非静态成员的区别?相关的知识,希望对你有一定的参考价值。
。。。
静态成员----有static关键字修饰的成员变量或者方法非静态成员---没有static关键字修饰的成员变量或者方法
在java里面,因为变量都是要存储在内存中,并且程序的运行也是在内存中,而静态成员的主调是该成员所属的类,当静态成员定义时类已经存在,所以相应的静态成员也就在内存中存在,并且分配给了内存空间,但是非静态成员的主调是属于类中的实例,只有当实例存在时才能为非静态成员分配存储空间,当静态成员存在的时候非静态成员可能还不存在,所以-----java里面静态成员不允许直接访问非静态成员,比如:
(以下代码来自参考书籍,只是为自己提供参考,不涉及任何违法内容)
//静态成员不能直接访问非静态成员
public class StaticAccessNoStatic
//创建一个非静态方法
public void info()//非静态方法
//非静态方法的执行体
System.out.println("我们都是笨小孩,却不忘挺起胸膛");
public static void main(String[] args) //静态方法
//在java语言里面因为内存机制的问题,所以静态成员不能直接访问非静态成员,main()方法是静态方法
//而info()是非静态方法,所以不能直接访问,以下的语句是错误的
info();
由上面的代码运行结果可知:
静态成员访问非静态成员会出现编译的错误
可以利用对象来进行访问,代码如下
//静态成员要想访问非静态成员,可以借助于对象来进行调用访问
new
StaticAccessNoStatic().info();//利用new关键字调用构造器创建一个实例,利用实例直接调用非静态方法
//以下的方法与上面的句子是等价的
StaticAccessNoStatic s=new
StaticAccessNoStatic();
s.info();
即利用new关键字来调用构造器,定义一个对象,利用对象来访问非静态方法,从而实现非静态方法调用静态方法的目的
注意:非静态成员是可以直接调用静态成员的,注意java的一些特殊用法可以更好的实现java的学习。 参考技术A
大致有两点:
静态成员是属于类的而不是对象的,所以只有一份拷贝,并不在类的对象中都有副本;
静态数据成员的值在函数退出时不消失,作为下一次调用时的初值,所以可在各对象之间传递数值。
比如:
Family类中有一个静态成员,国籍。
Family.国籍 = “china”;
Family me = new Family();
Family mybrother = new Family();
那么me.国籍和mybrother.国籍 都是china.
如果执行me.国籍=“USA”,那么mybrother.国籍也将变为"USA" 参考技术C 请参考:C++ 类的静态成员详细讲解
http://blog.csdn.net/morewindows/article/details/6721430
以上是关于静态成员和非静态成员的区别?的主要内容,如果未能解决你的问题,请参考以下文章
成员初始化器列表和非静态数据成员的默认成员初始化器有啥区别?