Java學習

          java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已經搬家了,新的地址是 http://www.javaly.cn 如果有對文章有任何疑問或者有任何不懂的地方,歡迎到www.javaly.cn (Java樂園)指出,我會盡力幫助解決。一起進步

           

          深入理解嵌套類和內部類

          深入理解嵌套類和內部類

          在java定義內部類

          我想在一個類內部再定義一個類,這個類可以在方法中定義嗎?
          比如說:
          public class A {
          void a{ class B{...} }
          public static void main(String[] args {
          ...
          }
          這樣可以嗎?
          又比如說:
          public class A {
          public class B {
          ...}
          public static void main(String[] args {
          ...
          }
          這樣可以嗎?
          或者:
          public class A {
          void a {
          Protected class B {
          ...}
          }
          public static void main(String[] args {
          ...
          }
          這樣可以嗎?
          定義的時候可以用哪些修飾符,用用public嗎?
          能在public static void main(String[] args {...}中定義嗎?
          問題補充:
          各位前輩,小弟是個初學者,順便問一下,在java中,如何執行一個可執行文件,
          就像在VB中用shell去調用另一個可執行文件.java中有沒有這樣的功能,如何有,
          應該怎么做?

          比如說,我現在硬盤的D盤中有一個名為1.html網頁文件,如何我才能在java中用IE把它打開呢?

          public class A {
          void a{ class B{...} }
          public static void main(String[] args {
          ...
          }

          public class A {
          public class B {
          ...}
          public static void main(String[] args {
          ...
          }
          這些都是可以的

          public class A {
          void a {
          Protected class B {
          ...}
          }
          public static void main(String[] args {
          ...
          }
          這一個不可以。
          對于內部類,就想類的屬性一樣,可以用 public private protected 修飾,或者什么都不加,但是如果這個內部類在類的方法里面,public private protected都不能使用。就想在方法中定義變量不能加這三個修飾符一樣,方法中的內部類也不能使用設三個修飾符,在方法中定義一個內部類,一般是為了隱藏某種實現細節,這個方法中的內部類是不能在這個方法之外用new 關鍵字來創建的,但是可以作為這個方法的返回參數。

          關于你補充的問題,我還沒使用過。我覺得Java作為一門高級語言,應該有這方面的設計,我沒有用過。


          一、什么是嵌套類及內部類?
               可以在一個類的內部定義另一個類,這種類稱為嵌套類(nested classes),它有兩種類型:
          靜態嵌套類和非靜態嵌套類。靜態嵌套類使用很少,最重要的是非靜態嵌套類,也即是被稱作為
          內部類(inner)。嵌套類從JDK1.1開始引入。其中inner類又可分為三種:
               其一、在一個類(外部類)中直接定義的內部類;
               其二、在一個方法(外部類的方法)中定義的內部類;
               其三、匿名內部類。
          下面,我將說明這幾種嵌套類的使用及注意事項。
          二、靜態嵌套類
               如下所示代碼為定義一個靜態嵌套類,

          public class StaticTest {
          private static String name = "javaJohn";
          private String id = "X001";

          static class Person{
          private String address = "swjtu,chenDu,China";
          public String mail = "josserchai@yahoo.com";//內部類公有成員
          public void display(){
          //System.out.println(id);//不能直接訪問外部類的非靜態成員
          System.out.println(name);//只能直接訪問外部類的靜態成員
          System.out.println("Inner "+address);//訪問本內部類成員。
          }
          }

          public void printInfo(){
          Person person = new Person();
          person.display();

          //System.out.println(mail);//不可訪問
          //System.out.println(address);//不可訪問

          System.out.println(person.address);//可以訪問內部類的私有成員
          System.out.println(person.mail);//可以訪問內部類的公有成員

          }
          public static void main(String[] args) {
          StaticTest staticTest = new StaticTest();
          staticTest.printInfo();
          }
          }
          在靜態嵌套類內部,不能訪問外部類的非靜態成員,這是由Java語法中"靜態方法不能直接訪問非靜態成員"所限定。
          若想訪問外部類的變量,必須通過其它方法解決,由于這個原因,靜態嵌套類使用很少。注意,外部類訪問內
          部類的的成員有些特別,不能直接訪問,但可以通過內部類來訪問,這是因為靜態嵌套內的所有成員和方法默認為
          靜態的了。同時注意,內部靜態類Person只在類StaticTest 范圍內可見,若在其它類中引用或初始化,均是錯誤的。
          三、在外部類中定義內部類
               如下所示代碼為在外部類中定義兩個內部類及它們的調用關系:

          public class Outer{
          int outer_x = 100;

          class Inner{
          public int y = 10;
          private int z = 9;
          int m = 5;
          public void display(){
          System.out.println("display outer_x:"+ outer_x);
          }
          private void display2(){
          System.out.println("display outer_x:"+ outer_x);
          }

          }

          void test(){
          Inner inner = new Inner();
          inner.display();
          inner.display2();
          //System.out.println("Inner y:" + y);//不能訪問內部內變量
          System.out.println("Inner y:" + inner.y);//可以訪問
          System.out.println("Inner z:" + inner.z);//可以訪問
          System.out.println("Inner m:" + inner.m);//可以訪問

          InnerTwo innerTwo = new InnerTwo();
          innerTwo.show();
          }

          class InnerTwo{
          Inner innerx = new Inner();
          public void show(){
          //System.out.println(y);//不可訪問Innter的y成員
          //System.out.println(Inner.y);//不可直接訪問Inner的任何成員和方法
          innerx.display();//可以訪問
          innerx.display2();//可以訪問
          System.out.println(innerx.y);//可以訪問
          System.out.println(innerx.z);//可以訪問
          System.out.println(innerx.m);//可以訪問
          }
          }

          public static void main(String args[]){
          Outer outer = new Outer();
          outer.test();
          }
          }
          以上代碼需要說明有,對于內部類,通常在定義類的class關鍵字前不加public 或 private等限制符,若加了
          沒有任何影響,同時好像這些限定符對內部類的變量和方法也沒有影響(?)。另外,就是要注意,內部類Inner及
          InnterTwo只在類Outer的作用域內是可知的,如果類Outer外的任何代碼嘗試初始化類Inner或使用它,編譯就不
          會通過。同時,內部類的變量成員只在內部內內部可見,若外部類或同層次的內部類需要訪問,需采用示例程序
          中的方法,不可直接訪問內部類的變量。

          四、在方法中定義內部類
               如下所示代碼為在方法內部定義一個內部類:

          public class FunOuter {
          int out_x = 100;

          public void test(){
          class Inner{
          String x = "x";
          void display(){
          System.out.println(out_x);
          }
          }
          Inner inner = new Inner();
          inner.display();
          }

          public void showStr(String str){
          //public String str1 = "test Inner";//不可定義,只允許final修飾
          //static String str4 = "static Str";//不可定義,只允許final修飾
          String str2 = "test Inner";
          final String str3 = "final Str";
          class InnerTwo{
          public void testPrint(){
          System.out.println(out_x);//可直接訪問外部類的變量
          //System.out.println(str);//不可訪問本方法內部的非final變量
          //System.out.println(str2);//不可訪問本方法內部的非final變量
          System.out.println(str3);//只可訪問本方法的final型變量成員
          }
          }
          InnerTwo innerTwo = new InnerTwo();
          innerTwo.testPrint();
          }

          public void use(){
          //Inner innerObj = new Inner();//此時Inner己不可見了。
          //System.out.println(Inner.x);//此時Inner己不可見了。
          }


          public static void main(String[] args) {
          FunOuter outer = new FunOuter();
          outer.test();
          }
          }

          從上面的例程我們可以看出定義在方法內部的內部類的可見性更小,它只在方法內部
          可見,在外部類(及外部類的其它方法中)中都不可見了。同時,它有一個特點,就是方法
          內的內部類連本方法的成員變量都不可訪問,它只能訪問本方法的final型成員。同時另一個
          需引起注意的是方法內部定義成員,只允許final修飾或不加修飾符,其它像static等均不可用。
          五、匿名內部類
               如下所示代碼為定義一個匿名內部類:匿名內部類通常用在Java的事件處理上


          import java.applet.*;
          import java.awt.event.*;

               public class AnonymousInnerClassDemo extends Applet{
               public void init(){
                   addMouseListener(new MouseAdapter(){
                       public void mousePressed(MouseEvent me){
                        showStatus("Mouse Pressed!");
                   }
                   })
               }
               public void showStatus(String str){
                   System.out.println(str);
               }
               }

          在上面的例子中,方法addMouseListener接受一個對象型的參數表達式,于是,在參數里,我們定義了一個匿名內部類這個類是一個 MouseAdapter類型的類,同時在這個類中定義了一個繼承的方法mousePressed,整個類做為一個參數。這個類沒有名稱,但是當執行這個 表達式時它被自動實例化。同時因為,這個匿名內部類是定義在AnonymousInnerClassDemo 類內部的,所以它可以訪問它的方法showStatus。這同前面的內部類是一致的。
          六、內部類使用的其它的問題

          通過以上,我們可以清楚地看出內部類的一些使用方法,同時,在許多時候,內部類是在如Java的事件處理、或做為值對象來使用的。同時,我們需注意最后一 個問題,那就是,內部類同其它類一樣被定義,同樣它也可以繼承外部其它包的類和實現外部其它地方的接口。同樣它也可以繼承同一層次的其它的內部類,甚至可 以繼承外部類本身。下面我們給出最后一個例子做為結束:



          public class Layer {
          //Layer類的成員變量
          private String testStr = "testStr";

          //Person類,基類
          class Person{
          String name;
          Email email;
          public void setName(String nameStr){
          this.name = nameStr;
          }
          public String getName(){
          return this.name;
          }
          public void setEmail(Email emailObj){

          this.email = emailObj;
          }
          public String getEmail(){
          return this.email.getMailStr();
          }
          //內部類的內部類,多層內部類
          class Email{
          String mailID;
          String mailNetAddress;
          Email(String mailId,String mailNetAddress){
          this.mailID = mailId;
          this.mailNetAddress = mailNetAddress;
          }
          String getMailStr(){
          return this.mailID +"@"+this.mailNetAddress;
          }
          }
          }
          //另一個內部類繼承外部類本身
          class ChildLayer extends Layer{
          void print(){
          System.out.println(super.testStr);//訪問父類的成員變量
          }
          }
          //另個內部類繼承內部類Person
          class OfficePerson extends Person{
          void show(){
          System.out.println(name);
          System.out.println(getEmail());
          }
          }
          //外部類的測試方法
          public void testFunction(){
          //測試第一個內部類
          ChildLayer childLayer = new ChildLayer();
          childLayer.print();

          //測試第二個內部類
          OfficePerson officePerson = new OfficePerson();
          officePerson.setName("abner chai");
          //注意此處,必須用 對象.new 出來對象的子類對象
          //而不是Person.new Email(...)
          //也不是new Person.Email(...)
          officePerson.setEmail(officePerson.new Email("josserchai","yahoo.com"));

          officePerson.show();
          }
          public static void main(String[] args) {
          Layer layer = new Layer();
          layer.testFunction();
          }
          }

          posted on 2009-10-16 08:59 找個美女做老婆 閱讀(961) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          公告

          本blog已經搬到新家了, 新家:www.javaly.cn
           http://www.javaly.cn

          常用鏈接

          留言簿(6)

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 明水县| 交口县| 周口市| 阿拉尔市| 洪泽县| 宕昌县| 巴南区| 鄂伦春自治旗| 湾仔区| 开封市| 修文县| 特克斯县| 钦州市| 乌鲁木齐市| 呼玛县| 惠安县| 沂源县| 定州市| 和硕县| 洛川县| 伊吾县| 定结县| 卢氏县| 江永县| 屯留县| 南投市| 全州县| 洞头县| 育儿| 外汇| 年辖:市辖区| 前郭尔| 武鸣县| 海兴县| 昭通市| 应用必备| 龙川县| 南华县| 长春市| 宁阳县| 新丰县|