• Java-static关键字


    一、static关键字的用途

    static方法就是没有this的方法。Static方法内部不能调用非静态方法,反过来是可以的。可以再没有创建对象的前提。可以通过类的本身来调用static方法。这才是static真正的用法。

    总结:static方便在没有创建对象的情况下进行调用(方法/变量)。很显然,被static关键字修饰的方法和变量不需要依赖于对象来访问,只要类被加载了,就可以通过类名去访问。

    1、static方法

    一般称为静态方法,静态方法不依赖于任何对象就可以访问,因此对静态方法来说,是没有this的。(没有对象,谈何this)由于这个特性,静态方法中不能访问类的非静态成员方法和变量。因为非静态方法和变量都是依赖具体的对象才能够被调用。

    但是在非静态方法中可以访问静态成员方法和变量。举个栗子:

     1 public class Main {
     2     private static String str1 = "staticProperty";
     3     private String str2 = "property";
     4     
     5     public Main() {
     6         
     7     }
     8     
     9     public void print() {//非静态调用静态没有问题
    10         System.out.println(str1);
    11         System.out.println(str2);
    12         print2();
    13     }
    14     
    15     public static void print2() {//静态调用非静态报错
    16         System.out.println(str1);
    17         System.out.println(str2);//Cannot make a static reference to the non-static field str2
    18         print();//Cannot make a static reference to the non-static method print() from the type Main
    19     }
    20 }

    对于非静态成员,他访问静态成员方法/变量显然是没有限制的。最常见的main方法也是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。注意,即使没有显示声明为static,类的构造器实际上也是静态方法。

    2、static变量

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

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

    3、static代码块

    static关键字关键作用:形成静态代码块以优化程序性能。static块可以置于类的任何地方,类中可以有多个static块,类初次加载时,会按照static块的执行顺序来执行每个static块,并且只会执行一次。

    static块优化程序原理:只会在类加载的时候执行一次。

    举个栗子:

     1 import java.sql.Date;
     2 
     3 public class Main {
     4     private Date birthDay;
     5     
     6     public Main(Date birthDay) {
     7         this.birthDay = birthDay;
     8     }
     9     
    10     boolean isBornBoomer() {
    11 /*        每次调用isBornBoomer,都会生成startDate和endDate两个对象,造成空间浪费。
    12 */    
    13         Date startDate = Date.valueOf("1995");
    14         Date endDate = Date.valueOf("2017");
    15         return birthDay.compareTo(startDate)>=0&&birthDay.compareTo(endDate)<0;
    16     }
    17 }

    优化例子:

     1 import java.sql.Date;
     2 
     3 /**
     4  *很多时候会把只需要进行一次初始化操作都放在static代码块中进行。*/
     5 public class Main {
     6     private Date birthDay;
     7     private static Date startDate,endDate;
     8     //只需要初始化一次
     9     static {
    10         startDate = Date.valueOf("1995");
    11         endDate = Date.valueOf("2017");
    12     }
    13     
    14     public Main(Date birthDay) {
    15         this.birthDay = birthDay;
    16     }
    17     
    18     boolean isBornBoom() {
    19         return birthDay.compareTo(startDate)>=0 && birthDay.compareTo(endDate)<0;
    20     }
    21 }

    二、static关键字误区

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

    不会。Java中影响限权的只有private,public,protected,default(包括包访问限权)这几个关键字。

    2、能用this访问静态成员变量吗?

    举个栗子:

     1 public class Main {
     2     static int value = 22;
     3     
     4     public static void main(String[] args) {
     5         new Main().printValue();
     6     }
     7     
     8     public void printValue() {
     9         int value = 2;
    10         System.out.println(this.value);
    11     }
    12 }
    13 /*
    14 结果:
    15 
    16     22
    17 
    18 */

    盲目分析:

      this代表当前对象,static是被对象共享的,无疑结果是22 。printValue方法中的value是局部变量,根本不可能和this关联,所以输出22

    注意:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态成员方法和变量都可以通过对象去访问(限权足够下)。

    3、static能作用于局部变量吗?

    在Java中这是不允许来修饰局部变量的,没有为什么,这就是规定(冷漠)。

    还有就是要注意的关于程序运行顺序的问题。被说了,我要八千,我都会。

  • 相关阅读:
    设计模式的读书笔记
    腾讯历年笔试题
    原始套接字的简单tcp包嗅探
    一些有意思,有深度,容易错的代码收集
    sizeof的用法的一些归纳
    一道有趣的题目
    C++的一些设计注意点
    Gazebo Ros入门
    机器学习之多变量线性回归(Linear Regression with multiple variables)
    机器学习之单变量线性回归(Linear Regression with One Variable)
  • 原文地址:https://www.cnblogs.com/zpoor/p/7605185.html
Copyright © 2020-2023  润新知