当前位置: 首页 > article >正文

07_面向对象高级_内部类

内部类

1. 认识内部类
  • 它是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块)
  • 如果一个类定义在另一个类的内部,这个类就是内部类。
public class Test {
    public static void main(String[] args) {
        // 直接输出: 内部类的静态成员变量
        System.out.println(Outer.Inner.gender);  // null

        // 创建内部类的对象,并调用功能
        Outer.Inner obj = new Outer().new Inner();
        // 调用内部类自己的方法
        obj.run();  // 快跑啊~~~
        obj.test();  // 1、10、100
    }
}

class Outer {
    // 成员变量
    private int number = 100;
    public static String info;

    // 成员方法
    public void run() {
        System.out.println("跑");
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    // 成员内部类
    public class Inner {
        // 成员变量
        private int number = 10;
        public static String gender;  // JDK 16才开始支持定义静态成员

        // 成员方法
        public void run() {
            System.out.println("快跑啊~~~");
        }

        public void test() {
            int number = 1;
            System.out.println(number);
            // 调用内部类的成员
            System.out.println(this.number);
            // 调用外部类的成员
            System.out.println(Outer.this.number);  // 通过Outer.this拿到当前的外部对象
        }

        public int getNumber() {
            return number;
        }

        public void setNumber(int number) {
            this.number = number;
        }
    }
}
2. 静态内部类 (了解)
  • 有 static 修饰的内部类,就是静态内部类
  • 静态内部类可以直接访问外部类的静态成员,但是不能直接访问外部类的实例成员
public class Test {
    public static void main(String[] args) {
        // 创建"静态内部类"的对象
        Outer.Inner obj = new Outer.Inner();
        obj.test();  // null
    }
}

class Outer {
    private int age;
    public static String schoolId;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    // 静态内部类
    public static class Inner {
        private String name;
        public static int id;

        public void test() {
            System.out.println(schoolId);  // 可以直接访问外部类的静态成员变量
//          System.out.println(age);  // 报错,不可以可以直接访问外部类的成员变量(对象的变量)
            // 因为这是静态内部类,如图静态方法一样,不能访问对象的变量
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}
3. 局部内部类
  • 局部内部类是定义在方法中,代码块中,构造器等执行体中
  • 这个语法没啥用,看看就好
public class Test {
    // main方法,程序入口
    public static void main(String[] args) {

    }
	// run方法
    public static void run() {
        class A {

        }
        abstract class B {

        }
        interface C {
            
        }
    }
}
4. 匿名内部类
  • 概念:它是一种特殊的局部内部类,所谓匿名:指的是程序员不需要为这个类声明名字。

  • 代码展示:

(要求在"代码二"中,使用"匿名内部类"的知识实现"代码一"的功能)

// 代码一
public class Test {
    public static void main(String[] args) {
        Animal obj = new Cat();
        obj.cry();
    }
}

class Cat extends Animal {
    @Override
    public void cry() {
        System.out.println("喵喵喵~~~");
    }
}

abstract class Animal {
    public abstract void cry();
}
// 代码二
public class Test {
    public static void main(String[] args) {
        // 计算机遇到代码"  new Animal(){...};  "会做两件事
        // 1.把这个匿名内部类,编译成一个子类
        // 2.然后会立即创建一个子类对象出来
        Animal obj = new Animal() {
            @Override
            public void cry() {
                System.out.println("喵喵喵~~~");
            }
        };  // 千万要注意!这里不要漏了分号;

        obj.cry();  // 喵喵喵~~~
    }
}

abstract class Animal {
    public abstract void cry();
}
  • 通过上面的演示,你应该很清楚的了解到"匿名内部类"的特点:它的本质就是一个子类,并且会立刻创建出一个子类对象,然后返回出来。
  • 应用场景:使用它可以更方便的创建一个子类,返回出来的对象则通常作为参数进行使用。

http://www.kler.cn/news/136698.html

相关文章:

  • Vue中使用el-upload实现文件上传时控制提交按钮状态的最佳实践
  • 《人工智能往事》—— 简而言之,AI 已经包围了我们。AI 就是我们。
  • 取消element-ui中账号和密码登录功能浏览器默认的填充色,element-ui登录账号密码输入框禁用浏览器默认填充色问题
  • ArcGIS无插件加载(无偏移)在线天地图高清影像与街道地图指南
  • 如何使用Golang的gomail库实现邮件发送功能
  • 项目管理的主要内容包括哪些,项目工具有哪些
  • 智能电销机器人好做吗?ai机器人有没有用?
  • HEVC参考帧技术
  • SVN 修改版本库地址url路径
  • 运维小技能:centos安装宝塔
  • 生产环境_移动目标轨迹压缩应用和算法处理-Douglas-Peucker轨迹压缩算法
  • 【Django-DRF用法】多年积累md笔记,第3篇:Django-DRF的序列化和反序列化详解
  • 【MATLAB源码-第83期】基于matlab的MIMO中V-BALST结构ZF和MMSE检测算法性能误码率对比。
  • 『亚马逊云科技产品测评』活动征文|开发一个手机官网
  • uniapp相关记录
  • 使用npm发布自己的组件库
  • vs2017 调试时 无法使用Lamda expressions表达式
  • [GFCTF 2021]wordy 编写去花IDAPYTHON
  • linux 服务器进程、端口查找,nginx 配置日志查找,lsof 命令详解
  • Linux程序设计(上)
  • 键盘方向键移动当前选中的table单元格,并可以输入内容
  • 通过 Canal 将 MySQL 数据实时同步到 Easysearch
  • Cypress断言篇
  • HINSTANCE是什么?
  • 打破思维的玻璃罩
  • shell脚本用法参数