十八.匿名内部类和内部类

本文详细介绍了Java中的匿名内部类,包括基于抽象类和接口的匿名内部类的使用方式,展示了如何在减少代码量的同时实现特定功能。通过实例演示了在方法参数中直接使用接口,以及成员内部类的创建和使用。这些技巧在实际开发中能够提高代码的简洁性和效率。
摘要由CSDN通过智能技术生成

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.属性 的方式调用

实例化内部内也和正常实例化外部类对象有区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值