Java中Static关键字的五种用法详解

Posted 永远别秃头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中Static关键字的五种用法详解相关的知识,希望对你有一定的参考价值。

Static的五种用法大致如下:

  • 修饰成员变量,使其成为类变量,也叫静态变量
  • 修饰成员方法,使其成为类方法
  • 修饰内部类,使其成为静态内部类
  • 静态代码块
  • 静态导包

直接一点,static关键字就是把属性和方法变为类相关,而不是实例相关。

修饰成员变量

被static关键字修饰的属性叫做静态属性,也叫类属性。顾名思义现在该属性为该类所有,而非该类实例化的对象所有,在类的加载阶段进行初始化。虽然使用类实例化的对象也能够调用该属性,但是该属性是属于类所有,所有该类的实例化对象和该类共享一个值,即操作的是同一个值。

public class Person
  	static int age;
  	static int high = 175;
    public static void main(String[] args)
        System.out.println(age);
        System.out.println(high);
    


class PersonTest
    public static void main(String[] args)
        System.out.println(Person.age);
    

成员变量不给初始值的话,会进行默认初始化。

被static修饰的属性,可以认为是属于类的,只要类进行加载以后,便可以使用类名.属性名进行调用。

修饰成员方法

被static关键字修饰的方法叫做类方法,修饰后的方法可以直接使类名.方法名调用,减少了实例化对象进行调用的资源消耗。

简单的来说被static修饰的方法,可以认为是属于类的,只要类进行加载以后,则就可以进行使用。

public class Person
  	static int age;
  	static int high = 175;
  	public static void seeMessage(String msg)
      	System.out.println(msg);
    


class PersonTest
    public static void main(String[] args)
        Person.seeMessage("Hello Codermast!");
    

这里需要注意的是一个静态方法是不能够直接调用同类下的非静态方法,而同类下的非静态方法则可以调用同类下的静态方法。

修饰内部类

被static修饰的内部类完全独立于其所在的外部类,不属于外部类的对象,可以认为两个类是完全没有关系的两个类。

  • 静态内部类可以包含静态成员,也可以包含非静态成员,但是在非静态内部类中不可以声明静态成员。
  • 静态类内部不可以访问外部类的实例成员,只能访问外部类的类成员,即使是静态内部类的实例方法也不能访问外部类的实例成员,只能访问外部类的静态成员
  • 外部类不可以定义为静态类,Java中静态类只有一种,那就是静态内部类,顶级类不能用static 修饰

外部类如何调用静态内部类的属性和方法:

  1. 外部类可以通过创建静态内部类实例的方法来调用静态内部类的非静态属性和方法
  2. 外部类可以直接通过“ 外部类.内部类.属性(方法)” 的方式直接调用静态内部类中的静态属性和方法

创建一个静态内部类实例:

  • 在外部类中:直接使用类名创建即可,内部类名 name = new 内部类构造器;
  • 在其他类中:使用外部类.内部类 name = new 外部类.内部构造器;

静态代码块

static修饰代码块的作用就是,在类加载以后进行执行这段代码。我们需要着重看一下具体的执行顺序。下面是一个简单的示例。

class Dog 
    String name;
    public Dog(String name) 
        this.name = name;
        System.out.println("狗的名字叫:" + name);
    


class Person 
    String name;
    public Person(String name)
        this.name = name;
        System.out.println("人的名字叫:" + name);
    

    static int age = 18;

    static 
        System.out.println("静态代码块1执行...");
    

    static Dog xiaohuang = new Dog("小黄");

    Dog xiaohua = new Dog("小花");
    static 
        System.out.println("静态代码块2执行...");
    

    static int high = 175;

    Dog xiaohei = new Dog("小黑");

    static Dog xiaobai = new Dog("小白");


    public static void main(String[] args) 
        Person person = new Person("codermast");
    

该示例执行后的结果如下所示:

静态代码块1执行...
狗的名字叫:小黄
静态代码块2执行...
狗的名字叫:小白
狗的名字叫:小花
狗的名字叫:小黑
人的名字叫:codermast

则我们可以判断出执行的顺序为:

  1. 静态代码块和静态属性的顺序执行
  2. 非静态属性的执行
  3. 方法的调用

这里主要解释第一点,静态代码块和静态属性属于同一优先级,顺序执行。举个简单的例子即可理解:

这里我们就无法调用到age属性

静态导包

静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。

  • PrintMsg类
public class PrintMsg
  	public static void printMsg(String msg)
      	System.out.println(msg)
    

  • Test类
import static codermast.util.PrintMsg.*;
public class Test
  	public static void main(String[] args)
      	printMsg("hello codermast!")
    

运行Test类中的main方法后,就能在控制台看到“hello codermast!”的一行输出。

需要注意的是:导入的静态方法所处的类,不能和调用的类在同一个包下。

C++_ static 的五种用法 __考题!!

static 的五种用法 __考题!!

  1. 类中的静态数据成员

  2. 类中的静态函数成员

  3. 通过 static 修饰文件全局变量 (如果要真正的全局变量用 extern 修饰)
    主函数外定义默认为文件全局

  4. 通过 static 修饰块作用变量, 该变量的作用域没有修改, 该变量的内存在全局数据区

  5. 通过 static 修饰函数, 函数默认是全局作用域, 改变为文件作用域


上面的内容灵活使用, 没准那天面试用上了doge

以上是关于Java中Static关键字的五种用法详解的主要内容,如果未能解决你的问题,请参考以下文章

C++_ static 的五种用法 __考题!!

C++_ static 的五种用法 __考题!!

C# 中的Async 和 Await 的用法详解

重新认识java ---- java中的另类:static关键字(附代码块知识)

Java 多线程同步的五种方法

java中static作用详解