面向對象
內部類:
將一個類定義在另一個類的裏面,對裏面那個類就稱爲內部類(內置類,嵌套類)。
簡單的說就是類中還有一個類,就是內部類。
字節碼文件名:外部類名$內部類名.class
內部類訪問特點:
1,內部類可以直接訪問外部類中的成員,包括私有成員。
2,而外部類要訪問內部類中的成員必須要建立內部類的對象。
一般用於類的設計。
分析事物時,發現該事物描述中還有事物,而且這個事物還在訪問被描述事物的內容。
這時就是還有的事物定義成內部類來描述。
直接訪問外部類中的內部類中的成員。
外部類名.內部類名 = new 外部類對象.new 內部類對象;
Outer.Inner in = new Outer().new Inner();
in.method();
如果內部類是靜態的。 相當於一個外部類
外部類名.內部類名 = new 外部類對象.內部類;
Outer.Inner in = new Outer.Inner();
in.method();
如果內部類是靜態的,成員是靜態的。
外部類名.內部類名.靜態函數名;
Outer.Inner.function();
注:如果內部類中定義了靜態成員,該內部類也必須是靜態的。
爲什麼內部類能直接訪問外部類中成員呢?
那是因爲內部類持有了外部類的引用。 外部類名.this
內部類可以存放在局部位置上。(也就是定義在外部類的成員函數裏面,主函數也是函數哦)
內部類在局部位置上只能訪問局部中被final修飾的局部變量。原因:由於內部類可能擴大局部變量的作用域,如果再加上這個被內部類訪問的局部變量沒有使用final修飾,也就是說這個變量的值可以隨時改變,那將引起極大的混亂,因此java編譯器要求所有被內部類訪問的局部變量必須使用final修飾符修飾。
class Outer {
private Innter inner = new Outer.Inner();
private Outer outer = new Outer();
static class Inner{
public void run(){
System.out.println("Inner class run");
}
public void method(){
System.out.println("Inner method run")
}
public static void show(){
System.out.println("Inner static show run");
}
}
public void method(){
System.out.println("Outer method run");
}
public Innter getInnterInstance(){
return inner;
}
public static Outer getOuterInstance(){
return outer;
}
}
class Test{
public static void main(String[] args){
//打印外部類的method方法
Outer.getOuterInstance().method();
//打印內部類的method方法
Outer.getOuterInstance().getInnterInstance().method();
}
}
/*
代碼都是自己想到就敲出來的,如果有哪個地方敲錯了,還請別見怪,如果有哪裏寫的不對的地方,請評論我的博客,請多多指教。
一天的學習量也不小,所以有時候也會敲錯個別字的,知道哪裏寫錯了或者寫的不好請多多評論。新長城會虛心接收並及時改正的。
*/
匿名內部類:
匿名內部類。就是內部類的簡寫格式。
其實匿名內部類就是一個匿名子類對象,而且這個對象有點胖,也可以理解爲,帶內容的對象。
必須有前提:內部類必須繼承或者實現一個外部類或者接口。(因爲內部類是用父類的名字創建對象)
匿名內部類:其實就是一個匿名子類對象。
匿名內部類格式:new 父類或者(or)接口(){子類成員}
通常的使用場景之一:
當函數參數是接口類型時,而且接口中的方法不超過三個。
可以用匿名內部類作爲實際參數進行傳遞。
匿名內部類應用:
/*定義一個接口, 2個抽象方法(method two)*/
interface Inter {
void show1(); //默認是public abstract權限修飾
void show2();
}
class Test {
public static void main(String[] args){
/*
調用show方法show方法接口一個Inter對象,並將匿名內部類對象當成參數進行傳遞
*/
show(new Inter() {
/*
由於Inter父類的方法不超過三個所以使用匿名內部類進行子類實例化。複寫父類的2個方法
*/
public void show1(){
System.out.println("show1 run");
}
public void show2(){
System.out.println("show2 run");
}
});
}
public static void show(Inter in){
/*
調用Inter類的方法,子類實例化過一次,被子類進行了複寫動作,所以打印的是子類實例化後的方法。
*/
}in.show1(); //打印show1 run
in.show2(); //打印show2 run
}
內部類 匿名內部類注意之細節:
abstract class Inner{
public abstract void method();
}
class Test {
//創建一個Test的內部類Innter對象。
private Inner inner =/*this.*/new TestInner();//從這裏可以看出來,創建內部類前面省略了一個this
/*
Inner內部類 method內部類方法
但是我們學過匿名內部類,可以用匿名內部類的形式進行復寫。
new Inner(){
public void method(){
}System.out.println("Inner Method Run");
}代表是的Inner類的子類對象,並對父類的方法進行了複寫。
*/
class TestInner extends Inner {
/*
內部類的出來再一次打破了單繼承的侷限性.匿名內部類更加對代碼進行了簡化。
*/
public void method(){
System.out.println("Inner Method Run");
}
}
/*
由於主函數調用非靜態方法,所以只能創建對象。
*/
public static void main(String[] args) {
new Test().method().method();
/*Object obj = new Object (){
public void show(){
System.out.println("Object Show Run");
}
}
創建Object的子類對象,但是Object類中的沒有show方法,所以編譯失敗。多態看的是引用型變量對象中是否有對應的方法。
*/
}
/*
返回內部類對象。
*/
public Inner method(){
}return inner;
}
/*
思考這條代碼思考了一小時,更加對匿名內部類 和內部了有了更深一層的瞭解,知道了其中的細節。更加理解了什麼叫深思熟濾。
*