Java程式設計思想(2nd)學習筆記(8)-2 (轉)
二. Inner classes(內隱類)
1. 內隱類的基本用法
1) 如果要在外圍class的non-static之外產生一個inner class,得以OuterClassName.InnerClassName的形式指定該物件的型別。而在non-static函式內則不用。
public class ExplicitStatic{
class Contents{
private int i = 11;
public int value() { return i; }
}
class Destination{
private String label;
Destination(String whereTo){
label = whereTo;
}
String readLabel() { return label; }
}
public Destination to(String s){
//在outer class的non-static函式中可直接產生inner class物件
return new Destination(s); //(1)
}
public Contents cont(){
return new Contents(); //(1)
}
public void ship(String dest){
//在outer class的non-static函式中可直接透過InnerClassName
//來指定物件型別
Contents c = cont();
Destination d = to(dest);
System.out.println(d.readLabel());
}
public static void main(String[] args){
ExplicitStatic p = new ExplicitStatic();
p.ship("Tanzania");
ExplicitStatic q = new ExplicitStatic();
//在outer class的非non-static函式內產生inner class物件
ExplicitStatic.Contents c = q.cont();
ExplicitStatic.Destination d = q.to("Borneo");
//不能在static函式直接生成inner class物件
// new Contents();
}
}
2) 對於non-static inner class,在外圍class的non-static函式可以透過new產生一個inner class物件,如上面的(1)處。但要在非non-static函式產生一個inner class物件,則一定要關聯到其enclosing class的某個物件。
3) inner class的向上轉型
當把一個inner class物件向上轉型成為interface時,我們得到的只是一個reference。
interface Destination{
String readLabel();
}
interface Contents{
int value();
}
class Parcel3{
private class PContents implements Contents{
private int i = 11;
public int value() { return i; }
}
protected class PDestination implements Destination{
private String label;
PDestination(String whereTo){
label = whereTo;
}
public String readLabel() { return label; }
}
public Destination to(String s){
return new PDestination(s);
}
public Contents cont(){
return new PContents();
}
}
public class ExplicitStatic{
public static void main(String[] args){
Parcel3 p = new Parcel3();
//把inner class物件向上轉型
Contents c = p.cont();
Destination d = p.to("Borneo");
}
}
雖然我們不能在ExplicitStatic class無法Pcontents class,但我們把一個Pcontents class物件向上轉型為Contents,就可對之進行呼叫。
4) inner class的作用域為定義該inner class的pe內。但inner class可在它的作用域之外被繼承(見4)。
interface Contents{
int value();
}
class Parcel3{
//PContents1 class的作用域為Parcel3 class內
private class PContents1 implements Contents{
private int i = 11;
public int value() { return i; }
}
public Contents cont1(){
return new PContents1();
}
public Contents cont2(){
//PContents2 class的作用域為函式cont2內
class PContents2 implements Contents{
private int i = 11;
public int value() { return i; }
}
return new PContents2();
}
//不能在函式cont2外使用PContents2 class
/*
public Contents cont22(){
return new PContents2();
}
*/
public Contents cont3(boolean b){
if(b){
//PContents3 class的作用域為當前if內
class PContents3 implements Contents{
private int i = 11;
public int value() { return i; }
}
return new PContents3();
}
//不能在if外使用PContents3 class
//return new PContents3();
return null;
}
}
public class ExplicitStatic{
public static void main(String[] args){
Parcel3 p = new Parcel3();
Contents c1 = p.cont1();
Contents c2 = p.cont2();
Contents c3 = p.cont3(true);
}
}
2. 內隱類與外圍enclosing class的連線關係
2.1 non-static inner class
1) inner class可以訪問enclosing class的所有成員(包括private成員),就像inner class自己擁有這些成員一樣。即inner class天生具有對enclosing class的所有成員的訪問權力。
2) Inner class物件被產生時,一定要關聯到其enclosing class的某個物件(這個enclosing class物件就是Inner class物件的製造者)。建構inner class物件的同時,得有其enclosing class物件的reference才行。
原因:因為inner class可以訪問enclosing class的所有成員,那麼當產生一個inner class時,會自動為inner class物件新增一個指向enclosing class物件的reference(這個reference是隱藏的)。所以Inner class被產生時,一定要關聯到其enclosing class的某個物件。
3) 同一個enclosing class物件產生出來的inner class物件訪問的是同一個enclosing class物件中的成員。
interface Destination{
String readLabel();
}
interface Contents{
int value();
}
class Parcel3{
int i1 = 10;
private String s1 = "Parcel3_";
Parcel3(String s){
s1 += s;
}
private class PContents implements Contents{
//可呼叫enclosing class的成員 (1)
private int i2 = i1;
private String s2 = s1;
PContents(int num){
System.out.println("" + num + ": i2 = " + i2 + ",s2 = " + s2);
}
public int value() { return 1; }
}
public Contents cont(int i){
return new PContents(i);
}
}
public class ExplicitStatic{
public static void main(String[] args){
Parcel3 p1 = new Parcel3("1");
Contents c1 = p1.cont(1);
Contents c2 = p1.cont(2);
Parcel3 p2 = new Parcel3("2");
c2 = p2.cont(3);
c2 = p1.cont(4);
}
}
結果為:
1: i2 = 10,s2 = Parcel3_1
2: i2 = 10,s2 = Parcel3_1
3: i2 = 10,s2 = Parcel3_2
4: i2 = 10,s2 = Parcel3_1
在(1)在inner class呼叫了enclosing class的成員。結果表明,同一個enclosing class物件p1產生的inner class物件呼叫的是同一個enclosing class物件中的成員,如結果中的1、2、4。
2.2 Static inner classes(靜態內隱類)
1) 產生Static inner classes物件時,不需要同時存在一個enclosing class物件
2) 只能在Static inner classes物件中訪問enclosing class中的靜態成員。
interface Contents{
int value();
}
class Parcel1{
private static String s1 = "Parcel3_";
private String s11 = “Parcel3_”;
Parcel1(String s){
s1 += s;
}
protected static class PContents implements Contents{
//只能訪問enclosing class中的s1
String s2 = s1;
//s11不是static成員,不能訪問
//String 22 = s11;
PContents(int num){
System.out.println("" + num + ":s2 = " + s2);
}
public int value() { return 1; }
}
public static Contents cont(int i){
return new PContents(i);
}
}
public class ExplicitStatic{
public static void main(String[] args){
Parcel1 p1 = new Parcel1("1");
Contents c1 = p1.cont(1);
c1 = Parcel1.cont(2); //(1)
Parcel1 p2 = new Parcel1("2");
c1 = p2.cont(3);
c1 = Parcel1.cont(4); //(1)
}
}
因為內隱類Pcontents class是靜態的,所以在(1)處不透過enclosing class物件而是透過靜態函式來直接產生其物件。
2.3 無論inner class被巢狀置放的層次有多深,且所有outer class的成員都可
被它訪問。
class MNA{
private void f() {}
class A{
private void g() {}
class B{
void h(){
g();
f();
}
}
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-963551/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 《Java程式設計思想》筆記8.多型Java程式設計筆記多型
- Java程式設計思想學習筆記1 - 內部類Java程式設計筆記
- Java程式設計思想學習筆記4 - 序列化技術Java程式設計筆記
- Java 程式設計思想筆記:Learn 10Java程式設計筆記
- 《Java程式設計思想》筆記08——持有物件Java程式設計筆記物件
- 《Java程式設計思想》讀書筆記一Java程式設計筆記
- 讀書筆記-Java程式設計思想-03筆記Java程式設計
- 《圖解 Google V8》設計思想篇——學習筆記(一)圖解Go筆記
- 《Java程式設計思想》筆記07——內部類Java程式設計筆記
- Python學習筆記之 Python設計思想&設計原則Python筆記
- Linux程式設計學習筆記 | Linux IO學習[2] – 標準IOLinux程式設計筆記
- Linux學習/TCP程式設計學習筆記LinuxTCP程式設計筆記
- 網路程式設計學習筆記程式設計筆記
- 重學Java設計模式-學習筆記(1)Java設計模式筆記
- Python3:物件導向程式設計學習筆記(2)Python物件程式設計筆記
- JUC併發程式設計學習筆記(四)8鎖現象程式設計筆記
- java程式設計師程式設計筆試基礎學習Java程式設計師筆試
- Java併發程式設計學習筆記----執行緒池Java程式設計筆記執行緒
- 程式設計基礎·Java學習筆記·物件導向(下)程式設計Java筆記物件
- Java設計模式學習筆記(一) 設計模式概述Java設計模式筆記
- spark學習筆記--進階程式設計Spark筆記程式設計
- Javascript高階程式設計 學習筆記JavaScript程式設計筆記
- ROS串列埠程式設計學習筆記ROS串列埠程式設計筆記
- 結構化程式設計--學習筆記程式設計筆記
- Golang 學習筆記——tun/tap 程式設計Golang筆記程式設計
- JAVA程式設計學習記錄(安裝Java)Java程式設計
- 四. 文字程式設計--Windows程式設計課程學習筆記程式設計Windows筆記
- JAVA語言程式設計思想Java程式設計
- 好程式設計師web前端培訓學習筆記Vue學習筆記一程式設計師Web前端筆記Vue
- RxJava2.x 學習筆記(一)函數語言程式設計RxJava筆記函數程式設計
- Vue學習筆記(九):元件化程式設計Vue筆記元件化程式設計
- python程式設計學習筆記⑦-1函式Python程式設計筆記函式
- 好程式設計師學習筆記:函式程式設計師筆記函式
- 五分鐘學習 Java 8 的流程式設計Java程式設計
- 設計模式學習筆記設計模式筆記
- 學習筆記-設計模式筆記設計模式
- Java設計模式學習筆記(五) 單例模式Java設計模式筆記單例
- 好程式設計師web前端培訓學習筆記Vue學習筆記之二程式設計師Web前端筆記Vue
- JAVA程式設計學習記錄(JavaWeb-Html)Java程式設計WebHTML