亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java嵌套類和內部類詳解

2019-11-26 15:12:29
字體:
來源:轉載
供稿:網友

一、什么是嵌套類及內部類?

    可以在一個類的內部定義另一個類,這種類稱為嵌套類(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();
}
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久久久电影| 国产精品成人观看视频国产奇米| 日韩一区二区福利| 亚洲另类欧美自拍| 亚洲aa在线观看| 久久久久国产一区二区三区| 欧美日韩在线影院| 亚洲欧美一区二区三区在线| 狠狠躁18三区二区一区| 96精品视频在线| 中文字幕av一区二区| 色老头一区二区三区在线观看| 精品露脸国产偷人在视频| 久久久久久久久久久国产| 91精品国产91久久久久福利| 奇米四色中文综合久久| 亚洲美女av电影| 88国产精品欧美一区二区三区| 国产精品尤物福利片在线观看| 久久99久久99精品免观看粉嫩| 日韩欧美一区二区三区| 97在线免费观看视频| 福利视频一区二区| 精品国产自在精品国产浪潮| 91日本在线观看| 欧美黄色性视频| 亚洲精品视频网上网址在线观看| 欧美夫妻性生活xx| 精品久久久久久国产| 亚洲国产成人久久综合一区| 国产福利精品av综合导导航| 国产视频在线观看一区二区| 日韩成人中文电影| 久久国产精品首页| 国产欧洲精品视频| 国产精品都在这里| 国产精品欧美久久久| 国产一区二区三区在线视频| 91精品国产成人www| 国产视频精品免费播放| 欧美激情亚洲视频| 97精品视频在线| 久久国产精品偷| 综合欧美国产视频二区| 欧美在线视频在线播放完整版免费观看| 亚洲第一福利视频| 国产午夜精品美女视频明星a级| 欧美成人午夜激情| 亚洲欧美日韩爽爽影院| 狠狠久久五月精品中文字幕| 日韩影视在线观看| 亚洲999一在线观看www| www.xxxx欧美| 国产ts人妖一区二区三区| 欧洲日韩成人av| 亚洲第一区在线观看| 欧美富婆性猛交| 亚洲毛片在线看| 国产成人精品久久久| 亚洲一区中文字幕在线观看| 久久亚洲精品视频| 精品国产乱码久久久久久天美| 欧美成人午夜剧场免费观看| 成人网在线视频| 亚洲精品日韩av| 欧美成人三级视频网站| 成人h片在线播放免费网站| 午夜精品一区二区三区在线播放| 国产精品久久久久久久9999| 欧美日韩视频在线| 中文字幕无线精品亚洲乱码一区| 欧美日韩在线观看视频| 日韩经典第一页| 国产精品久久久av久久久| 亚洲电影天堂av| 成人黄色网免费| 精品无人区乱码1区2区3区在线| 国模吧一区二区| 欧美成人合集magnet| 精品视频久久久| 久久精品视频在线| 久久福利网址导航| 国产日韩欧美在线播放| 国产成人黄色av| 中文字幕精品影院| 亚洲成人精品av| 亚洲视频欧美视频| 97视频在线看| 日韩美女毛茸茸| 亚洲最大福利视频网站| 麻豆成人在线看| 久久99视频免费| 久久精品国产精品亚洲| 欧美日韩国产一区中文午夜| 人人做人人澡人人爽欧美| 国产一区二区在线免费视频| 久久久久久中文| 91av在线精品| 国产亚洲精品一区二区| 中文字幕日韩av电影| 中文字幕一区二区三区电影| 亚洲www在线观看| 俺去亚洲欧洲欧美日韩| 日韩在线视频导航| 日韩精品中文字幕视频在线| 亚洲成人黄色网址| 38少妇精品导航| 欧美亚洲激情视频| 另类专区欧美制服同性| 91国内产香蕉| 国产日韩在线亚洲字幕中文| 国产精品极品美女粉嫩高清在线| 亚洲免费电影一区| 成人久久18免费网站图片| 国产精品入口夜色视频大尺度| 福利视频导航一区| 成人高清视频观看www| 欧美成人精品一区二区| 亚洲一二在线观看| 国产精品精品国产| 国产精品极品尤物在线观看| 欧美黑人巨大精品一区二区| 亚洲国产精品成人精品| 欧美视频在线观看免费| 国产精品r级在线| 日韩成人在线观看| 91久久嫩草影院一区二区| 91丝袜美腿美女视频网站| 奇米成人av国产一区二区三区| 亚洲精品98久久久久久中文字幕| 久久精品视频中文字幕| 欧美尤物巨大精品爽| 色狠狠av一区二区三区香蕉蜜桃| 97热精品视频官网| 亚洲欧洲一区二区三区在线观看| 国产精品入口日韩视频大尺度| 亚洲人成电影网站| 精品人伦一区二区三区蜜桃网站| 欧美在线中文字幕| 久久精品国产亚洲一区二区| 精品一区二区亚洲| 欧美插天视频在线播放| 亚洲一区二区在线| 国产又爽又黄的激情精品视频| 97视频色精品| 国产成人97精品免费看片| 日韩av影视在线| 欧美怡红院视频一区二区三区| 久久精品最新地址| 亚洲丁香婷深爱综合| 不卡毛片在线看| 欧美色另类天堂2015| 高清欧美电影在线| 中文字幕精品一区久久久久| 亚洲精品永久免费精品| 亚洲人午夜色婷婷| 亚洲一区二区三| 91在线|亚洲| 亚洲第一级黄色片| 国产亚洲免费的视频看| 国产精品久久色| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲精品视频中文字幕| 久久乐国产精品|