JAVA内部类

Java内部类是定义在另一个类内部的类,它可以访问外部类的所有成员属性和方法。根据不同的使用场景和需求,Java内部类可以分为多种类型,下面对各种类型的内部类进行详细的介绍:

内部类的基本使用:

内部类的基本概念:在一个类中定义一个类。比如说在类a的内部定义一个类b,那么这个类b就叫内部类。

内部类展示:

public class demo1 {//外面的类
    public class demo2{//内部类
        void hh(){            //内部类的方法
            System.out.println("内部类");
        }
    }
}

内部类的访问特点:

1.内部类可以直接访问外部类的成员,包括私有。

2.外部类要访问内部类成员必须创建内部类对象。

代码展示:

 class Outer{
    private int a=10;
    class Inner{
        int b=20;
        void In(){
            System.out.println(a);
        }

    }
     void Ou(){
         Inner inner=new Inner();//外部类只能创建内部类的对象
         System.out.println(inner.b);//只能这样才能用到内部的成员变量
     }
}

成员内部类

  1. 成员内部类(Member Inner Class)

    • 定义与访问权限:成员内部类是定义在外部类内部的普通类,它可以访问外部类的所有成员,包括私有成员。成员内部类可以具有private、public等访问权限修饰符。
    • 创建实例方式:要创建成员内部类的实例,需要先创建外部类的实例,然后通过外部类的实例来创建内部类的实例。
    • 用途:成员内部类常用于实现回调函数或事件处理,例如按钮点击事件的处理。它还可以用于实现接口,使外部类更加清晰,同时也使代码更加模块化。

成员内部类的定义位置:在类中方法,跟成员变量是一个位置。

外接创建成员内部类格式:外部类名.内部类名 对象名=new 外部类对象.new 内部类对象。

如: Outer.Inner a=new Outer().new Inner();

public class demo1 {//外面的类
//    public class demo2{//内部类
//        void hh(){            //内部类的方法
//            System.out.println("内部类");
//        }
//    }
    public static void main(String[] args) {
        Outer outer=new Outer();
        outer.Ou();
        Outer.Inner i=new Outer().new Inner();//引用内部类
        i.In();
    }
}
 class Outer{
    private int a=10;
    class Inner{
        int b=20;
        void In(){
            System.out.println(a);
        }

    }
     void Ou(){
         Inner inner=new Inner();//外部类只能创建内部类的对象
         System.out.println(inner.b);//只能这样才能用到内部的成员变量
     }
}

局部内部类

  1. 局部内部类(Local Inner Class)

    • 定义与作用域:局部内部类是定义在一个方法内部的内部类,它的作用域仅限于包含它的方法。
    • 用途:局部内部类通常用于解决一些特定的问题,例如需要一个临时的类来完成某项任务。它将类的定义封装在方法内部,避免对其他部分的代码造成干扰,提高了代码的可读性和可维护性。

局部内部类定义位置:局部内部类是在方法中定义的类

局部内部类格式:局部内部类,外接是无法直接使用,需要在方法内部创建对象并使用。该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

public class demo2 {
    public static void main(String[] args) {
        Outer1 o1=new Outer1();
        o1.FangFa();
    }
}
class Outer1{
    private int a=10;
    public void FangFa(){
        class Inner {
            int b=20;
            void In(){
                System.out.println(a);//方法中的内部类可以访问外部类的成员。
            }
        }
        Inner inner=new Inner();
        inner.In();
        int c=inner.b;
        System.out.println(c);//外部要访问内部类,需要通过在方法里面创建内部类对象
    }
}

匿名内部类

  1. 匿名内部类(Anonymous Inner Class)

    • 定义与特点:匿名内部类是没有名字的内部类,通常用于创建临时的子类实例。它不需要在外部类中明确地定义这个类,而是在方法内部通过匿名类来定义。
    • 用途与优势:匿名类和Inner Class一样,可以访问Outer Class的private字段和方法。它通常不关心类名,比直接定义Inner Class可以少写很多代码。匿名类也完全可以继承自普通类。

匿名内部类的前提:存在一个类或者借口,这里的类可以是具体类也可以是抽象类。

匿名内部类的格式:new 类名(){重写方法} new 接口名(){重写方法}

new Inter(){
    @Override
    public void method(){}
} 

匿名内部类的本质:是一个继承了该类或者实现了该接口的子类匿名对象。

匿名内部类的细节:匿名内部类可以通过多态的形式接收

Inter i = new Inter(){
  @Override
    public void method(){
        
    }
}

匿名内部类直接调用方法

public class demo3 {
    public static void main(String[] args) {
        new Inter(){
            public void in(){
                System.out.println("匿名内部类");
            }
        }.in();
    }
}
interface Inter{
    void in();
        }

 静态内部类

  1. 静态内部类(Static Nested Class)
    • 定义与访问权限:静态内部类可以使用static关键字定义,我们不需要创建外部类来访问它,可以直接访问它。但静态内部类无法访问外部类的非静态成员。
    • 用途:静态内部类适用于那些与外部类有逻辑关联但又不完全依赖于外部类的场合,例如作为外部类的工具类或者实现特定的功能类。

除了上述阐述的基本内容外,以下还有几点需要注意的事项:

  • 内部类的实例不能单独存在,必须依附于一个外部类的实例。这是因为内部类除了有一个this指向它自己,还隐含地持有一个外部类实例的引用。
  • 观察Java编译器编译后的.class文件可以发现,外部类被编译为外部类名.class,而内部类被编译为外部类名$内部类名.class。
  • 内部类可以使用private或protected来修饰,如果你不希望内部类被外部类访问可以使用private修饰符。

综上所述,Java内部类是一个强大且灵活的概念,它允许在一个类的内部定义另一个类,并根据不同的需求分为成员内部类、局部内部类、匿名内部类和静态内部类四种类型。每种类型的内部类都有其特定的语法规则、用途和优势。在实际编程中,可以根据具体的需求选择合适的内部类类型,以实现更好的封装性和代码组织。

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值