匿名物件和內部類
阿新 • • 發佈:2018-12-26
匿名物件:
匿名物件是物件的簡化形式;
匿名物件的使用情況:
1)當對物件方法僅進行一次呼叫的時候使用;如果需要呼叫多次,還需要建立物件。如果對一個物件進行多個成員的呼叫,就必須給這個物件起個名字。
2)匿名物件可以作為實際引數進行傳遞;(點選事件監聽裡面的引數)
3)匿名物件是沒有被其他物件所引用;
4)使用一次就變成垃圾了,被垃圾回收器收回了。
理解:
建立一個匿名物件,呼叫類中的方法 new People().say();
這裡需要傳遞一個監聽物件,我們直接給一個匿名物件;使用匿名物件,如果直接new介面要實現介面中的抽象方法(相當於 建立了一個子類物件,並實現其中的抽象方法)
top_right_left_img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
top_right_left_img.setOnClickListener(listener); View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { } };
內部類:
java內部類使用總結:
1)一個類中還包含著另外一個類,內部類有自己的屬性和方法。
2)程式編譯過後會產生兩個.class檔案。
3)內部類其實嚴重破壞了良好的程式碼結構,但為什麼還要使用內部類呢?因為內部類可以隨意使用外部類的成員變數(包括私有)而不用生成外部類的物件,這也是內部類的唯一優點。
常規用法:
1)建立內部類物件
2)內部類可以直接使用外部類的成員變數,在android 點選事件跳轉頁面中有用到,頁面之間傳遞引數
3)如果存在同名變數,訪問內部類本身的成員變數可用this.屬性名
4)如果存在同名變數,訪問外部類的成員變數需要使用Out.this.屬性名
5)如果用static 將內部內靜態化,那麼內部類就只能訪問外部類的靜態成員變數,具有侷限性
在變數前面加private 表示類的私有屬性,只可以在類內部訪問使用,即只能在本類中進行使用,也不能夠在子類中使用,子類只能繼承公有的成員變數和成員方法。
內部類中的變數訪問形式案例
package com.crs.demo.ui.innerclass;
/**
* Created on 2016/9/26.
* Author:crs
* Description:內部類成員變數使用特點
*/
public class Demo2 {
private int age = 12;
class Inner {
int age = 13;
void print() {
int age = 14;
System.out.print(age + "\n");
//2)如果存在同名變數,訪問內部類本身的成員變數可用this.屬性名
System.out.print(this.age + "\n");
//3)如果存在同名變數,訪問外部類的成員變數需要使用Out.this.屬性名
System.out.print(Demo2.this.age + "\n");
}
}
}
package com.crs.demo.ui.innerclass;
/**
* Created on 2016/9/26.
* Author:crs
* Description:靜態內部類的使用以及注意事項
*/
public class Demo3 {
private int age = 16;
private static int score = 16;
static class Inner {
//1)在變數前面加private 表示類的私有屬性,只可以在類內部訪問使用,即只能在本類中進行使用,也不能夠在子類中使用,子類只能繼承公有的成員變數和成員方法。
//2)一定要區分好匿名物件與內部類的區別。
public void print() {
//4)如果用static 將內部內靜態化,那麼內部類就只能訪問外部類的靜態成員變數,具有侷限性.
//System.out.print(age);會報錯。
System.out.print(score);
}
}
}
package com.crs.demo.ui.innerclass;
/**
* Created on 2016/9/26.
* Author:crs
* Description:測試內部類的使用
*/
public class TestInnerClass {
public static void main(String[] args) {
Demo1 demo1 = new Demo1();
//建立內部類物件
Demo1.Inner inner = demo1.new Inner();
inner.print();
//主要用於測試內部類的變數訪問形式
Demo2 demo2 = new Demo2();
Demo2.Inner inner1 = demo2.new Inner();
inner1.print();
//測試靜態內部類的使用
Demo3.Inner inner3= new Demo3.Inner();
inner3.print();
}
}