java基础【内部类(普通内部类,嵌套类,普通局部内部类,匿名内部类)】

本文详细介绍了Java中的内部类,包括成员内部类、嵌套类(静态内部类)、局部内部类和匿名内部类。通过示例展示了它们的创建、使用以及与外部类的交互方式,特别强调了匿名内部类在实现接口时的应用。

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

package com.hike.javase.innerclass;

/**
 * 内部类:把一个类定义在另一个类的内部,后面的类称为外部类
 *
 * 内部又分为:
 *      成员内部类:声明在类中方法外
 *          没有被static修饰的称为普通内部类
 *              适用于内部类与外部类频繁交互,比对相关联更方便,但对象关联更安全,所以用的多一些
 *          被static修饰的内部类称为嵌套类
 *      局部内部内:声明在方法中
 *          普通用法,普通局部内部类
 *          匿名内部类(重点),主要和接口配合使用
 */

class Outer{
    private int id = 10;

    //普通内部类,隶属于外部类的对象,创建和使用会受到外部类对象的限制。
    public class inner1{
        private int id = 100;

        public void inner1Test(){
            System.out.println(id); //就近原则,100
            System.out.println(inner1.this.id);//内部类的id
            System.out.println(Outer.this.id);//外部类的id

            outerTest2();//在内部类中可以随意使用外部类的成员,因为都是类的成员,这也是内部类与外部类的关系
        }
    }

    public void outerTest1(){
        inner1 inner1 = this.new inner1();
        inner1.inner1Test();
    }

    public void outerTest2(){
        System.out.println("outerTest2()...");
    }

    //嵌套类,与外部类是平级的关系
    static class Inner2{

        public static String name = "Inner2";

        public static void staticTest(){
            System.out.println("inner static test");
        }

        private  int age;

        public Inner2(int age){
            this.age = age;
        }

        public void inner2Test(){
            System.out.println("inner2Test");
        }
    }
}

//匿名内部类通常和接口配合
interface I1{
    void test1();
}


public class InnerClassTest {

    public static void main(String[] args) {
        //匿名内部类:因为没有类名,所以需要在声明的同时创建对象
        I1 i1 = new I1(){   //只能创建一个对象,并且不能本态调用
            //类体部分就相当于接口的实现子类的类体
            @Override
            public void test1() {
                System.out.println("匿名内部类的实现方法体");
            }
        };
        i1.test1();

        new I1(){

            @Override
            public void test1() {
                System.out.println("第二个匿名内部类的实现");
            }
        }.test1(); //匿名类的匿名对象,仅适用于一次性调用
    }

    public static void main3(String[] args) {
        //普通局部内部类:在方法中声明的内部类。不可以加修饰符,可以有属性,get、set方法
        class LocalClass1{
            private int id;
            private String name;

            public int getId() {
                return id;
            }

            public void setId(int id) {
                this.id = id;
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            @Override
            public String toString() {
                return "LocalClass1{" +
                        "id=" + id +
                        ", name='" + name + '\'' +
                        '}';
            }
        };

        LocalClass1 localClass1 = new LocalClass1();
        System.out.println(localClass1.getId());
        System.out.println(localClass1.getName());
    }

    public static void main2(String[] args) {
        Outer.Inner2.staticTest();

        Outer.Inner2 oi2 = new Outer.Inner2(15);
        oi2.inner2Test();
    }

    public static void main1(String[] args) {
        Outer outer = new Outer();
//        outer.outerTest1(); //100
        //直接创建内部类对象,需要使用外部类对象.new
        Outer.inner1 inner1 = outer.new inner1();
        inner1.inner1Test();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

OneTenTwo76

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

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

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

打赏作者

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

抵扣说明:

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

余额充值