java學習筆記(基礎篇)—關鍵字static和final

1、關鍵字Static

咱們從關鍵字static能夠修飾哪些東西入手,逐一的剖析static的使用和要注意的地方。java

1)修飾變量(只能修飾實例變量)----->靜態變量

又稱爲類變量dom

a)全部類實例共享
b)使用靜態變量
類名.變量名
c)靜態變量是屬於這個類,非靜態變量是屬於對象
d)代碼加載到內存靜態變量就已經存在了
e)static變量和實例變量的區別:
i)static變量對於每一個類而言在內存中只有一個,能被類的全部實例所共享;
實例變量對於每一個類的每一個實例都有一份,它們之間互不影響;
ii)Java虛擬機在加載類的過程當中爲static變量分配內存,
實例變量在加載完類後建立對象時分配內存;
iii)static變量存在方法區,實例變量存在堆區;
v)static變量能夠直接經過類名訪問,
實例變量經過引用類型變量訪問;ui

2)修飾方法====>靜態方法

稱爲類方法this

a)調用時使用
類名.方法名();
b)靜態方法不能使用非靜態的變量
靜態方法在類加載的時候就存在了
非靜態變量在對象建立的時候才存在的
非靜態方法能夠訪問靜態變量
c)靜態方法不能被非靜態方法重寫,靜態方法不能被靜態方法重寫(總之就是不能被 重寫)
d)靜態方法用來表示某個類所特有的功能,這種功能的實現不依賴於類的具體實例,也不依賴於它的子類。既然如此,當前類必須爲靜態方法提供實現。靜態方法屬於類。
e)不能使用this關鍵字和super關鍵字;(考慮它的生命週期來理解)code

this表示的當前對象,而被static修飾的是屬於類的,不須要建立對象就可使用;super是表明父類對象,調用父類的靜態方法直接使用類名.方法名就能夠。對象

3)靜態初始化塊----在類加載時只執行一次

​ 對靜態變量進行初始化,當Java虛似機加載類時,就會執行該代碼塊;被static 所修飾的成員變量和成員方法代表歸某個類全部,它不依賴於類的特定實例,被 類的全部實例共享。只要這個類被加載,Java虛擬機就能根據類名在運行時數據 區的方法區內定位到它們。並且只會被加載一次。繼承

static{
         System.out.print("hello static");
     }

4)普通初始化----每建立一個對象都會被調用的

對非靜態變量進行初始化:生命週期

{
          System.out.print("hello static");
      }

5)靜態導入

這個用法通常不太出現,不多使用。內存

import java.lang.Math;
使用:Math.random()字符串

import static java.lang.Math.*;
使用:random()

6)補充知識

建立一個對象時的類加載步驟或者說順序: Student student =new Student();猜猜它的執行順序會是什麼?咱們來理一理邏輯,子類繼承父類,建立一個子類對象首先要有一個父類被建立,Student()構造器裏默認有一個super()方法,全部會先初始化父類,而後是初始化子類的部分。下面來看具體的步驟:

public class Student extends Person{
    private static String name;
    private int age;

    public Student() {
        System.out.println("this student constructor");
    }

    static {
        System.out.println("this is student static block");
    }

    {
        System.out.println("hello student");
    }

    public static void main(String[] args) {
        Student stu = new Student();
    }
}

class Person{
    private static int count;
    private String title;

    public Person() {
        System.out.println("this person constructor");
    }
    static {
        System.out.println("this is person static block");
    }

    {
        System.out.println("hello person");
    }
}
  1. 父類初始化靜態變量和靜態代碼塊(按前後順序執行);
  2. 子類初始化靜態變量和靜態代碼塊(按前後順序執行);
  3. 父類初始化非靜態變量和非靜態代碼塊(按前後順序執行);
  4. 父類構造器
  5. 子類初始化非靜態變量和非靜態代碼塊(按前後順序執行);
  6. 子類構造器
//運行結果
this is person static block
this is student static block
hello person
this person constructor
hello student
this student constructor

2、關鍵字final

1)修飾變量---->常量

​ 變量必須初始化,變量的值不容許修改。
​ final變量都必須顯示初始化,
​ a) 修飾靜態變量,只能在定義變量時進行初始化;
​ b) 修飾實例變量,能夠在定義變量時進行初始化,或者在構造方法中進行初始 化;

2)修飾方法

​ 該方法不可以被重寫

3)修飾類

​ 該類不可以被繼承,即不能與abstract同時使用。
​ String類就是final修飾的類,全部字符串是不能改變的,只能經過拼接建立新的 String對象,這樣很浪費內存,因此又有了StringBuilder和StringBuffer;這兩 個類後面再解釋,能夠去思考和看他們的實現源碼。

3、思考final、finally和finalize的區別

後面出一篇關於這個的文章,敬請關注。

相關文章
相關標籤/搜索