dnf做漢堡怎么玩間網(wǎng)站怎么做好網(wǎng)絡(luò)推廣銷售
(1)本質(zhì)是類(2)內(nèi)部類(3)該類沒有名字(4)同時(shí)還是一個(gè)對(duì)象
說明:匿名內(nèi)部類是定義在外部類的局部位置,比如方法中,并且沒有類名
1.匿名內(nèi)部類的基本語法new類或接口(參數(shù)列表){類體};
package com.hspedu.innerclass;
/**
* 演示匿名內(nèi)部類的使用
*/
public class AnonymousInnerClass {
public static void main(String[] args) {
Outer04 outer04 = new Outer04();
outer04.method();
}
}
class Outer04 { //外部類
private int n1 = 10;//屬性
public void method() {//方法
//基于接口的匿名內(nèi)部類
//解讀
//1.需求: 想使用 IA 接口,并創(chuàng)建對(duì)象
//2.傳統(tǒng)方式,是寫一個(gè)類,實(shí)現(xiàn)該接口,并創(chuàng)建對(duì)象
//3.老韓需求是 Tiger/Dog 類只是使用一次,后面再不使用
//4. 可以使用匿名內(nèi)部類來簡化開發(fā)
//5. tiger 的編譯類型 ? IA
//6. tiger 的運(yùn)行類型 ? 就是匿名內(nèi)部類 Outer04$1
/*
我們看底層 會(huì)分配 類名 Outer04$1
class Outer04$1 implements IA {
@Override
public void cry() {
System.out.println("老虎叫喚...");
}
}
*/
//7. jdk 底層在創(chuàng)建匿名內(nèi)部類 Outer04$1,立即馬上就創(chuàng)建了 Outer04$1 實(shí)例,并且把地址
// 返回給 tiger
//8. 匿名內(nèi)部類使用一次,就不能再使用
IA tiger = new IA() {
@Override
public void cry() {
System.out.println("老虎叫喚...");
}
};
System.out.println("tiger 的運(yùn)行類型=" + tiger.getClass());
tiger.cry();
tiger.cry();
tiger.cry();
// IA tiger = new Tiger();
// tiger.cry();
//演示基于類的匿名內(nèi)部類
//分析
//1. father 編譯類型 Father
//2. father 運(yùn)行類型 Outer04$2
//3. 底層會(huì)創(chuàng)建匿名內(nèi)部類
/*
class Outer04$2 extends Father{
@Override
public void test() {
System.out.println("匿名內(nèi)部類重寫了 test 方法");
}
}
*/
//4. 同時(shí)也直接返回了 匿名內(nèi)部類 Outer04$2 的對(duì)象
//5. 注意("jack") 參數(shù)列表會(huì)傳遞給 構(gòu)造器
Father father = new Father("jack"){
@Override
public void test() {
System.out.println("匿名內(nèi)部類重寫了 test 方法");
}
};
System.out.println("father 對(duì)象的運(yùn)行類型=" + father.getClass());//Outer04$2
father.test();
//基于抽象類的匿名內(nèi)部類
Animal animal = new Animal(){
@Override
void eat() {
System.out.println("小狗吃骨頭...");
}
};
animal.eat();
}
}
interface IA {//接口
public void cry();
}
//class Tiger implements IA {
//
// @Override
// public void cry() {
// System.out.println("老虎叫喚...");
// }
//}
//class Dog implements IA{
// @Override
// public void cry() {
// System.out.println("小狗汪汪...");
// }
//}
class Father {//類
public Father(String name) {//構(gòu)造器
System.out.println("接收到 name=" + name);
}
public void test() {//方法
}
}
abstract class Animal { //抽象類
abstract void eat();
}
2.匿名內(nèi)部類的語法比較奇特,請(qǐng)大家注意,因?yàn)槟涿麅?nèi)部類既是一個(gè)類的定義,同時(shí)它本身也是一個(gè)對(duì)象,因此從語法上看,它既有定義類的特征,也有創(chuàng)建對(duì)象的特征,對(duì)前面代碼分析可以看出這個(gè)特點(diǎn),因此可以調(diào)用匿名內(nèi)部類方法
3.可以直接訪問外部類的所有成員,包含私有的[案例演示]
4.不能添加訪問修飾符,因?yàn)樗牡匚痪褪且粋€(gè)局部變量。
5.作用域:僅僅在定義它的方法或代碼塊中。
6.匿名內(nèi)部類---訪問--->外部類成員[訪問方式:直接訪問]
7.外部其他類…不能訪問……匿名內(nèi)部類(因?yàn)槟涿麅?nèi)部類地位是一個(gè)局部變量)8.如果外部類和匿名內(nèi)部類的成員重名時(shí),匿名內(nèi)部類訪問的話,默認(rèn)遵循就近原則,如果想訪問外部類的成員,則可以使用(外部類名.this.成員)去訪問
package com.hspedu.innerclass;
public class AnonymousInnerClassDetail {
public static void main(String[] args) {
Outer05 outer05 = new Outer05();
outer05.f1();
//外部其他類---不能訪問----->匿名內(nèi)部類
System.out.println("main outer05 hashcode=" + outer05);
}
}
class Outer05 {
private int n1 = 99;
public void f1() {
//創(chuàng)建一個(gè)基于類的匿名內(nèi)部類
//不能添加訪問修飾符,因?yàn)樗牡匚痪褪且粋€(gè)局部變量
//作用域 : 僅僅在定義它的方法或代碼塊中
Person p = new Person(){
private int n1 = 88;
@Override
public void hi() {
//可以直接訪問外部類的所有成員,包含私有的
//如果外部類和匿名內(nèi)部類的成員重名時(shí),匿名內(nèi)部類訪問的話,
//默認(rèn)遵循就近原則,如果想訪問外部類的成員,則可以使用 (外部類名.this.成員)去訪問
System.out.println("匿名內(nèi)部類重寫了 hi 方法 n1=" + n1 +
" 外部內(nèi)的 n1=" + Outer05.this.n1 );
//Outer05.this 就是調(diào)用 f1 的 對(duì)象
System.out.println("Outer05.this hashcode=" + Outer05.this);
}
};
p.hi();//動(dòng)態(tài)綁定, 運(yùn)行類型是 Outer05$1
//也可以直接調(diào)用, 匿名內(nèi)部類本身也是返回對(duì)象
// class 匿名內(nèi)部類 extends Person {}
// new Person(){
// @Override
// public void hi() {
// System.out.println("匿名內(nèi)部類重寫了 hi 方法,哈哈...");
// }
// @Override
// public void ok(String str) {
// super.ok(str);
// }
// }.ok("jack");
}
}
class Person {//類
public void hi() {
System.out.println("Person hi()");
}
public void ok(String str) {
System.out.println("Person ok() " + str);
}
}
//抽象類/接口
匿名內(nèi)部類的最佳實(shí)踐
當(dāng)做實(shí)參直接傳遞,簡潔高效。
代碼:
package com.hspedu.innerclass;
import com.hspedu.abstract_.AA;
public class InnerClassExercise01 {
public static void main(String[] args) {
//當(dāng)做實(shí)參直接傳遞,簡潔高效
f1(new IL() {
@Override
public void show() {
System.out.println("這是一副名畫~~...");
}
});
//傳統(tǒng)方法
f1(new Picture());
}
//靜態(tài)方法,形參是接口類型
public static void f1(IL il) {
il.show();
}
}
//接口
interface IL {
void show();
}
//類->實(shí)現(xiàn) IL => 編程領(lǐng)域 (硬編碼)
class Picture implements IL {
@Override
public void show() {
System.out.println("這是一副名畫 XX...");
}
}