静态成员和非静态成员的区别?

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

大致有两点:

    静态成员是属于类的而不是对象的,所以只有一份拷贝,并不在类的对象中都有副本;

    静态数据成员的值在函数退出时不消失,作为下一次调用时的初值,所以可在各对象之间传递数值。

参考技术B 静态成员可以直接用 类名.成员访问,静态成员是这个类的属性,不管创建多少个实例,只要修改了一个实例对象的静态成员,其它实例对象的这个静态成员也会改变。

比如:
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

以上是关于静态成员和非静态成员的区别?的主要内容,如果未能解决你的问题,请参考以下文章

C# 静态类和非静态类的区别

成员初始化器列表和非静态数据成员的默认成员初始化器有啥区别?

静态和非静态的区别。

java static成员变量方法和非static成员变量方法的区别

关于静态方法和非静态方法

java中静态方法和实例方法的区别