我們知道,在子類繼承父類之后,如果子類與父類有同名的字段和方法,那么子類中的子段會代替或隱藏父類的子段,說明子類字段覆蓋了超類字段,但可以通過super關鍵字去訪問超類字段。但是,在我們將子類對象向超類轉型的時候就會發生這個奇怪的現象,子類對象居然可以看到父類曾經被覆蓋掉的字段!就正如下面例子中一樣:
?1?class?A{
?2?????boolean?bb?=false;
?3?}
?4?
?5?public?class?B?extends?A{
?6?????boolean?bb?=?true;
?7?????//int?a=1;
?8?????public?static?void?main(String[]?args)?{
?9?????????B?b?=new?B();
10?????????A?a?;
11?????????a=?b;
12?????????//---??
13?????????System.out.println(a.bb);
14?????????//---這句可以理解
15?????????System.out.println(b.bb);
16?????????//---??
17?????????System.out.println(?((A)b).bb);
18?????????//----
19?????}
20?????/*運行結果
21??????*?false
22??????*?true
23??????*?false
24??????*?*/
25?}
為什么會發生這樣的情況呢?
關于這種情況的解釋在[美]Peter van der Linden著的《Just Java2》中有了答案:
P106他說:
???一定要注意:當把子類轉換成超類時,子類可以見到或訪問被隱藏的同名變量。Java允許名字重復的原因是,允許將來把新的字段加到超類中,而不影響已經使用了該名字的現有子類,子類將會繼續使用自己的字段副本。
除非讓子類以超類對象的形式出現,方法可以覆蓋,但是字段不能被覆蓋。注意:最好不要隱藏超類中的字段名。
?????所以我們在進行向上轉型的時候一定要注意:不要訪問子類中那些“覆蓋”掉父類的字段(它并沒有真正覆蓋掉,在向上轉型的時候就可以訪問的到),要么將子類字段改名(在你知道父類代碼的情況下),要么通過方法來訪問字類字段(方法即使同名也肯定能覆蓋掉)。
經過一個星期的艱苦奮斗終于解決了這個問題,特將經驗摘錄下來備忘。本文將解決以下的幾種亂碼問題。
中文存入
mysql
數據表出現的亂碼,從
JSP
頁面讀取
mysql
中文數據出現亂碼,以及在
sell
環境下查看數據庫表中文數據出現亂碼。
linux平臺:ubuntu6.10
mysql版本:5.0
瀏覽器:firefox2.0
為了解決中文亂碼的問題首先就是要同一字符集,我采用utf-8。
第一步:安裝mysql后,修改配置文件/etc/mysql/my.cnf 找到相應項并添加如下字段,如下所示:(注意是添加,配置文件中其他不相關的內容下面并沒有列出來)
[client]
default-character-set=utf8
[mysqld_safe]
default-character-set=utf8
[mysqld]
default-character-set=utf8
[mysql]
default-character-set=utf8
重新啟動mysql服務,進入sell終端,進入mysql的命令提示符下輸入如下指令:
mysql>show variables like '%char%';
如果出現的列表各項內容和以下相同表明配置成功了,
+----------------------+---------------------
| Variable_name | Value
+-----------------------+---------------------
| character_set_client | utf8
| character_set_connection | utf8
| character_set_database | utf8
| character_set_filesystem | binary
| character_set_results | utf8
| character_set_server | utf8
| character_set_system | utf8
| character_sets_dir | /usr/share/mysql/charsets/
+---------------------+----------------------
第二步:在要發送中文或者要讀取中文的JSP頁面(最好所有頁面)都添加如下聲明:
<%@page pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=utf-8"%>
<% request.setCharacterEncoding("utf-8"); %>
在<head>標簽對中添加如下:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
注意在servlet中對請求進行響應的方法中同樣要有:
response.setContentType("text/html;charset=utf-8");
第三步:(由于不明原因firefox發送的請求仍然是latin1的時候執行這一步)
在將請求的參數插入數據庫之前還要再執行一次轉碼(將latin1編碼轉換為utf-8),例如:
String
utf8_str
= new String(
latin_str
.getBytes("latin1"),"utf-8");
這一步可以寫在一個過濾器中,不怕麻煩也可以在每一次在將請求數據插入之前都進行一次轉碼。
另外:在連接數據庫的時候可以不用加上字符集參數了,直接用用戶名和密碼連接就可以了,如連接:
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/數據庫名","用戶名","密碼");
摘要: 時間過的快么?人的感覺而已,時間還是那樣地流過,但人們卻有不同的感受,收獲的越多,感覺時間過的越慢,認知的越少,時間也就過的越快。有三個月沒寫點什么東西了,為了讓時間記住這三個月都發生了什么,趁現在還沒有忘記還是記錄下來罷,今天心情不好所以廢話也就多點。
??????
按時間順序一個一個來吧。
... 閱讀全文