[好程序员训练营]java基础笔记之static关键字的学习

来源:互联网 发布:mac这么删除用户 编辑:程序博客网 时间:2024/05/20 15:58

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流!

以前遇到static关键字有些时候容易犯浑,今天来把static关键字的用法来整理一下.

开始做笔记!

一:static就是静态的意思,可以修饰成员变量和成员方法.

二:被静态修饰的成员的特点:

1,随着类的加载而加载,也正因为如此,才使得静态的成员优先于对象存在.

2,被静态修饰的成员被类所有的对象所共享.

3,可以通过类名调用,也可以通过对象调用.一般是通过类名调用.

下面附图一张来说明static用法:

我们可以看到在上图中,我们可以用实例对象s1,s2调用静态修饰的staticMark,可以说明静态修饰的成员是被该类所有成员所共享的,其实该静态成员是以字节码形式放在数据共享区中,有且只有一份,被该类的所有的实例对象所共享.

而我们也可以直接用Student类名来调用,这就说明static修饰的成员可以用类名直接方便的调用

刚才我们在静态方法中调用静态成员可以,现在我们在非静态方法中调用静态成员行不行呢?


可以看到我们在一个普通的method方法中调用静态修饰的成员依旧可以,并且可以运行,所以可以在非静态成员中调用静态成员,其实原因就是静态成员随着类的加载而加载,故优先于实例对象存在,所以后来的实例对象当然可以找到先存在的静态成员,然后去调用它.

但是我们可以想一下,如果在静态中调用非静态会怎么样呢,按照刚才的猜想应该是失败的,因为静态是先加载的,调用还未加载的非静态是不行的

下面就代码论证一下



我们可以看到在static修饰的main()方法中,调用该类的非静态成员method()方法和成员变量temp都不行,报的错是


这两句话都是在说不能再静态中引用非静态成员,原因就是先后加载的问题.

三:区别一下静态成员变量和非静态成员变量:

首先:1,所属不同:静态成员变量属于类,是类变量,

非静态成员变量属于实例对象,是成员变量.

2,内存位置不同:前者在内存中的数据共享区(静态方法区)

后者在堆内存;

3,生命周期不同:前者是随着类的加载而加载,随着类的消失而消失

后者是随着对象的加载而加载,随着对象的消失而消失.

4,调用不同:前者可以通过类名,对象调用

后者只能通过对象调用































0 0
原创粉丝点击