天天看點

難點 statement 枚舉類的應用 正确答案: D   你的答案: A (錯誤) 正确答案: C   你的答案: B (錯誤)

1.下面哪個不是标準Statement類?

Statement 對象用于将 SQL 語句發送到資料庫中。實際上有三種 Statement 對象,它們都作為在給定連接配接上執行 SQL 語句的包容器:Statement、PreparedStatement(它從 Statement 繼承而來)和 CallableStatement(它從 PreparedStatement

繼承而來)。它們都專用于發送特定類型的 SQL 語句: Statement 對象用于執行不帶參數的簡單

SQL 語句;PreparedStatement 對象用于執行帶或不帶 IN 參數的預編譯 SQL

語句;CallableStatement 對象用于執行對資料庫已存在的存儲過程的調用。

Statement是sql語句的載體

Statement是标準的Statement類,通過字元串對sql語句進行拼接,但是它存在sql注入的危險

PreparedStatement對sql語句進行了預編譯,可以防止SQL注入

CallableStatement用來調用存儲過程的

BatchedStatement用于批量操作資料庫,BatchedStatement不是标準的Statement類

2.what is the result of the following code?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<code>enum</code><code>AccountType</code>

<code>{</code>

<code>    </code><code>SAVING, FIXED, CURRENT;</code>

<code>    </code><code>private</code><code>AccountType()</code>

<code>    </code><code>{</code>

<code>        </code><code>System.out.println(“It is a account type”);</code>

<code>    </code><code>}</code>

<code>}</code>

<code>class</code><code>EnumOne</code>

<code>    </code><code>public</code><code>static</code>

<code>void</code> <code>main(String[]args)</code>

<code>        </code><code>System.out.println(AccountType.FIXED);</code>

<code>   </code> 

枚舉類在背景實作時,實際上是轉化為一個繼承了java.lang.Enum類的實體類,原先的枚舉類型變成對應的實體類型,

上例中AccountType變成了個class AccountType,并且會生成一個新的構造函數,若原來有構造函數,則在此基礎上

添加兩個參數,生成新的構造函數,如上例子中:

<code>private</code><code>AccountType(){ System.out.println(“It is a account type”); }</code>

會變成:

<code>private</code><code>AccountType(String s, </code><code>int</code><code>i){</code>

<code>    </code><code>super</code><code>(s,i); System.out.println(“It is a account type”); }</code>

而在這個類中,會添加若幹字段來代表具體的枚舉類型:

<code>public</code><code>static</code>

<code>final</code> <code>AccountType SAVING;</code>

<code>final</code> <code>AccountType FIXED;</code>

<code>final</code> <code>AccountType CURRENT;</code>

而且還會添加一段static代碼段:

<code>static</code><code>{</code>

<code>    </code><code>SAVING = </code><code>new</code><code>AccountType(</code><code>"SAVING"</code><code>, </code><code>0</code><code>);</code>

<code>    </code><code>...  CURRENT = </code><code>new</code><code>AccountType(</code><code>"CURRENT"</code><code>, </code><code>0</code><code>);</code>

<code>   </code><code>$VALUES = </code><code>new</code><code>AccountType[]{</code>

<code>         </code><code>SAVING, FIXED, CURRENT</code>

<code>    </code><code>} }</code>

以此來初始化枚舉中的每個具體類型。(并将所有具體類型放到一個$VALUE數組中,以便用序号通路具體類型)

在初始化過程中new AccountType構造函數被調用了三次,是以Enum中定義的構造函數中的列印代碼被執行了3遍。

怎麼通過執行AccountType.FIXED這句到調用靜态代碼塊的?這個其實是與java類中靜态代碼的初始化有關:類中的靜态類型,

僅在程式中第一次被使用時才會被初始化,且隻初始化一次。初始化過程中還會自動調用類中用static{ }括起來的代碼。

是以static final的字段的初始化過程才可以寫在static{ }中。