1. 程式人生 > 其它 >MySQL 批量插入或更新數萬條資料

MySQL 批量插入或更新數萬條資料

一、static關鍵字的用途

static可以用來修飾類的成員方法、類的成員變數,也可以編寫static程式碼塊來優化程式效能。

注意:

1、被static關鍵字修飾的方法或者變數不需要依賴於物件來進行訪問,只要類被載入了,就可以通過類名去進行訪問

2、禁止在靜態成員方法中訪問非靜態成員方法,但非靜態成員方法訪問靜態成員/方法是無限制的

3、構造器是否是static方法?
從Java語言規範中給出的“靜態方法”的定義來看,Java中的例項構造器不可以是“靜態方法”。Java語言中,例項構造器只能在new表示式或別的構造器中被呼叫,不能通過方法呼叫表示式來呼叫。new表示式作為一個整體保證了物件的建立與初始化是打包在一起的,不能分開進行。例項構造器只負責物件初始化部分,建立物件的部分是由new表示式本身保證的。
例項構造器無法被隱藏或覆寫,不參與多型,因而可以做靜態繫結。從這個意義上可以認為例項構造器是“靜態”的,但這種用法與Java語言定義的“靜態方法”是兩碼事。

4、靜態程式碼塊可以置於類中的任何地方,類中可以有多個static塊。在類初次被載入的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。很多時候會將一些只需要進行一次的初始化操作都放在static程式碼塊中進行,例如靜態成員變數的初始化。

二、static關鍵字的誤區

1、static關鍵字不會改變類中成員的訪問許可權

2、可以通過this訪問靜態成員,靜態成員雖然獨立於物件,但是所有的靜態成員都可以通過物件進行訪問
(只要訪問許可權足夠)

3、Java中static不允許用來修飾區域性變數(語法規定)

三、常見的筆試面試題

(1)、示例一

public class Test extends Base{
    static {
        System.out.println("test static");
    }
    public Test(){
        System.out.println("test constructor");
    }
    public static void main(String[] args) {
        new Test();
    }
}
class Base{
    static{
        System.out.println("base static");
    }
    public Base(){
        System.out.println("base constructor");
    }
}

執行結果:

base static
test static
base constructor
test constructor

分析:
在執行開始,先要找到main()方法,因為main()方法是程式的入口,但是在執行main()方法之前,必須先載入Test類,而在載入Test類的時候發現Test類繼承自Base類,因此會轉去先載入Base類,在載入Base類的時候,發現有static塊,便執行了static塊(Base類)。載入完Base類後繼續載入Test類,發現static塊,執行static塊(Test類)。

在載入完所需的類後,便開始執行main()方法。在main()方法中執行new Test()的時候會先呼叫父類的構造器,然後再呼叫自身的構造器。

因此,便出現了上面的輸出結果。

(2)、示例二

public class Test {
    Person person = new Person("Test");
    static {
        System.out.println("test static");
    }
    public Test(){
        System.out.println("test constructor");
    }
    public static void main(String[] args) {
        new MyClass();
    }
}
class Person{
    static {
        System.out.println("person static");
    }
    public Person(String str){
        System.out.println("person "+str);
    }
}
class MyClass extends Test{
    Person person=new Person("MyClass");
    static{
        System.out.println("myclass static");
    }
    public MyClass(){
        System.out.println("myclass constructor");
    }
}

執行結果:

test static
myclass static
person static
person Test
test constructor
person MyClass
myclass constructor

分析:
在執行開始,先要找到main()方法,因為main()方法是程式的入口,但是在執行main()方法之前,必須先載入Test類,在載入Test類的時候,發現static塊,執行static塊(Test類)。

載入完Test類後,執行new MyClass(),而MyClass類還沒有被載入,因此需要載入MyClass類。載入MyClass類時,發現MyClass類繼承自Test類,但Test類已經被載入了,所以只需要載入MyClass類,發現有static塊,執行static塊(MyClass類)。在載入完MyClass類之後,通過構造器來生成物件。

在初始化物件的時候,必須先初始化父類的成員變數,然後初始化父類例項。因此會執行Test類中的Person person = new Person(”Test"); 然而Person類還沒有被載入過,因此會先載入Person類並執行Person類中的static塊,繼續執行new Person("Test"),完成父類的成員變數的初始化,接著執行Test類的構造器,完成Test類物件的例項化。

父類例項化完成後,初始化自身的成員變數,因此會接著執行MyClass中的 Person person = new Person("MyClass"); 然後再執行MyClass的建構函式,至此,執行結束。

(3)、示例三

public class testConstructor3 {
    static {
        System.out.println("test static 1");
    }
    public static void main(String[] args) {}
    static {
        System.out.println("test static 2");
    }
}

執行結果:

test static 1
test static 2

分析:
在main方法中沒有任何語句,但是還是會輸出,因為在類初次被載入的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。