Java --- 内部类

目录

一、什么是内部类

二、为什么需要内部类

三、内部类的分类

3.1、成员内部类

3.2、局部内部类

四、练习

一、什么是内部类

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类(InnerClass ,类B则称为外部类(OuterClass

二、为什么需要内部类

具体来说,当一个事物A的内部,还有一个部分需要一个完整的结构B进行描述,而这个内部的完整的结构B又只为外部事物A提供服务,不在其他地方单独使用,那么整个内部的完整结构B最好使用内部类。

总的来说,遵循高内聚、低耦合的面向对象开发原则。

三、内部类的分类

3.1、成员内部类

  • 成员内部类作为类的成员的角色
    • 和外部类不同,Inner class还可以声明为private或protected;
    • 可以调用外部类的结构。(注意:在静态内部类中不能使用外部类的非静态成员)
    • Inner class 可以声明为static的,但此时就不能再使用外层类的非static的成员变量;
  • 成员内部类作为类的角色
    • 可以在内部定义属性、方法、构造器等结构
    • 可以继承自己的想要继承的父类,实现自己想要实现的父接口们,和外部类的父类和父接口无关
    • 可以声明为abstract类 ,因此可以被其它的内部类继承
    • 可以声明为final的,表示不能被继承
    • 编译以后生成OuterClass$InnerClass.class字节码文件(也适用于局部内部类)
java 复制代码
public class OuterClass {
    public static void main(String[] args) {
        //创建静态成员内部类对象
        Person.Cat cat = new Person.Cat();
        cat.method();
        //创建非静态成员内部类对象
        Person person = new Person();
        Person.Bird  bird = person.new Bird();
        bird.method();
        bird.method2("形参名");
        bird.method1();
    }


}
//外部类
class Person{
    String name = "外部类";
    //静态成员内部类
    static class Cat{
       public  void method(){
           System.out.println("静态成员内部类创建成功");
       }
    }
    //非静态成员内部类
    class Bird{
        String name = "内部类";
        public  void method(){
            System.out.println("非静态成员内部类创建成功");
        }
        public void method2(String name){
            System.out.println("调用形参的name:" + name);
            System.out.println("调用内部类属性的name:" + this.name);
            System.out.println("调用外部类属性的name:" +  Person.this.name);
        }
        public void method1(){
            method();
            Person.this.method();
        }
    }
    public void method(){
        System.out.println("正在吃饭。。。");
    }
}

3.2、局部内部类

java 复制代码
class A{
    public Comparable method(){
        //非匿名局部内部类
//        class MyComparable implements Comparable{
//            @Override
//            public int compareTo(Object o) {
//                return 0;
//            }
//        }
//        return new MyComparable();
        //非匿名内部类
//        Comparable<Object> comparable = new Comparable<>() {
//            @Override
//            public int compareTo(Object o) {
//                return 0;
//            }
//        };
//        return comparable;
        //匿名内部类
       return new Comparable() {
           @Override
           public int compareTo(Object o) {
               return 0;
           }
       };
    }
}

四、练习

java 复制代码
public class InnerObjTest {
    public static void main(String[] args) {
        Inner inner = new Inner();
        inner.method();
    }
}
class Inner{
    public void method(){
        //匿名内部类
        new Object(){
            //定义方法
            public void test(){
                System.out.println("hello word");
            }
        }.test();
    }
}
相关推荐
sheji34169 分钟前
【开题答辩全过程】以 家庭教育资源网为例,包含答辩的问题和答案
java
百***787515 分钟前
Grok-4.1与GPT-5.2深度对比:技术差异、适用场景及Python集成指南
java·python·gpt
Mr -老鬼32 分钟前
Java VS Rust
java·开发语言·rust
北凉军40 分钟前
java连接达梦数据库,用户名是其他库的名称无法指定库,所有mapper查询的都是以用户名相同的库内的表
java·开发语言·数据库
程序员张31 小时前
Mybatis条件判断某属性是否等于指定字符串
java·spring boot·mybatis
wuk9981 小时前
基于C#与三菱PLC通过TCPIP实现MC协议通信示例
java·网络·c#
沛沛老爹1 小时前
Web转AI架构篇 Agent Skills vs MCP:工具箱与标准接口的本质区别
java·开发语言·前端·人工智能·架构·企业开发
码农小卡拉1 小时前
Maven与Gradle选型指南:如何匹配项目的依赖管理需求
java·gradle·maven
avi91111 小时前
Unity 天命6源码- 商业游戏说明分析
开发语言·unity·c#·游戏开发·游戏源码
黎雁·泠崖1 小时前
吃透Java操作符进阶:算术+移位操作符 全解析(Java&C区别+完整案例+避坑指南)
java·c语言·python