JAVA中的內部類(匿名,區域性)
阿新 • • 發佈:2021-02-02
技術標籤:java
JAVA中的內部類(匿名,區域性)
###10.08_面向物件(內部類概述和訪問特點)(瞭解)
- A:內部類概述
- B:內部類訪問特點
- a:內部類可以直接訪問外部類的成員,包括私有。
- b:外部類要訪問內部類的成員,必須建立物件。
- 外部類名.內部類名 物件名 = 外部類物件.內部類物件;
- C:案例演示
- 內部類極其訪問特點
###10.09_面向物件(成員內部類私有使用)(瞭解)
- private
###10.10_面向物件(靜態成員內部類)(瞭解)
- static
- B:成員內部類被靜態修飾後的訪問方式是:
- 外部類名.內部類名 物件名 = 外部類名.內部類物件;
###10.11_面向物件(成員內部類的面試題)(掌握)
- A:面試題
-
要求:使用已知的變數,在控制檯輸出30,20,10。 class Outer { public int num = 10; class Inner { public int num = 20; public void show() { int num = 30; System.out.println(?); System.out.println(??); System.out.println(???); } } } class InnerClassTest { public static void main(String[] args) { Outer.Inner oi = new Outer().new Inner(); oi.show(); } }
###10.12_面向物件(區域性內部類訪問區域性變數的問題)(掌握)
- A:案例演示
-
區域性內部類訪問區域性變數必須用final修飾
-
區域性內部類在訪問他所在方法中的區域性變數必須用final修飾,為什麼?
因為當呼叫這個方法時,區域性變數如果沒有用final修飾,他的生命週期和方法的生命週期是一樣的,當方法彈棧,這個區域性變數也會消失,那麼如果區域性內部類物件還沒有馬上消失想用這個區域性變數,就沒有了,如果用final修飾會在類載入的時候進入常量池,即使方法彈棧,常量池的常量還在,也可以繼續使用但是jdk1.8取消了這個事情,所以我認為這是個bug
-
###10.13_面向物件(匿名內部類的格式和理解)
- A:匿名內部類
- 就是內部類的簡化寫法。
- B:前提:存在一個類或者介面
- 這裡的類可以是具體類也可以是抽象類。
- C:格式:
-
new 類名或者介面名(){ 重寫方法; }
- D:本質是什麼呢?
- 是一個繼承了該類或者實現了該介面的子類匿名物件。
- E:案例演示
- 按照要求來一個匿名內部類
###10.14_面向物件(匿名內部類重寫多個方法呼叫)
- A:案例演示
- 匿名內部類的方法呼叫
###10.15_面向物件(匿名內部類在開發中的應用)
- A:程式碼如下
-
//這裡寫抽象類,介面都行 abstract class Person { public abstract void show(); } class PersonDemo { public void method(Person p) { p.show(); } } class PersonTest { public static void main(String[] args) { //如何呼叫PersonDemo中的method方法呢? PersonDemo pd = new PersonDemo (); } }
class PersonTest {
public static void main(String[] args) {
//如何呼叫PersonDemo中的method方法呢?
PersonDemo pd = new PersonDemo ();
//pd.method(new Student());
pd.method(new Person() {
public void show() {
System.out.println("show");
}
});
}
}
//這裡寫抽象類,介面都行
abstract class Person {
public abstract void show();
}
class PersonDemo {
//public void method(Person p) { //Person p = new Student(); //父類引用指向子類物件
/*
Person p = new Person(){
public void show() {
System.out.println("show");
}
};
*/
public void method(Person p) {
p.show();
}
}
class Student extends Person {
public void show() {
System.out.println("show");
}
}
###10.16_面向物件(匿名內部類的面試題)
- A:面試題
-
按照要求,補齊程式碼 interface Inter { void show(); } class Outer { //補齊程式碼 } class OuterDemo { public static void main(String[] args) { Outer.method().show(); } } 要求在控制檯輸出”HelloWorld”
class Test2_NoNameInnerClass {
public static void main(String[] args) {
//Outer.method().show(); //鏈式程式設計,每次呼叫方法後還能繼續呼叫方法,證明呼叫方法返回的是物件
Inter i = Outer.method();
i.show();
}
}
//按照要求,補齊程式碼
interface Inter {
void show();
}
class Outer {
//補齊程式碼
public static Inter method() {
return new Inter() {
public void show() {
System.out.println("show");
}
};
}
}
//要求在控制檯輸出”HelloWorld”