内 部 类

本文介绍了Java内部类相关知识。首先阐述内部类定义,即A类定义在B类内部,A为内部类,B为外部类,还说明了其分类及特点。接着讲解匿名内部类,适用于接口方法少的情况,且对象只能用一次。最后提及使用场景,如只需用一次对象时可作实参传入方法。

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

1、内部类的定义:

      将A类定义在B类的内部,前者A称为内部类,后者B称为外部类,根据定义的位置分为,成员内部类(定义在成员位置)和局部内部类(A定义或直接在方法里面使用---匿名内部类)

  语法格式:

     class B{

         ....

       class A{

      . ...

      }

}

2、内部类分类:

    1.可以调用B类的所有成员(变量和方法)

    2.B类中的成员变量和A类中的成员同名则可以通过B.this同名变量进行调用。

    3.B类中方法要使用A类中的成员需要先创建内部类对象才能使用。

          B.A 变量名 =B.new A();

    4.B$A.class内部类编译后产生的字节码文件。

    5.内部类和外部类类名不能同名。

注意:B类想使用A类中的所有成员,但有不想自己成为一个主类文件,这时可以考虑将B放在A里面。好比:水和瓶子的关系。

注意:成员内部类具有成员的所有特征(可以被修饰符修饰public 缺省 protect private 性质修饰符static abstrat final)

3、匿名内部类

       1、一般使用接口的直接匿名调用,可以省去写接口的实现子类,而匿名调用接口的子类对象。

       2、在接口中方法不超过2到3个情形下可以使用,多的不建议使用匿名。

       3、匿名对象只能使用一次,不能多次使用。

4、使用场景

      在使用时只需要使用一次某个对象,可以考虑使用匿名对象,一般作为实参传入方法使用。

package lnsides;
class A{
    int age=18;
    static String name ="苏沐橙";

    class B{
        int age=19;
        public void Man(){
            System.out.println("我今年"+age);
            System.out.println(name+"今年"+A.this.age);//A.this.age:A类的成员调用(A,B有相同的成员属性调用)
        }
    }
    public void Show(){
        System.out.println("外部内的成员方法被执行了");
        System.out.println(age);
        //A类要使用B类的成员方法需要先创建内部B对象才能使用
        B b =new B();
        b.Man();//内部类的方法
        System.out.println("内部类我的年龄:"+b.age);//内部类的成员变量
    }
}
class C{
    String name="涂山红红";
    char sex='女';
    int age=18;
    class D{
        String name="东方月初";
        char sex='男';
        int age=19;
        public void Like(){
            System.out.println("喜欢你"+C.this.name);
        }
    }
    public void Live(){
        D d = new D();
        System.out.println("我喜欢你"+d.name);
    }
}
class A2 {
    int age = 18;
    String name = "东方月初";

    class B2 {
        String name = "涂山红红";
        int age = 19;

        public void xh() {
            System.out.println("我想对你说" + A2.this.name + "喜欢你\n" + "你喜欢我吗?" + A2.this.name);
        }
        public void nh(){
            System.out.println("君生我未生,我生君已老");
            A2.this.hn();
        }
    }
    public void hx(){
        B2 b2 = new B2();
        b2.xh();
        System.out.println("我也喜欢你"+b2.name);
    }
    public void hn(){
        System.out.println("君恨我生迟,我恨君生早");
    }
}
public class CeShiLie {
    public static void main(String[] args) {
        A a =new A();
        a.Show();
        //直接使用成员内部类对象
        A.B ab = a.new B();
        System.out.println(ab.age);
        ab.Man();
        //外部类实例对象
        C c = new C();
        c.Live();
        System.out.println("姓名:"+ c.name);
        System.out.println("年龄:"+c.age);
        System.out.println("性别:"+c.sex);
        //内部类的成员调用,(必须要有一个外部类的实例对象)
        C.D cd =c.new D();
        System.out.println("姓名:" + cd.name);
        System.out.println("年龄:"+cd.age);
        System.out.println("性别:"+cd.sex);
        
        cd.Like();
        A2 a2=new A2();
        a2.hx();
        A2.B2 ab2 = a2.new B2();
        ab2.nh();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渣男あ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值