重学java 26.面向对象 内部类⭐

news2024/11/24 13:40:38

“别担心,你一定能如愿。”

                                    —— 24.4.29

1.什么时候使用内部类:

        当一个事物的内部,还有一个部分需要完整的结构去描述,而内部的完整结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类

        比如:人类有心脏,人类本身需要用属性、行为去描述,那么人类内部的心脏也需要心脏特殊的属性和行为去描述,此时心脏就可以定义成内部类,人类中的一个心脏类

2.在java中允许一个类的定义位于另外一个类的内部,前者被称之为内部类,后者被称之为外部类

        class A{

                class B{

                                

                }

        }

        类A就是类B的外部类

        类B就是类A的内部类

3.分类:

        成员内部类(静态,非静态)

        局部内部类

        匿名内部类(重点)

一、静态成员内部类

1.格式:

        直接在定义内部类的时候加上static关键字

        public class A{

                static class B{

                }

        }

2.注意:

        a、内部类可以定义属性、方法、构造等

        b、静态内部类可以被final或者abstract修饰

              被final修饰之后,不能被继承

              被abstract修饰之后,不能new

        c、静态内部类不能调用外部的非静态成员

        d、内部类还可以被四种权限修饰符修饰

二、成员内部类

1.调用静态成员内部类

        外部类.内部类 对象名 = new 外部类.内部类()

public class Person {
    public void eat(){
        System.out.println("人要干饭");
    }

    static class Heart{
        public void jump(){
            System.out.println("心脏跳动");
        }
    }
}
public class Demo134StaticInnerClass {
    public static void main(String[] args) {
        // 外部类.内部类 对象名 = new 外部类.内部类()
        Person.Heart heart = new Person.Heart();
        heart.jump();
    }
}

2.调用非静态成员内部类

        外部类.内部类 对象名 = new 外部类().new 内部类()

Person外部类,Heart内部类,jump内部类Heart里的方法

public class Person {
    public void eat(){
        System.out.println("人要干饭");
    }

    class Heart{
        Heart(){

        }
        public void jump(){
            System.out.println("心脏跳动");
        }
    }
}
public class Demo135StaticInnerClass2 {
    public static void main(String[] args) {
        // 外部类.内部类 对象名 = new 外部类().new 内部类()
        Person.Heart heart = new Person().new Heart();
        heart.jump();
    }
}

外部类的成员变量和内部类的成员变量以及内部类的局部变量重名时,怎么区分?

示例:

        外部类Student 内部类Heart 内部类的方法display

public class Student {
    String name = "金莲";
    class Heart{
        String name = "大朗";
        public void display(String name){
            // 内部类的局部变量
            System.out.println(name);
            // 内部类的成员变量
            System.out.println(this.name);
            // 外部类的成员变量
            System.out.println(Student.this.name);
        }
    }
}

测试类

public class Demo136StaticInnerClass3 {
    public static void main(String[] args) {
        Student.Heart heart = new Student().new Heart();
        heart.display("小明");
    }
}

三、局部内部类

1.局部内部类的基本操作

        可以定义在方法中、代码块中、构造方法

示例:

Person外部类和Heart内部类

public class Person {
    public void eat(){
        class Heart{
            public void jump(){
                System.out.println("心脏哐哐哐的跳动");
            }
        }
        new Heart().jump();
    }
}

测试类

public class Demo137StaticInnerClass4 {
    public static void main(String[] args) {
        Person person = new Person();
        person.eat();
    }
}

2.局部内部类实际操作

1.接口类型作为方法参数传递和返回

        接口作为方法参数,传递实参时,传递的是实现类对象

        

示例:

        接口

public interface USB {
    public abstract void open();
}

        实现类

public class Mouse implements USB{

    @Override
    public void open() {
        System.out.println("鼠标打开");
    }
}

        测试类

    public static void main(String[] args) {
        Mouse mouse = new Mouse();
        method(mouse);
        System.out.println("————————————————————————");
//        USB usb = new Mouse();
        USB usb = method01();
        usb.open();
    }
    /*
         接口作为方法参数返回,实际返回的是实现类对象
         USB usb = mouse ——> 多态
     */
    public static void method(USB usb){
        usb.open();
    }

    /*
        接口作为返回值类型,传递实参时,传递的是实现类对象
    */
    public static USB method01(){
        Mouse mouse = new Mouse();
        return mouse;
        //return new Mouse();
    }
}

2.抽象类作为方法参数和返回值

        ① 抽象类作为方法参数传递,传递实参时,传递的是其子类对象

        ② 抽象类作为方法返回值类型返回时,实际返回的是其子类对象

示例:

        抽象类

public abstract class Animal {
    public abstract void eat();
}

        实现类

public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗啃骨头");
    }
}

        测试类

public class Demo139StaticInnerClass6 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        method01(dog);
        System.out.println("————————————————————");
        Animal animal = method02();
        animal.eat();
    }

    public static void method01(Animal animal){
        animal.eat();
    }

    public static Animal method02(){
        Dog dog = new Dog();
        return dog;
    }
}

3.普通类做方法参数和返回值

        普通类作为方法参数传递,传递的是对象
        普通类作为方法返回值返回,返回的是对象

示例:

        普通类

public class Person {
    public void eat(){
        System.out.println("人要吃饭");
    }
}

        测试类

public class Demo140StaticInnerClass7 {
    public static void main(String[] args) {
        Person person = new Person();
        method01(person);
        System.out.println("————————————————————————");
        Person person1 = method02();
        method01(person1);
    }

    public static void method01(Person person){
        person.eat();
    }

    public static Person method02(){
        Person person = new Person();
        return person;
    }
}

4.局部内部类实际操作

        USB接口

public interface USB {
    void open();
}

        测试类

public class Demo141StaticInnerClass8 {
    public static void main(String[] args) {
        // USB usb = new Mouse()
        USB usb = method();
        usb.open();
    }

    public static USB method(){
        // 局部内部类
        class Mouse implements USB {
            @Override
            public void open() {
                System.out.println("鼠标打开了");
            }
        }
        Mouse mouse = new Mouse();
        return mouse;
    }
}

四、匿名内部类⭐

1.定义

        所谓的匿名内部类:可以理解为没有显式声明出类名的内部类

2.问题描述

        我们如果想实现接口,简单使用一次抽象方法,我们就需要创建一个实现类,实现这个接口,重写抽象方法,还要new实现类对象,如果我们单纯使用一次接口中的方法,我们能否不这么麻烦进行实现吗?

        a、创建实现类,实现接口

        b、重写方法

        c、创建实现类对象

        d、调用方法

3.单纯使用接口方法

        如果我们想单纯使用一下接口中的方法,我们可以四步合一

4.匿名内部类学习方法

        按照一种格式来学习,这一种格式代表了实现类对象或是子类对象

5.格式

     实现类对象

        ①:

        new 接口/抽象类(){

                重写方法

        }.重写的方法():

       

        ②:

        类名 对象名 = new 接口/抽象类(){

                重写方法

        }

        对象名.重写的方法

public class Demo142StaticInnerClass9 {
    public static void main(String[] args) {
        // 重写接口方法
        new USB() {
            @Override
            public void open() {
                System.out.println("USB打开了");
            }

            @Override
            public void close() {
                System.out.println("USB关闭了");
            }
        }.open();

        System.out.println("——————————————————————————————————————");

        // 有名对象,可以调用多个方法
        USB usb = new USB() {
            @Override
            public void open() {
                System.out.println("USB打开了");
            }

            @Override
            public void close() {
                System.out.println("USB关闭了");
            }
        };
        usb.open();
        usb.close();
    }
}

抽象方法创建实现类对象调用抽象方法合二为一:

6.总结

1.什么时候使用匿名内部类?

        当简单调用一次接口中的方法,我们就可以使用匿名内部类

2.将一种格式代表实现类对象或者子类对象来学习
3.匿名内部类会编译生成的,我们只需要利用讲的格式去new对象,调用重写的方法即可

7.匿名内部类的复杂使用_当参数传递

        接口

public interface USB {
    // 定义一个抽象方法
    void open();
}

        测试类

public class Demo143StaticInnerClass10 {
    public static void main(String[] args) {
        method01(new USB() {
            @Override
            public void open() {
                System.out.println("USB打开了");
            }
        });
    }

    public static void method01(USB usb){
        usb.open();
    }
}

        实现流程

8.匿名内部类的复杂使用_当返回值返回

        接口

public interface USB {
    // 定义一个抽象方法
    void open();
}

        测试类

public class Demo144StaticInnerClass11 {
    public static void main(String[] args) {
        USB usb = method01();
        usb.open();
    }

    public static USB method01(){
        return new USB() {
            @Override
            public void open() {
                System.out.println("USB打开了");
            }
        };
    }
}

实现流程

五、总结

1.权限修饰符

        ①属性:用 private -> 封装思想

        ②成员方法:用 public -> 便于调用

        ③构造public:便于new对象

2.final关键字

        ①修饰类

                a、格式:public final class 类名

                b、特点:不能被继承

        ②修饰方法

                a、格式:修饰符final 返回值类型 方法名(形参){}

                b、特点:不能被重写

                c、注意:final和abstract不可以同时使用

        ③修饰局部变量

                a、格式:final 数据类型 变量名 = 值

                b、特点:不能二次赋值     

        ④修饰对象

                a、格式:final 类型 对象名 = new 对象()

                b、特点: 地址值不能变,但是对象中的属性值可以改变

        ⑤修饰成员变量

                a、格式:final 数据类型 变量名 = 值

                b、特点:需要手动赋值,不能二次赋值

3.代码块

        ①构造代码块

                a、格式:        { 代码 }

                b、执行特点:优先于构造方法执行,每new一次就执行一次

        ②静态代码块

                a、格式:        static{ 代码 }

                b、执行特点:优先于构造代码块和构造方法执行,且只执行一次

4.内部类

        ①静态成员内部类

                外部类.内部类.对象名 = new 外部类.内部类()

        ②非静态成员内部类

                外部类.内部类.对象名 = new 外部类().new 内部类()

        ③局部内部类

                ⭐ 匿名内部类

                        格式1:

                                new 接口/抽象类(){

                                        重写方法

                                }.重写的方法():

       

                        格式2:

                                类名 对象名 = new 接口/抽象类(){

                                        重写方法

                                }

                                对象名.重写的方法

                        注意:

                                学习:一个格式代表实现类对象或者子类对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1632725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React的useEffect

概念:useEffect是一个React Hook函数,组件渲染之后执行的函数 参数1是一个函数,可以把它叫做副作用函数,在函数内部可以放置要执行的操作参数2是一个数组(可选参),在数组里放置依赖项&#x…

旧物焕新生:探索旧物回收小程序的开发与应用

随着社会的快速发展,我们的生活节奏日益加快,物质需求也在不断膨胀。然而,随之而来的却是资源的浪费和环境的压力。在这样的背景下,旧物回收小程序应运而生,为我们提供了一个绿色、环保、便捷的生活新选择。 旧物回收…

Android Kernel源码下载方法

Android Kernel的源码是git管理的,和之前下载的Android源码管理方式不一样,所以下载方式也不一样,直接用git下载就可以了;去网上搜的下载方式五花八门,有很多问题,因为服务器经常无法访问,也一直…

C++笔记:类和对象(二)->继承

上篇内容:C中的重载 继承 继承是什么 在类和对象(一)->封装中说了,封装是将对应的属性和行为封装到一个类中。 那什么是继承呢? 比如一个学校有老师和同学还有领导,那么我们最开始的想法就是每个职位都去封装一个类&#xff0c…

免费通配符证书的申请指南——从申请到启动https

如果您的网站拥有众多二级子域名,那么通配符证书证书是最好的选择。 免费通配符申请流程如下: 1 创建证书服务商账号 首先选择一个提供免费通配符的服务商,打开国产服务商JoySSL官网,创建一个账号(注册账号时填写注册…

共享办公室——一种成熟的工作空间解决方案

在固定的框架外寻求灵活性与创新,共享办公室租赁提供了一个动态且富有成本效益的工作环境,适应了快节奏和变化多端的商务需求。 随着创业文化的蓬勃发展和远程工作模式的流行,共享办公室以其独特的优势迅速成为市场上的新秀。它推动了工作…

深入理解 ANR WatchDog 库

ANR WatchDog 是一个用于检测 Android 应用程序中的 ANR (应用程序无响应) 的开源库。本文将深入探讨这个库的工作原理、如何集成到你的应用中,以及它如何帮助你避免用户体验不佳的情况。 ANR WatchDog 库的工作原理 ANR WatchDog 通过一个简单的机制来检测ANR&am…

如何学习网络安全?网络安全零基础入门,看这一篇就够了!

一、概述: 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。这涉及到保护企业数据、国家基础设施、知识产权以及维护网络…

伪装目标检测论文阅读 SAM大模型之参数微调:Conv LoRA

paper:link code:还没公开 摘要 任意分割模型(SAM)是图像分割的基本框架。虽然它在典型场景中表现出显著的零镜头泛化,但当应用于医学图像和遥感等专门领域时,其优势就会减弱。针对这一局限性,本文提出了一种简单有效…

Linux_Ubuntu18.04安装过程

目录 1. 虚拟机安装2. 虚拟机创建3. Ubuntu x64安装4. 开启重启问题 1. 虚拟机安装 版本:VMware-workstation-full-16.0.exe 下一步 接受 下一步 下一步,注意安装位置。 下一步 下一步 点击安装 等待安装完成。 2. 虚拟机创建 创建新的虚拟机 典型 稍后…

【Java那些事】关于前端收到后端返回的时间格式“2024-04-28T14:48:41“非想要的格式

问题: 后端操作后返回时间格式是"2024-04-28T14:48:41" 而我们想要的是:"2024-04-28 14:48:41", 两个解决方法: 方法一:使用 JsonFormat注解 Data AllArgsConstructor NoArgsConstructor public class Use…

前端高并发的出现场景及解决方法——技能提升——p-limit的使用

最近在写后台管理系统的时候,遇到一个场景,就是打印的页面需要根据传入的多个id,分别去请求详情接口。 比如id有10个,则需要调用10次详情接口获取到数据,最后对所有的数据进行整合后页面渲染。 相信大家或多或少都遇到…

MyBatis 插件介绍及应用

MyBatis 插件介绍及应用 MyBatis 是一个持久层框架,它允许开发者自定义 SQL 语句并将其映射到 Java 对象中。MyBatis 提供了一种灵活的数据库操作方式,但随着项目的复杂度增加,一些通用功能如分页、缓存、事务管理等可能需要重复编写。为了解…

仅1年!!影响因子10+飙升至30+,Springer旗下的潜力优刊,未来可期!

【SciencePub学术】今天小编给大家带来了一本医学类的高分优刊解读,隶属于Springer出版社,JCR1区,中科院1区TOP,创刊时间不长,但影响因子仅1年时间从10直接飙升至30,领域相符的学者可考虑! Sign…

PaddlePaddle与OpenMMLab

产品全景_飞桨产品-飞桨PaddlePaddle OpenMMLab算法应用平台

基于LEAP模型的碳排放建模及行业、区域、国家等层面实践应用

线上方式:腾讯会议; 本期共计8次直播课,每节3小时。 5月24日-5月26日 每天(8:30-11:30)腾讯会议直播 5月31日-6月02日 每天(8:30-11:30)腾讯会…

Android 多媒体处理中ByteBuffer使用注意事项

Android多媒体处理中ByteBuffer使用注意事项 ByteBuffer 是 Java 中用来操作原始字节数据的类,它提供了一种灵活的方式来读取、写入和操作字节数据。以下是关于 ByteBuffer 的详细说明: 创建 ByteBuffer 你可以通过几种方式来创建 ByteBuffer&#xf…

新接口上线啦,近期我们增加了九个接口

天行数据近期新增了独立计次类接口:食物营养识别、数字识别、条形码识别和会员免费类接口:全国常用电话、健康小妙招、多音字查询、国际时区查询、英语格言等。 1、食物营养识别 通过输入图像资源,识别近两千种常见食物的详细营养成分及100…

转换图片为jpg格式?几个一键转换格式的方法

现在图片格式越来越多,我们经常需要对一些不符合要求的图片进行图片格式转换,否则就会出现打不开或者无法编辑处理的情况,那么对于一些不太懂电脑的小伙伴来说图片转格式会比较复杂,今天小编就来教大家几个简单的改变图片格式的方…

mars3d开发过程中点击面图层飞行定位,设置俯仰角度后,layer.flyTo({没有生效的排查思路

mars3d开发过程中点击面图层飞行定位,设置俯仰角度后,layer.flyTo({没有生效的排查思路记录,给大家提供一下以后排查定位问题的方向 问题场景相关代码: 1.项目本身代码: 2.精简了关键性代码后,就可以去ge…