Java面試 - static 修飾的變量和方法有哪些特點?


1、static修飾的變量和方法,在類加載時即被初始化,可直接通過類名.變量名和類型.方法名進行調用。
2、static修飾的變量,在類加載時會被分配到數據區的方法區。類的實例可共享方法區中的變量。如果static修飾的變量發生改變,那么所有類實例引用的變量都會一起發生改變。
3、static修飾的方法中不能使用this或super,static修飾的方法屬於類的方法,而this或super只是對象的方法。
4、static修飾的方法不能引用非static 修飾的變量, 在類加載過程中,當static修飾的方法加載完成時,非static修飾的變量
還未加載,所以無法引用非static修飾的變量。
5、非static修飾的方法可以引用static 修飾的變量,在類加載過程中,static修飾的變量優先完成加載,所以當非static修飾的方法
完成加載后可以引用static 修飾的變量。

舉例

假設Student 類有static 修飾的變量name和方法getName(String name), 那么是否可以直接通過類名調用呢?

public class Student {
  private static String name;
  private static void getName(){
    System.out.println(name);
  }
  public static void main(String[] args) {
    Student.name = "Jack Ma";
    Student.getName();
  }
}

運行結果:

Jack Ma

可見,static 修飾的變量和方法是可以直接通過類名調用的。
那么,在static 修飾的main方法內, Student 對象s1 和s2 是否可以直接調用static 修飾的變量和方法呢?

public class Student {
  private static String name;
  public static void getName(){
    System.out.println(name);
  }
  public static void main(String[] args) {
    Student s1 = new Student();
    s1.name = "大黃";
    s1.getName();
    Student s2 = new Student();
    s2.name = "二黃";
    s2.getName();
  }
}

運行結果:

大黃
二黃

從運行結果來看,在static 修飾的main方法內,Student 對象s1 和s2 是可以直接調用static 修飾的變量和方法。
如果此時修改static 修飾的變量name方法,那么Student對象s1, s2調用的變量name是否也會一起被修改呢?

public class Student {
  private static String name;
  public static void getName(){
    System.out.println(name);
  }
  public static void main(String[] args) {
    Student s1 = new Student();
    // 修改static 修飾的變量name
    s1.name = "Jack";
    s1.getName();
    Student s2 = new Student();
    s2.getName();
  }
}

運行結果:

Jack
Jack

從運行結果來看,當對象s1修改了在方法區(數據共享區)的static變量name,那么對象s2調用的static變量name必然會一起被修改。
在static修飾的方法中是否可以應用this呢?
在static修飾的方法中不能應用this.png
在static修飾的方法中是否可以應用super呢?
在static修飾的方法中不能應用super.png
在static修飾的方法是否能引用非static 修飾的變量呢?
static修飾的方法不能引用非static 修飾的變量.png
非static修飾的方法是否能引用static修飾的變量呢?

public class Student {
  private static String name;
  private int age;
  public void getInfo(){
    // 非static 方法getInfo()引用static修飾的變量name
    System.out.println("姓名:"+ name + ", 年齡" + age);
  }
  public static void main(String[] args) {
    Student s1 = new Student();
    //通過類名Student直接調用static 變量 name
    Student.name = "Jack Ma";
    s1.age = 19;
    s1.getInfo();
  }
}

運行一下

姓名:Jack Ma, 年齡19

可見,非static修飾的方法可以引用static修飾的變量


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM