Java嵌套類和外部類詳解。本站提示廣大學習愛好者:(Java嵌套類和外部類詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java嵌套類和外部類詳解正文
1、甚麼是嵌套類及外部類?
可以在一個類的外部界說另外一個類,這類類稱為嵌套類(nested classes),它有兩品種型:
靜態嵌套類和非靜態嵌套類。靜態嵌套類應用很少,最主要的長短靜態嵌套類,也等於被稱作為
外部類(inner)。嵌套類從JDK1.1開端引入。個中inner類又可分為三種:
其1、在一個類(內部類)中直接界說的外部類;
其2、在一個辦法(內部類的辦法)中界說的外部類;
其3、匿名外部類。
上面,我將解釋這幾種嵌套類的應用及留意事項。
2、靜態嵌套類
以下所示代碼為界說一個靜態嵌套類,
public class StaticTest {
private static String name = "javaJohn";
private String id = "X001";
static class Person{
private String address = "swjtu,chenDu,China";
public String mail = "[email protected]";//外部類私有成員
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 規模內可見,若在其它類中援用或初始化,均是毛病的。
3、在內部類中界說外部類
以下所示代碼為在內部類中界說兩個外部類及它們的挪用關系:
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或應用它,編譯就不
會經由過程。同時,外部類的變量成員只在外部內外部可見,若內部類或同條理的外部類須要拜訪,需采取示例法式
中的辦法,弗成直接拜訪外部類的變量。
4、在辦法中界說外部類
以下所示代碼為在辦法外部界說一個外部類:
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等均弗成用。
5、匿名外部類
以下所示代碼為界說一個匿名外部類:匿名外部類平日用在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。這同後面的外部類是分歧的。
6、外部類應用的其它的成績
經由過程以上,我們可以清晰地看出外部類的一些應用辦法,同時,在很多時刻,外部類是在如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();
}
}