22.匿名内部类
目的:为了减少代码量
1.基于抽象类的匿名内部类
package com.qfedu.c_anno;
//声明一个抽象列类
abstract class Person {
public abstract void eat();
public void sleep() {
System.out.println("好想逃,然后去睡觉!!!");
}
}
//常规来讲,新建一个类 去继承抽象类。然后实例化继承的抽象类的类
//class Man extends Person {
//
// @Override
// public void eat() {
// System.out.println("好饿,想吃肉!!!");
// }
//}
public class Demo1 {
public static void main(String[] args) {
//匿名内部类:在实例化对抽象类同时并重写抽象方法
Person person = new Person(){
@Override
public void eat() {
System.out.println("吃吃喝喝");
}
};
person.eat();
person.sleep();
}
}
匿名对象形式(适用于一次性的)
package com.qfedu.c_anno;
abstract class Animal{
public abstract void call();
public abstract void call1();
}
public class Demo2 {
public static void main(String[] args) {
new Animal(){
@Override
public void call() {
System.out.println("哇哇叫!!!");
}
@Override
public void call1() {
System.out.println("哈哈叫");
}
}.call();
new Animal(){
@Override
public void call() {
System.out.println("哇哇叫!!!");
}
@Override
public void call1() {
System.out.println("哈哈叫");
}
}.call1();
}
}
2.基于接口的匿名内部类
package com.qfedu.c_anno;
interface A {
void testA();
}
public class Demo3 {
public static void main(String[] args) {
// A a = new A(){
//
// @Override
// public void testA() {
// System.out.println("嘻嘻哒");
// }
// };
// a.testA();
new A(){
@Override
public void testA() {
System.out.println("哈哈");
}
}.testA();
}
}
package com.qfedu.c_anno;
import java.util.Comparator;
import java.util.TreeSet;
import java.util.Set;
class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Demo4 {
//存到TreeSet里面
public static void main(String[] args) {
Set<Student> set = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int num = o1.age - o2.age;
return num;
}
});
set.add(new Student("维一", 23));
set.add(new Student("永康", 19));
set.add(new Student("赵娜", 18));
set.add(new Student("运铎", 28));
set.add(new Student("佳祥", 36));
System.out.println(set);
}
}
真实开发中,一个方法参数是一个接口对象,不用再新建一个类去实现这个接口,直接在方法中new接口
package com.qfedu.c_anno;
interface B {
void eat();
}
public class Demo5 {
public static void main(String[] args) {
test(new B() {
@Override
public void eat() {
System.out.println("吃锦旗");
}
});
}
public static void test (B b) {
b.eat();
}
}
3.内部类
位于类的内部,成员方法外面的类
package com.qfedu.d_inner;
class MemberDemo {
String name = "张三";
int age = 20;
public void printf() {
System.out.println("打印着玩");
}
class Inner {//就是内部类
String name = "李四";
//在Inner这个类中可以访问外部类的属性和方法
public void test () {
printf();//打印着玩
System.out.println(age);//20
System.out.println(name);//李四
//如果访问外部特定的属性的时候: 类名.this.属性
System.out.println(MemberDemo.this.name);//张三
}
}
}
public class Demo1 {
public static void main(String[] args) {
//成员内部类的创建步骤:
//1.实例化外部类 类对象
MemberDemo memberDemo = new MemberDemo();
//2.实例化内部类对象,但是new得改为 外部对象.new
MemberDemo.Inner inner = memberDemo.new Inner();
inner.test();
}
}
外部类无法使用内部类定义的属性和方法,内部类可以使用外部类的,调用时使用 在内部类方法中调用时使用 外部类名.this.属性 的方式调用
实例化内部内也和正常实例化外部类对象有区别