重学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使用的是…

SpringBoot整合Mybatis实现多数据源配置

文章目录 I Mybatis1.1 数据库连接相关配置1.2 定义读取文件名1.3 为单个SqlSession动态设置隔离级别1.4 mybatis-plus代码生成器II pagehelper分页2.1 pagehelper配置2.2 使用方法III mybatis-plus多数据源配置IV 数据库连接池4.1 Druid的属性配置4.2 监控配置4.3 展示Druid的…

微信小程序实现用户手机号授权

以下代码均使用uniapp进行实现 本文的代码只提供了前端代码部分&#xff0c;后端接口部分没有进行提供 <!-- 使用 open-type 来触发手机号授权 --> <button open-type"getPhoneNumber" getphonenumber"getPhoneNumber">绑定手机号 </butt…

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

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

信息系统项目管理师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&#xff0c;即Hive Hybrid Procedural SQL一个开源工具&#xff0c;它为hive实现了过程性的SQL功能&#xff0c;类似Oracle的PLSQL。从hive 2.0.0开…

云计算中的网络服务

网络服务是云计算平台不可或缺的一部分&#xff0c;为用户提供构建、管理、保护云环境中网络资源的能力。以下是对列举的七种网络服务——虚拟私有云&#xff08;VPC&#xff09;、负载均衡、内容分发网络&#xff08;CDN&#xff09;、云防火墙、专用网络连接&#xff08;专线…

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

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

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

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

k8s安装nginx Ingress超详细指南

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

养老金融:编织中国老龄社会的金色安全网

在科技金融、绿色金融、普惠金融、养老金融、数字金融这“五篇大文章”中&#xff0c;养老金融以其独特的社会价值和深远影响&#xff0c;占据着不可或缺的地位。十三届全国政协经济委员会委员、原中国保监会副主席周延礼先生近期在多个场合的发言&#xff0c;不仅凸显了养老金…

⑦ - 产品经理通识指南

📖 该文隶属 程序员:职场关键角色通识宝典✍️ 作者:哈哥撩编程(视频号同名) 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者🏆 推荐专栏: 🏅 程序员:职场关键角色通识宝典🏅

【成长篇】Java程序员的自我突破

Java程序员的自我突破 在快速发展的IT行业中,Java程序员作为其中的一支重要力量,面临着不断变化的技术环境、激烈的竞争压力以及日益增长的工作要求。为了在这个行业中立足并取得成功,Java程序员需要不断地进行自我突破,提升自己的能力和价值。本文将从多个方面探讨Java程…

使用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: …

C++11 设计模式6. 建造者模式,也叫做生成器模式

一 什么是建造者模式&#xff1f; 建造者模式&#xff08;也被成为⽣成器模式&#xff09;&#xff0c;是⼀种创建型设计模式&#xff0c;软件开发过程中有的时候需要创建很复杂的对象&#xff0c;⽽建造者模式的主要思想是将对象的构建过程分为多个步骤&#xff0c;并为每个步…

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

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

2024-04-29 区块链-项目-记录

摘要: 2024-04-29 区块链-项目-记录 区块链项目记录: (1) C 比特币(BTC) github&#xff1a; https://github.com/bitcoin/bitcoin 莱特币(LTC) github&#xff1a; https://github.com/litecoin-project/litecore-litecoin 瑞波币(XRP) github&#xff1a; https://gi…

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

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

docker学习笔记8:centos docker安装redis

在 CentOS 上使用 Docker 安装 Redis 的步骤相对直接,下面是详细的操作指南: 1. 确保 Docker 已安装 首先,确保你的 CentOS 系统上已经安装并启动了 Docker。可以通过以下命令来检查 Docker 服务的状态: sudo systemctl status docker如果 Docker 未安装,你可以按照以下…

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

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