<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java學(xué)習(xí)

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

     

    深入理解嵌套類和內(nèi)部類

    深入理解嵌套類和內(nèi)部類

    在java定義內(nèi)部類

    我想在一個(gè)類內(nèi)部再定義一個(gè)類,這個(gè)類可以在方法中定義嗎?
    比如說:
    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 {
    ...
    }
    這樣可以嗎?
    定義的時(shí)候可以用哪些修飾符,用用public嗎?
    能在public static void main(String[] args {...}中定義嗎?
    問題補(bǔ)充:
    各位前輩,小弟是個(gè)初學(xué)者,順便問一下,在java中,如何執(zhí)行一個(gè)可執(zhí)行文件,
    就像在VB中用shell去調(diào)用另一個(gè)可執(zhí)行文件.java中有沒有這樣的功能,如何有,
    應(yīng)該怎么做?

    比如說,我現(xiàn)在硬盤的D盤中有一個(gè)名為1.html網(wǎng)頁文件,如何我才能在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 {
    ...
    }
    這一個(gè)不可以。
    對(duì)于內(nèi)部類,就想類的屬性一樣,可以用 public private protected 修飾,或者什么都不加,但是如果這個(gè)內(nèi)部類在類的方法里面,public private protected都不能使用。就想在方法中定義變量不能加這三個(gè)修飾符一樣,方法中的內(nèi)部類也不能使用設(shè)三個(gè)修飾符,在方法中定義一個(gè)內(nèi)部類,一般是為了隱藏某種實(shí)現(xiàn)細(xì)節(jié),這個(gè)方法中的內(nèi)部類是不能在這個(gè)方法之外用new 關(guān)鍵字來創(chuàng)建的,但是可以作為這個(gè)方法的返回參數(shù)。

    關(guān)于你補(bǔ)充的問題,我還沒使用過。我覺得Java作為一門高級(jí)語言,應(yīng)該有這方面的設(shè)計(jì),我沒有用過。


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

    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";//內(nèi)部類公有成員
    public void display(){
    //System.out.println(id);//不能直接訪問外部類的非靜態(tài)成員
    System.out.println(name);//只能直接訪問外部類的靜態(tài)成員
    System.out.println("Inner "+address);//訪問本內(nèi)部類成員。
    }
    }

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

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

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

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

    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);//不能訪問內(nèi)部內(nèi)變量
    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();
    }
    }
    以上代碼需要說明有,對(duì)于內(nèi)部類,通常在定義類的class關(guān)鍵字前不加public 或 private等限制符,若加了
    沒有任何影響,同時(shí)好像這些限定符對(duì)內(nèi)部類的變量和方法也沒有影響(?)。另外,就是要注意,內(nèi)部類Inner及
    InnterTwo只在類Outer的作用域內(nèi)是可知的,如果類Outer外的任何代碼嘗試初始化類Inner或使用它,編譯就不
    會(huì)通過。同時(shí),內(nèi)部類的變量成員只在內(nèi)部內(nèi)內(nèi)部可見,若外部類或同層次的內(nèi)部類需要訪問,需采用示例程序
    中的方法,不可直接訪問內(nèi)部類的變量。

    四、在方法中定義內(nèi)部類
         如下所示代碼為在方法內(nèi)部定義一個(gè)內(nèi)部類:

    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);//不可訪問本方法內(nèi)部的非final變量
    //System.out.println(str2);//不可訪問本方法內(nèi)部的非final變量
    System.out.println(str3);//只可訪問本方法的final型變量成員
    }
    }
    InnerTwo innerTwo = new InnerTwo();
    innerTwo.testPrint();
    }

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


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

    從上面的例程我們可以看出定義在方法內(nèi)部的內(nèi)部類的可見性更小,它只在方法內(nèi)部
    可見,在外部類(及外部類的其它方法中)中都不可見了。同時(shí),它有一個(gè)特點(diǎn),就是方法
    內(nèi)的內(nèi)部類連本方法的成員變量都不可訪問,它只能訪問本方法的final型成員。同時(shí)另一個(gè)
    需引起注意的是方法內(nèi)部定義成員,只允許final修飾或不加修飾符,其它像static等均不可用。
    五、匿名內(nèi)部類
         如下所示代碼為定義一個(gè)匿名內(nèi)部類:匿名內(nèi)部類通常用在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接受一個(gè)對(duì)象型的參數(shù)表達(dá)式,于是,在參數(shù)里,我們定義了一個(gè)匿名內(nèi)部類這個(gè)類是一個(gè) MouseAdapter類型的類,同時(shí)在這個(gè)類中定義了一個(gè)繼承的方法mousePressed,整個(gè)類做為一個(gè)參數(shù)。這個(gè)類沒有名稱,但是當(dāng)執(zhí)行這個(gè) 表達(dá)式時(shí)它被自動(dòng)實(shí)例化。同時(shí)因?yàn)椋@個(gè)匿名內(nèi)部類是定義在AnonymousInnerClassDemo 類內(nèi)部的,所以它可以訪問它的方法showStatus。這同前面的內(nèi)部類是一致的。
    六、內(nèi)部類使用的其它的問題

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



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

    //測(cè)試第二個(gè)內(nèi)部類
    OfficePerson officePerson = new OfficePerson();
    officePerson.setName("abner chai");
    //注意此處,必須用 對(duì)象.new 出來對(duì)象的子類對(duì)象
    //而不是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 找個(gè)美女做老婆 閱讀(956) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    本blog已經(jīng)搬到新家了, 新家:www.javaly.cn
     http://www.javaly.cn

    常用鏈接

    留言簿(6)

    隨筆檔案

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲 国产 图片| 亚洲精品国产成人99久久| 国产精品免费视频观看拍拍| 久久久亚洲精品国产| 一级女人18毛片免费| 日本视频免费观看| 亚洲第一成年网站大全亚洲| 精品少妇人妻AV免费久久洗澡| 一级毛片a女人刺激视频免费| 亚洲视频在线观看网站| 国产成人精品高清免费| 伊人久久免费视频| 色噜噜的亚洲男人的天堂| 久久亚洲AV成人无码国产| 国产午夜无码视频免费网站| 99久久免费观看| 一级做a爰片久久毛片免费陪| 亚洲性色成人av天堂| 国产亚洲AV手机在线观看| 国产香蕉九九久久精品免费| 国内永久免费crm系统z在线| 亚洲精品成a人在线观看夫| 亚洲国产精品lv| 亚洲国产综合无码一区二区二三区| 国产成人yy免费视频| 怡红院免费的全部视频| 亚洲av日韩专区在线观看| 亚洲最大黄色网站| 日本红怡院亚洲红怡院最新| 国产成人免费ā片在线观看| 国产h肉在线视频免费观看| 青柠影视在线观看免费| 色网站在线免费观看| 亚洲性色精品一区二区在线| 亚洲人成亚洲精品| 亚洲国产日韩在线视频| mm1313亚洲精品国产| 免费毛片网站在线观看| 无码国产精品一区二区免费式影视| 野花香高清在线观看视频播放免费| 免费福利在线观看|