java回忆录—神奇的关键字-static

Posted minigeek

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java回忆录—神奇的关键字-static相关的知识,希望对你有一定的参考价值。

一、static关键字的用途

在《Java编程思想》P86页有这样一段话:
  
  “static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”
  
  这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句话来描述就是:
  
  方便在没有创建对象的情况下来进行调用(方法/变量)。

很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
  
  static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。

1)static方法

    static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,
    因为它不依附于任何对象,既然都没有对象,就谈不上this了。
    并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

  
  但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。

2)static变量
  
  static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

static成员变量的初始化顺序按照定义的顺序进行初始化。

3)static代码块
  
  static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
  
  为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。

二.static关键字的误区

1.static关键字会改变类中成员的访问权限吗?

ava中的static关键字不会影响到变量或者方法的作用域。在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字。

2.能通过this访问静态成员变量吗?

虽然对于静态方法来说没有this,那么在非静态方法中能够通过this访问静态成员变量吗?先看下面的一个例子,这段代码输出的结果是什么?

public class Test2 
    private static int value = 33;
    public static void main(String[] args) 
        new Test2().printValue();;
    
    public void printValue() 
        int value = 3;
        System.out.println(this.value);
    

结果:

这里面主要考察队this和static的理解。this代表什么?this代表当前对象,那么通过new Test2()来调用printValue的话,当前对象就是通过new Test()生成的对象。

而static变量是被对象所享有的,因此在printValue中的this.value的值毫无疑问是33。

在printValue方法内部的value是局部变量,根本不可能与this关联,所以输出结果是33。

在这里永远要记住一点:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。

3.static能作用于局部变量么?

在C/C++中static是可以作用域局部变量的,但是在Java中切记:static是不允许用来修饰局部变量。不要问为什么,这是Java语法的规定。

例子:

虽然在main方法中没有任何语句,但是还是会输出,原因什么呢?因为程序运行起来之后这个类首先加载进来,伴随的是静态代码块也会加载。

另外,static块可以出现类中的任何地方(只要不是方法内部,记住,任何方法内部都不行),并且执行是按照static块的顺序执行的。

为什么 main 方法是这样写的呢?public static void main(String[] args)

publicjvm调用,访问权限足够大。

staticjvm调用,不用创建对象,直接类名访问

voidjvm调用,不需要给jvm返回值

main      一个通用的名称,虽然不是关键字,但是被jvm识别

String[] args  以前用于接收键盘录入的(DOS下)

总结:

静态变量和成员变量的区别

①所属不同

静态变量属于类,所以也称为为类变量

成员变量属于对象,所以也称为实例变量(对象变量)

②内存中位置不同

静态变量存储于方法区的静态区

成员变量存储于堆内存

③生命周期不同

静态变量随着类的加载而加载,随着类的消失而消失

成员变量随着对象的创建而存在,随着对象的消失而消失

④调用不同

静态变量可以通过类名调用,也可以通过对象调用

成员变量只能通过对象名调用

以上是关于java回忆录—神奇的关键字-static的主要内容,如果未能解决你的问题,请参考以下文章

一题搞定static关键字

为何关键字static在面试中频频被问?

程序语言与编程实践5-; Java实操2 | 第二周作业及思路讲解 | 基础知识强化考察

Java中的代码块

Java——static关键字

java中static关键字的意义