java内部类与匿名类详解

本文详细介绍了Java中的内部类和匿名内部类的概念及其使用。内部类分为成员内部类和局部内部类,可以访问外部类的所有成员,而匿名内部类作为简化开发的工具,常用于一次性对象的创建,其本质是一个没有名字的内部类对象。通过实例展示了如何创建和使用匿名内部类,以及它们在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内部类

一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类。
类的五大成员:属性,方法,构造器,代码块,内部类。
内部类与局部内部类

class Outer
{
    private int n= 100;
    private void m2()
    {

    }
    public void m1()
    {
        class Inner  //局部内部类
        {
            //可以直接访问外部类的所有成员,包括私有
            //内部类相当于局部变量,不能添加访问修饰符,但是可以使用final修饰
            //作用域:仅仅在定义它的方法或代码块中
            private int n= 20;
            public void f()
            {
                System.out.println(n);//20
                //当外部类与局部类重名 就近原则,调用外部类 外部类名.this.成员
                System.out.println(Outer.this.n);//100
                m2();
            }
        }
        //创建局部内部类
        Inner inner = new Inner();
        inner.f();
    }
    //内部类,定义在成员位置上,相当于一个类的成员
    //可以添加任何修饰符
    public class Inner2()
    {
    	public void say()
    	{
    		System.out.println(666);
    	}
    }
    

}

匿名内部类(超重点)
作用:简化开发,对于某些对象只需要存在一次,则可用匿名类。
1.本质是类 2.内部类 3. 该类没有名字 4.同时是一个对象

class Outer2
{
    private int n2 = 10;
    public void method()
    {
        //匿名内部类
        //fish 的编译类型 A
        //fish 的运行类型 Outer2$1
        //在底层 自动分配一个类
        //class Outer2$1 implements A
//        {
//            @Override
//            public void cry()
//            {
//                System.out.println("fish cry");
//            }
//        }
       A fish= new A()
        {
            @Override
            public void cry()
            {
                System.out.println("fish cry");
            }
        };
       fish.cry();
        System.out.println(fish.getClass());//Outer2$1
        //class Outer2$2 extends Father
        Father father=new Father("pig")
        {
            @Override
            public void test()
            {
                System.out.println("pig eat");
            }
        };
        father.test();
    }

}
interface A  //接口
{
    public void cry();
}
class Father
{
    public Father(String name)
    {}
    public void test()
    {}
}

练习

public class AnonmousClass
{
    public static void main(String[] args)
    {
        CellPhone cellPhone = new CellPhone();

        cellPhone.alarmClock(new Bell()
        {
            @Override
            public void ring()
            {
                System.out.println("wake up");
            }
        });
        cellPhone.alarmClock(new Bell()
        {
            @Override
            public void ring()
            {
                System.out.println("go to study");
            }
        });
    }
}

interface Bell
{
    void ring();
}

class CellPhone
{
    public void alarmClock(Bell bell)//形参类型是Bell
    {
        bell.ring();//实现方法
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值