Corsair

          My javaWorld
          數(shù)據(jù)加載中……

          2007年1月14日

          JAVA3D包功能介紹

               摘要: 包 簡(jiǎn)介          ...  閱讀全文

          posted @ 2007-04-15 11:06 銀河海盜 閱讀(1706) | 評(píng)論 (3)編輯 收藏
          向上轉(zhuǎn)型中子類將能看到父類被覆蓋字段的現(xiàn)象探討

          我們知道,在子類繼承父類之后,如果子類與父類有同名的字段和方法,那么子類中的子段會(huì)代替或隱藏父類的子段,說(shuō)明子類字段覆蓋了超類字段,但可以通過(guò)super關(guān)鍵字去訪問(wèn)超類字段。但是,在我們將子類對(duì)象向超類轉(zhuǎn)型的時(shí)候就會(huì)發(fā)生這個(gè)奇怪的現(xiàn)象,子類對(duì)象居然可以看到父類曾經(jīng)被覆蓋掉的字段!就正如下面例子中一樣:

          ?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?????/*運(yùn)行結(jié)果
          21??????*?false
          22??????*?true
          23??????*?false
          24??????*?*/
          25?}

          為什么會(huì)發(fā)生這樣的情況呢?
          關(guān)于這種情況的解釋在[美]Peter van der Linden著的《Just Java2》中有了答案:
          P106他說(shuō):
          ???一定要注意:當(dāng)把子類轉(zhuǎn)換成超類時(shí),子類可以見到或訪問(wèn)被隱藏的同名變量。Java允許名字重復(fù)的原因是,允許將來(lái)把新的字段加到超類中,而不影響已經(jīng)使用了該名字的現(xiàn)有子類,子類將會(huì)繼續(xù)使用自己的字段副本。除非讓子類以超類對(duì)象的形式出現(xiàn),方法可以覆蓋,但是字段不能被覆蓋。注意:最好不要隱藏超類中的字段名。
          ?????
          所以我們?cè)谶M(jìn)行向上轉(zhuǎn)型的時(shí)候一定要注意:不要訪問(wèn)子類中那些“覆蓋”掉父類的字段(它并沒有真正覆蓋掉,在向上轉(zhuǎn)型的時(shí)候就可以訪問(wèn)的到),要么將子類字段改名(在你知道父類代碼的情況下),要么通過(guò)方法來(lái)訪問(wèn)字類字段(方法即使同名也肯定能覆蓋掉)。

          posted @ 2007-03-31 11:31 銀河海盜 閱讀(711) | 評(píng)論 (2)編輯 收藏
          繼承帶參數(shù)構(gòu)造器的超類并且調(diào)用自身其他構(gòu)造器的討論

          // 首先有一個(gè)帶參數(shù)的超類:?
          class ?SuperClass {?
          ???String?str
          = " create?superClass?obj " ;?
          ???SuperClass(
          int ?num) {?
          ???????System.out.println(num
          + str);?
          ???}
          ?
          }
          ?
          /*
          現(xiàn)在有一個(gè)子類繼承了這個(gè)超類,那么這個(gè)子類應(yīng)該顯式的調(diào)用超類的構(gòu)造函數(shù),以便初始化自己的父類,如下。?
          */

          class ?SubClass? extends ?SuperClass {?
          ???SubClass(
          int ?num) {?
          ??????
          super (num);?
          ???}
          ?
          }
          ?
          /*
          現(xiàn)在子類還要定義一個(gè)新的構(gòu)造函數(shù),并且在前一個(gè)構(gòu)造函數(shù)中調(diào)用這個(gè)新的構(gòu)造函數(shù),更改如下:?
          */

          class ?SubClass? extends ?SuperClass {?
          ???SubClass(
          int ?num) {?
          ??????
          super (num);?
          ??????
          this ( " other?SubClass(String) " );?
          ???}
          ?
          ???SubClass(String?s)
          {?
          ??????System.out.println(s);?
          ???}
          ?
          ???
          public ? static ? void ?main(String[]?args) {?
          ??????
          new ?SubClass();?
          ???}
          ?
          }
          ?
          /*
          由于我們知道在一個(gè)類中的構(gòu)造函數(shù)中要調(diào)用自己的其他構(gòu)造函數(shù),只能通過(guò)this();的方式調(diào)用一個(gè),并且要放在所在構(gòu)造函數(shù)的第一行,但是使用super();顯式調(diào)用也父類帶參構(gòu)造函數(shù)也只能放在第一行,那么這樣就會(huì)發(fā)生沖突。
          */
          // 參考:?
          public ? class ?SuperClass? {?
          String?str
          = " create?superClass?obj " ;??
          ?SuperClass(
          int ?num) {??
          ???????System.out.println(num
          + str);??
          ???}
          ??
          }
          ?
          public ? class ?SubClass? extends ?SuperClass? {?
          ???SubClass(
          int ?num) {??
          ??????
          super (num);??
          ??????sub(num,
          " other?Subclass(String) " );?
          ???}
          ??
          ???SubClass(
          int ?num,String?s) {??
          ??????
          super (num);?
          ??System.out.println(s);??
          ???}
          ?
          ???
          // -------------?
          ???SubClass?sub( int ?num,String?s) {?
          ???
          return ? new ?SubClass(num,s);?
          ???}
          ?
          ???
          public ? static ? void ?main(String[]?args) {??
          ??????
          new ?SubClass( 1 );?
          ???}
          ??
          }

          posted @ 2007-03-31 10:56 銀河海盜 閱讀(452) | 評(píng)論 (0)編輯 收藏
          關(guān)于名稱屏蔽討論

          關(guān)于超類方法重載,子類無(wú)法覆蓋其中的任意一個(gè)方法。

          public?class?SuperClass?{?
          public?void?method(){?
          System.out.println(
          "super?method()?worked.");?
          }
          ?
          public?void?method(int?a){?
          System.out.println(
          "super?method(int)?worked");?
          }
          ?
          public?void?method(String?s){?
          System.out.println(
          "super?method(string)?worked");?
          }
          ?
          }
          ?
          //------------sub---------------?
          public?class?SubClass?extends?SuperClass?{?
          ??
          public?void?method(){?
          ??System.out.println(
          "subclass?method()?worked");?
          ??}
          ?
          ??
          public?void?method(int?a){?
          ??
          super.method(a);?
          ??}
          ?
          ??
          public?void?method(char?c){?
          ??System.out.println(
          "subclass?method(char)?worked");?
          ??}
          ?
          }
          ?
          //------------run---------------?
          public?class?Test?{?
          public?static?void?run(SuperClass?a){?
          a.method();?
          a.method(
          1);?
          a.method(
          "string");?
          }
          ?
          public?static?void?main(String[]?args)?{?
          run(
          new?SubClass());?
          new?SubClass().method('r');?
          }
          ?
          }
          ?
          //=============END===============?
          subclass?method()?worked?
          super?method(int)?worked?
          super?method(string)?worked?
          subclass?method(
          char)?worked?
          //=============END===============?

          posted @ 2007-03-31 10:53 銀河海盜 閱讀(322) | 評(píng)論 (1)編輯 收藏
          解決linux環(huán)境下jsp+mysql數(shù)據(jù)庫(kù)中文亂碼的問(wèn)題

          經(jīng)過(guò)一個(gè)星期的艱苦奮斗終于解決了這個(gè)問(wèn)題,特將經(jīng)驗(yàn)摘錄下來(lái)備忘。本文將解決以下的幾種亂碼問(wèn)題。

          中文存入 mysql 數(shù)據(jù)表出現(xiàn)的亂碼,從 JSP 頁(yè)面讀取 mysql 中文數(shù)據(jù)出現(xiàn)亂碼,以及在 sell 環(huán)境下查看數(shù)據(jù)庫(kù)表中文數(shù)據(jù)出現(xiàn)亂碼。

          linux平臺(tái):ubuntu6.10

          mysql版本:5.0

          瀏覽器:firefox2.0

          為了解決中文亂碼的問(wèn)題首先就是要同一字符集,我采用utf-8

          第一步:安裝mysql后,修改配置文件/etc/mysql/my.cnf 找到相應(yīng)項(xiàng)并添加如下字段,如下所示:(注意是添加,配置文件中其他不相關(guān)的內(nèi)容下面并沒有列出來(lái))

          [client]

          default-character-set=utf8

          [mysqld_safe]

          default-character-set=utf8

          [mysqld]

          default-character-set=utf8

          [mysql]

          default-character-set=utf8

          重新啟動(dòng)mysql服務(wù),進(jìn)入sell終端,進(jìn)入mysql的命令提示符下輸入如下指令:

          mysql>show variables like '%char%';

          如果出現(xiàn)的列表各項(xiàng)內(nèi)容和以下相同表明配置成功了,

          +---------------------+---------------------

          | 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/

          +---------------------+----------------------

          第二步:在要發(fā)送中文或者要讀取中文的JSP頁(yè)面(最好所有頁(yè)面)都添加如下聲明:

          <%@page pageEncoding="UTF-8"%>

          <%@ page contentType="text/html;charset=utf-8"%>

          <% request.setCharacterEncoding("utf-8"); %>

          <head>標(biāo)簽對(duì)中添加如下:

          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

          注意在servlet中對(duì)請(qǐng)求進(jìn)行響應(yīng)的方法中同樣要有:

          response.setContentType("text/html;charset=utf-8");


          第三步:(由于不明原因firefox發(fā)送的請(qǐng)求仍然是latin1的時(shí)候執(zhí)行這一步)

          在將請(qǐng)求的參數(shù)插入數(shù)據(jù)庫(kù)之前還要再執(zhí)行一次轉(zhuǎn)碼(latin1編碼轉(zhuǎn)換為utf-8),例如:

          String utf8_str = new String( latin_str .getBytes("latin1"),"utf-8");

          這一步可以寫在一個(gè)過(guò)濾器中,不怕麻煩也可以在每一次在將請(qǐng)求數(shù)據(jù)插入之前都進(jìn)行一次轉(zhuǎn)碼。


          另外:在連接數(shù)據(jù)庫(kù)的時(shí)候可以不用加上字符集參數(shù)了,直接用用戶名和密碼連接就可以了,如連接:

          con=DriverManager.getConnection("jdbc:mysql://localhost:3306/數(shù)據(jù)庫(kù)名","用戶名","密碼");

          posted @ 2007-01-14 20:04 銀河海盜 閱讀(2053) | 評(píng)論 (0)編輯 收藏
          設(shè)計(jì)模式學(xué)習(xí)筆記(2006.10,11,12)

               摘要: 時(shí)間過(guò)的快么?人的感覺而已,時(shí)間還是那樣地流過(guò),但人們卻有不同的感受,收獲的越多,感覺時(shí)間過(guò)的越慢,認(rèn)知的越少,時(shí)間也就過(guò)的越快。有三個(gè)月沒寫點(diǎn)什么東西了,為了讓時(shí)間記住這三個(gè)月都發(fā)生了什么,趁現(xiàn)在還沒有忘記還是記錄下來(lái)罷,今天心情不好所以廢話也就多點(diǎn)。 ?????? 按時(shí)間順序一個(gè)一個(gè)來(lái)吧。 ...  閱讀全文

          posted @ 2007-01-14 03:19 銀河海盜 閱讀(312) | 評(píng)論 (0)編輯 收藏
          主站蜘蛛池模板: 高碑店市| 丹巴县| 南木林县| 南部县| 冀州市| 邛崃市| 班戈县| 台南市| 石柱| 高陵县| 怀远县| 巴彦淖尔市| 穆棱市| 满城县| 谷城县| 会昌县| 富锦市| 北海市| 依兰县| 错那县| 右玉县| 中方县| 宁蒗| 巴彦淖尔市| 四川省| 于田县| 博客| 诸暨市| 祁阳县| 远安县| 班戈县| 罗江县| 文山县| 宣汉县| 六枝特区| 巴塘县| 休宁县| 虹口区| 隆尧县| 丰都县| 平原县|