欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java嵌套類和內(nèi)部類詳解

 更新時間:2015年04月27日 08:53:27   投稿:junjie  
這篇文章主要介紹了Java嵌套類和內(nèi)部類詳解,本文講解了什么是嵌套類及內(nèi)部類、靜態(tài)嵌套類、在外部類中定義內(nèi)部類、在方法中定義內(nèi)部類、匿名內(nèi)部類等內(nèi)容,需要的朋友可以參考下

一、什么是嵌套類及內(nèi)部類?

    可以在一個類的內(nèi)部定義另一個類,這種類稱為嵌套類(nested classes),它有兩種類型:
靜態(tài)嵌套類和非靜態(tài)嵌套類。靜態(tài)嵌套類使用很少,最重要的是非靜態(tài)嵌套類,也即是被稱作為
內(nèi)部類(inner)。嵌套類從JDK1.1開始引入。其中inner類又可分為三種:

    其一、在一個類(外部類)中直接定義的內(nèi)部類;
    其二、在一個方法(外部類的方法)中定義的內(nèi)部類;
    其三、匿名內(nèi)部類。

下面,我將說明這幾種嵌套類的使用及注意事項。

二、靜態(tài)嵌套類

    如下所示代碼為定義一個靜態(tài)嵌套類,

復(fù)制代碼 代碼如下:

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)成員"所限定。
若想訪問外部類的變量,必須通過其它方法解決,由于這個原因,靜態(tài)嵌套類使用很少。注意,外部類訪問內(nèi)
部類的的成員有些特別,不能直接訪問,但可以通過內(nèi)部類來訪問,這是因為靜態(tài)嵌套內(nèi)的所有成員和方法默認(rèn)為
靜態(tài)的了。同時注意,內(nèi)部靜態(tài)類Person只在類StaticTest 范圍內(nèi)可見,若在其它類中引用或初始化,均是錯誤的。

三、在外部類中定義內(nèi)部類

    如下所示代碼為在外部類中定義兩個內(nèi)部類及它們的調(diào)用關(guān)系:

復(fù)制代碼 代碼如下:

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();
}
}

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

四、在方法中定義內(nèi)部類
    如下所示代碼為在方法內(nèi)部定義一個內(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();//此時Inner己不可見了。
//System.out.println(Inner.x);//此時Inner己不可見了。
}


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


從上面的例程我們可以看出定義在方法內(nèi)部的內(nèi)部類的可見性更小,它只在方法內(nèi)部
可見,在外部類(及外部類的其它方法中)中都不可見了。同時,它有一個特點,就是方法
內(nèi)的內(nèi)部類連本方法的成員變量都不可訪問,它只能訪問本方法的final型成員。同時另一個
需引起注意的是方法內(nèi)部定義成員,只允許final修飾或不加修飾符,其它像static等均不可用。

五、匿名內(nèi)部類
    如下所示代碼為定義一個匿名內(nèi)部類:匿名內(nèi)部類通常用在Java的事件處理上

復(fù)制代碼 代碼如下:

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接受一個對象型的參數(shù)表達(dá)式,于是,在參數(shù)里,我們定義了一個匿名內(nèi)部類這個類是一個MouseAdapter類型的類,同時在這個類中定義了一個繼承的方法mousePressed,整個類做為一個參數(shù)。這個類沒有名稱,但是當(dāng)執(zhí)行這個表達(dá)式時它被自動實例化。同時因為,這個匿名內(nèi)部類是定義在AnonymousInnerClassDemo 類內(nèi)部的,所以它可以訪問它的方法showStatus。這同前面的內(nèi)部類是一致的。

六、內(nèi)部類使用的其它的問題

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

復(fù)制代碼 代碼如下:

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;
}
}
}
//另一個內(nèi)部類繼承外部類本身
class ChildLayer extends Layer{
void print(){
System.out.println(super.testStr);//訪問父類的成員變量
}
}
//另個內(nèi)部類繼承內(nèi)部類Person
class OfficePerson extends Person{
void show(){
System.out.println(name);
System.out.println(getEmail());
}
}
//外部類的測試方法
public void testFunction(){
//測試第一個內(nèi)部類
ChildLayer childLayer = new ChildLayer();
childLayer.print();

//測試第二個內(nèi)部類
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();
}
}

相關(guān)文章

  • 簡化API提升開發(fā)效率RestTemplate與HttpClient?OkHttp關(guān)系詳解

    簡化API提升開發(fā)效率RestTemplate與HttpClient?OkHttp關(guān)系詳解

    這篇文章主要為大家介紹了簡化API,提升開發(fā)效率,RestTemplate與HttpClient?OkHttp關(guān)系介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Java參數(shù)傳遞及值傳遞實現(xiàn)原理詳解

    Java參數(shù)傳遞及值傳遞實現(xiàn)原理詳解

    這篇文章主要介紹了Java參數(shù)傳遞及值傳遞實現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 解決Springboot @WebFilter攔截器未生效問題

    解決Springboot @WebFilter攔截器未生效問題

    這篇文章主要介紹了解決Springboot @WebFilter攔截器未生效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Spring多個數(shù)據(jù)源配置詳解

    Spring多個數(shù)據(jù)源配置詳解

    在實際場景中,會有需要配置多個數(shù)據(jù)源的場景,本文就介紹一下如何配置Spring多數(shù)據(jù)源,具有一定的參考價值,感興趣的可以了解一下
    2021-08-08
  • SpringBoot從配置文件中獲取屬性的四種方法總結(jié)

    SpringBoot從配置文件中獲取屬性的四種方法總結(jié)

    這篇文章主要介紹了SpringBoot從配置文件中獲取屬性的四種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • IntelliJ IDEA像Eclipse一樣打開多個項目的圖文教程

    IntelliJ IDEA像Eclipse一樣打開多個項目的圖文教程

    這篇文章主要介紹了IntelliJ IDEA像Eclipse一樣打開多個項目的方法圖文教程講解,需要的朋友可以參考下
    2018-03-03
  • Java中日期時間的用法總結(jié)

    Java中日期時間的用法總結(jié)

    在日常開發(fā)中,我們經(jīng)常需要處理日期和時間,所以這篇文章小編為大家總結(jié)了下?Java?中日期與時間的基本概念與一些常用的用法,希望對大家有所幫助
    2023-09-09
  • java用arraycopy實現(xiàn)多擊事件

    java用arraycopy實現(xiàn)多擊事件

    這篇文章主要介紹了java用arraycopy實現(xiàn)多擊事件的多種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 使用profiles進(jìn)行多環(huán)境配置的代碼實現(xiàn)

    使用profiles進(jìn)行多環(huán)境配置的代碼實現(xiàn)

    在項目開發(fā)的過程中會用到多個環(huán)境,為了便于開發(fā)使用,通常需要使用profiles進(jìn)行多環(huán)境配置,所以本文給大家介紹了使用profiles進(jìn)行多環(huán)境配置的代碼實現(xiàn),需要的朋友可以參考下
    2024-02-02
  • IDEA集成Gitee碼云的實現(xiàn)步驟

    IDEA集成Gitee碼云的實現(xiàn)步驟

    本文主要介紹了IDEA集成Gitee碼云的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評論