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

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

                                    —— 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{@Overridepublic 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{@Overridepublic 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 {@Overridepublic 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() {@Overridepublic void open() {System.out.println("USB打开了");}@Overridepublic void close() {System.out.println("USB关闭了");}}.open();System.out.println("——————————————————————————————————————");// 有名对象,可以调用多个方法USB usb = new USB() {@Overridepublic void open() {System.out.println("USB打开了");}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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.mzph.cn/web/5073.shtml

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

相关文章

人工智能论文:BERT和GPT, GPT-2, GPT-3 的简明对比和主要区别

在BERT的论文里面: 2018.10 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding,BERT已经解释了BERT,GPT,ELMo的区别。 *ELMo为双向RNN,请忽略。 主要区别: BERT使用的是…

49. 【Android教程】HTTP 使用详解

在你浏览互联网的时候,绝大多数的数据都是通过 HTTP 协议获取到的,也就是说如果你想要实现一个能上网的 App,那么就一定会和 HTTP 打上交道。当然 Android 发展到现在这么多年,已经有很多非常好用,功能非常完善的网络框…

信息系统项目管理师0078:安全系统(5信息系统工程—5.4安全工程—5.4.2安全系统)

点击查看专栏目录 文章目录 5.4.2安全系统1.安全机制2.安全服务3.安全技术5.4.2安全系统 信息安全保障系统一般简称为信息安全系统,它是“信息系统”的一个部分,用于保证“业务应用信息系统”正常运营。现在人们已经明确,要建立一个“信息系统”,就必须要建立一个或多个业务…

hive使用hplsql进行etl或其它数据加工

参照 https://cwiki.apache.org/confluence/pages/viewpage.action?pageId59690156 http://www.hplsql.org/doc Hive HPL/SQL,即Hive Hybrid Procedural SQL一个开源工具,它为hive实现了过程性的SQL功能,类似Oracle的PLSQL。从hive 2.0.0开…

RustGUI学习(iced)之小部件(四):如何使用单选框radio部件?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 概述…

Python量化炒股的获取数据函数—get_concept()

查询股票所属的概念板块函数get_concept(),利用该函数可以查询一只或多只股票所属的概念板块,其语法格式如下: get_concept(security, dateNone)security:标的代码。类型为字符串,形式如‘000001.XSHE’,或…

k8s安装nginx Ingress超详细指南

在本全面的 Ingress 指南中,您将学习如何在 Kubernetes 上设置 Nginx Ingress控制器并使用 DNS 配置 Ingress。 目前有两种 Nginx Ingress 控制器。 kubernetes 社区的 Nginx Ingress 控制器Nginx Inc 开发的 Nginx Ingress 控制器 我们将使用 Kubernetes 社区 N…

使用QT完成如图的游戏登录界面 使用信号和槽完成密文明文密码转换,重置账号和密码,登录校验 详细代码在主页下载

头文件: #ifndef LOGINWIDGET_H #define LOGINWIDGET_H #include <QLineEdit> #include <QPushButton> #include <QWidget> class LoginWidget : public QWidget {Q_OBJECT public: LoginWidget(QWidget *parent = 0); ~LoginWidget(); public slots: …

【银角大王——Django课程——用户表的基本操作】

Django课程——用户表的基本操作 模板的继承用户管理用户列表展示新建用户Django组件原始方法【麻烦&#xff0c;太原始】form组件modelform组件 使用modelsform组件编写添加页面 模板的继承 &#xff08;1&#xff09;先写一个页面模板————这个案例中的模板基本上就是一个…

JAVA基础——集合框架(List与Set)

数据结构 什么是数据结构 数据结构就是用来装数据以及数据与之间关系的一种集合。如何把相关联的数据存储到计算机&#xff0c;为后续的分析提供有效的数据源&#xff0c;是数据结构产生的由来。数据结构就是计算机存储、组织数据的方式。好的数据结构&#xff0c;让我们做起事…

【统计推断】-01 抽样原理之(三)

文章目录 一、说明二、抽样分布三 均值抽样分布3.1 有限母体无放回抽样3.2 有限母体有放回抽样3.3 无限母体 四、比例抽样分布五、和差抽样分布 一、说明 上文中叙述母体和抽样的设计&#xff1b;以及抽样分布的概念&#xff0c;本篇将这种关系定量化&#xff0c;专门针对抽样的…

练习题(2024/4/29)

在深度优先遍历中&#xff1a;有三个顺序&#xff0c;前中后序遍历 这里前中后&#xff0c;其实指的就是中间节点的遍历顺序&#xff0c;只要记住 前中后序指的就是中间节点的位置就可以了。 如图 1二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前…

Linux学习之Tcp与Udp

目录 UDP Udp协议的格式 UDP的传输特性 UDP的缓冲区 基于UDP的应用层协议 TCP协议 TCP的报文格式 1.ACK确认应答机制 2.超时重传 3.TCP的链接管理机制 为什么要三次握手呢&#xff1f; 理解TIME_WAIT状态 流量控制&#xff08;可靠性效率&#xff09; 滑动窗口 拥塞…

CTFHub-Web-SSRF

CTFHub-Web-SSRF-WP 一、内网访问 1.题目提示说访问127.0.0.1的flag.php&#xff0c;在URL后面添加路径没想到直接访问成功 二、伪协议读取文件 1.题目提示说访问Web目录下的flag.php&#xff0c;联想到Web目录一般存放于/var/www/html/里&#xff0c;去修改URL尝试进行访问…

stm32f103c8t6学习笔记(学习B站up江科大自化协)-UNIX时间戳、BKPRTC

UNIX时间戳 UNIX时间戳最早是在UNIX系统使用的&#xff0c;所以叫做UNIX时间戳&#xff0c;之后很多由UNIX演变而来的系统也继承了UNIX时间戳的规定&#xff0c;目前linux&#xff0c;windows&#xff0c;安卓这些操作系统的底层计时系统都是用UNIX时间戳 时间戳这个计时系统和…

Java对接高德api搜索POI 2.0 关键字搜索

目录 一、注册账号 二、搜索小demo 1.首先要引入依赖 2. 然后查看打印结果即可 三、搜索接口代码 1.引入依赖 2.yml配置 2.Controller 3.静态工具类 四、运行测试 一、注册账号 高德开放平台 | 高德地图API 注册高德开发者&#xff1b;去控制台创建应用&#xff…

Arco design 发布到生成环境F5刷新报错404

问题&#xff1a;开发环境没问题&#xff0c;生成环境正常跳转也没问题但是F5刷新报错 解决办法一&#xff1a;修改 history: createWebHistory(), 改为history: createWebHashHistory(),

在Ubuntu linux操作系统上操作MySQL数据库常用的命令

检查是否安装了MySQL&#xff0c;或检查MySQL的状态&#xff1a; sudo systemctl status mysql或 sudo systemctl status mysql.service如果mysql有安装&#xff0c;上面这条命令会返回mysql的状态active或inactive。 卸载mysql数据库 第一步是停了数据库&#xff1a; sud…

MyBatis 插件介绍及应用

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

MyBatis(注解方式操作)

文章目录 1.注解方式操作文件目录1.快速入门&#xff08;完整步骤&#xff09;1.pom.xml&#xff08;完整&#xff09;2.resources/jdbc.properties外部配置文件&#xff08;根据实际情况修改参数&#xff09;3.在resources/mybatis-config.xml&#xff08;完整&#xff09;中配…