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

Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)

文章目录

  • 内部类
    • 17.1概述
    • 17.2成员内部类
      • 17.2.1 获取成员内部类对象
      • 17.2.2 成员内部类内存图
    • 17.3静态内部类
    • 17.4局部内部类
    • 17.5匿名内部类
      • 17.5.1概述

内部类

17.1概述

写在一个类里面的类叫内部类,即 在一个类的里面再定义一个类。

如,A类的里面的定义B类,B类就称内部类

public class A{public class B{}
}

内部类表示的事物是外部类的一部分

内部类单独出现没有任何意义

什么时候用到内部类?

B类表示的事物是A类的一部分,且B单独存在没有意义

如:汽车的发动机,ArrayList的迭代器,人的心脏等等

内部类的访问特点:

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须要创建对象

内部类案列:

需求:写一个JavaBean类描述汽车
属性:汽车的品牌,车龄,颜色,发动机的品牌,使用年限。

public class Car {//Car类是外部类private String carName;int carAge;String carColor;public void show(){System.out.println(carName);//nullSystem.out.println(carAge);//1// 外部类要访问内部类的成员,必须要创建对象Engine e = new Engine();e.engineName="比亚迪";System.out.println(e.engineName);//比亚迪}class Engine{//Engine类是内部类String engineName;int engineAge;}}
============================================public class Test {public static void main(String[] args) {Car car  = new Car();car.carAge=1;car.carColor="黑色";car.show();//null   1  比亚迪}
}

17.2成员内部类

写在成员位置,属于外部类成员

成员内部类可以被一些修饰符所修饰,比如: private,默认,protected,public,static等

在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量。

public class Car {//Car类是外部类private String carName;int carAge;String carColor;class Engine{//Engine类是成员内部类String engineName;int engineAge;}}

17.2.1 获取成员内部类对象

方式一:外部直接创建成员内部类的对象

格式:外部类.内部类 变量 = new 外部类().new 内部类();
public class Outer {// 成员内部类,属于外部类对象的。// 拓展:JDK16之前成员内部类不能定义静态成员。public class Inner{// 这里面的东西与类是完全一样的。public void method(){System.out.println("内部类中的方法被调用了");}}
}
========================================================public class Test {public static void main(String[] args) {//  宿主:外部类对象。// Outer out = new Outer();// 创建内部类对象。//方式一:外部直接创建成员内部类的对象Outer.Inner oi = new Outer().new Inner();oi.method();}
}

方式二:在外部类中定义一个方法提供内部类的对象(内部类是私有的)

public class Outer {String name;private class Inner{static int a = 10;}//在外部类中定义一个方法提供内部类的对象public Inner getInstance(){return new Inner();}
}
==================================public class Test {public static void main(String[] args) {Outer o = new Outer();//第一种接收//Object o  = o.getInstance()//第二种,直接打印System.out.println(o.getInstance());}
}

17.2.2 成员内部类内存图

public class Outer {private int a = 10;class Inner {private int a = 20;public void show() {int a = 30;//Outer.this 获取了外部类对象的地址值System.out.println(Outer.this.a);//10System.out.println(this.a); //20System.out.println(a); //30}}
}
============================================================public class Test {public static void main(String[] args) {//创建内部类的对象,并调用show方法Outer.Inner oi = new Outer().new Inner();oi.show();}
}

(图片来自B站Java视频)
在这里插入图片描述

17.3静态内部类

成员内部类的一种

public class Car {//Car类是外部类private String carName;int carAge;String carColor;static class Engine{//Engine类是静态内部类String engineName;int engineAge;}}
  • 静态内部类可以直接访问外部类的静态变量和静态方法。
  • 静态内部类不可以直接访问外部类的非静态成员,如果要访问需要创建外部类的对象。

静态内部类对象的创建格式:

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

调用方法的格式:

  • 调用非静态方法的格式:先创建对象,用对象调用
  • 调用静态方法的格式:外部类名.内部类名.方法名();

案例:

public class Outer {int a = 6;static int b = 8;//静态内部类static class Inner {public void show1(){// 静态内部类可以直接访问外部类的静态变量System.out.println(b);// 如果访问外部类非静态,需要先创建外部类对象Outer o = new Outer();System.out.println(o.a);System.out.println("非静态的方法被调用了");}public static void show2(){System.out.println("静态的方法被调用了");}}
}
=====================================public class Test {public static void main(String[] args) {// 调用非静态方法需要,先创建对象,再用对象调Outer.Inner oi = new Outer.Inner();oi.show1();// 8 6 非静态的方法被调用了// 静态方法用类名直接调用Outer.Inner.show2();//调用内部类中的静态方法,用内部类名调也可以oi.show2();}
}

17.4局部内部类

  • 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。
  • 外界是无法直接使用局部内部类,需要在方法内部创建对象并使用。
  • 该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
public class Outer {int b = 20;public void show(){int a = 10;//局部内部类class Inner{String name;int age;public void method1(){System.out.println(a);System.out.println(b);System.out.println("局部内部类method1方法");}public static void method2(){System.out.println("局部内部类method2静态方法");}}//(在show方法中)创建局部内部类的对象Inner i = new Inner();System.out.println(i.name);System.out.println(i.age);i.method1();Inner.method2();}}
==============public class Test {public static void main(String[] args) {/*局部内部类1.将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。2.外界是无法直接使用局部内部类,需要在方法内部创建对象并使用。3.该类可以直接访问外部类的成员,也可以访问方法内的局部变量。*///调用show方法,让代码执行Outer o = new Outer();o.show();//输出:null 0 10 20 局部内部类method1方法 //     局部内部类method2静态方法}
}

17.5匿名内部类

使用场景:

  • 当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象。
  • 如果实现类只要使用一次,可以用匿名内部类简化代码。

17.5.1概述

匿名内部类本质就是隐藏了名字的内部类。

匿名内部类的格式:

此格式整体就是一个类的子类对象或者接口的实现类对象

new 类名或者接口名(){重写方法;
};如:new Animal(){@Overridepublic void eat() {System.out.println("重写了eat方法...");}};此格式包含三部分:继承(类)/实现(接口)      方法重写         创建对象实际上:
匿名内部类指的是:{重写方法;};而匿名内部类的对象指的是:new 类名或者接口名(){重写方法;};

以前:

//父类
public abstract class Animal {public abstract void eat();
}
============================================//子类public class Dog extends Animal{@Overridepublic void eat() {System.out.println("狗在吃东西...");}
}
============================================//测试类public static void main(String[] args) {/*
在测试类中调用下面的method方法?
以前的方式如何调用?
要自己写一个子类继承Animal类
再创建子类的对象,传递给method方法*///第一种方式调用methodDog dog = new Dog();method(dog);   //输出:狗在吃东西...//如果Dog类我只要用一次,那么还需要单独定义一个类太麻烦了。}//定义方法
public static void method(Animal a){//Animal a = 子对象 ->多态a.eat();//执行看左边,编译看右边}
}

现在:无需创建子类…

public abstract class Animal {public abstract void eat();
}
============================================public class Test {public static void main(String[] args) {method(new Animal() {@Overridepublic void eat() {System.out.println("小黑在吃东西...");}});}//定义方法public static void method(Animal a){a.eat();}
}

接口多态

public interface Swim {public abstract void swim();
}
===========================================public class Test02 {public static void main(String[] args) {//接口多态Swim s = new Swim() {@Overridepublic void swim() {System.out.println("重写swim接口的方法...");}};s.swim();}
}
public interface Swim {public abstract void swim();
}
===========================================public class Test02 {public static void main(String[] args) {//接口多态Swim s = new Swim() {@Overridepublic void swim() {System.out.println("重写swim接口的方法...");}};s.swim();}
}

相关文章:

Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)

文章目录 内部类17.1概述17.2成员内部类17.2.1 获取成员内部类对象17.2.2 成员内部类内存图 17.3静态内部类17.4局部内部类17.5匿名内部类17.5.1概述 内部类 17.1概述 写在一个类里面的类叫内部类,即 在一个类的里面再定义一个类。 如,A类的里面的定义B类&#x…...

操作系统笔记三

进程 把一个静态程序通过OS在内存中让cpu执行起来的动态执行过程叫进程 写代码都是用户态,而进程在执行过程中需要完成特定的功能,这些功能呢只有操作系统能提供,比如说读写文件,读写文件的过程是与硬盘打交道,这个过程…...

uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点

uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点 目录 介绍uniapp 介绍uniapp x 介绍功能框架图创建项目&发布组件/标签的变化js的变化css的变化工程结构和页面管理 pages.jsonmanifest.json 应用配置组件easycom组件规…...

基于微信小程序的商品展示+ssm(lw+演示+源码+运行)

商品展示系统 摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,微信小程序被用户普遍使用,为方…...

【Linux】常用指令(下)(内含more、less、 head、tail、date、find、grep、zip、tar以及学习笔记)

文章目录 前言1. more指令2. less指令(重要)3. head指令4. tail指令5. 管道(做到学会使用即可)6. date指令6.1 时间戳 7. cal指令8. find指令9. grep指令10. zip/unzip指令11. tar指令 前言 Linux下的常用指令终于要在本文落下帷…...

DesignMode__unity__抽象工厂模式在unity中的应用、用单例模式进行资源加载

目录 抽象工厂模式 思维导图 接口(抽象类) 工厂接口 抽象产品类 抽象武器接口 抽象人物接口 具体工厂和具体产品 具体工厂 (1)产品接口,生成具体人物 (2)武器接口,生成具体…...

Leetcode3289. 数字小镇中的捣蛋鬼

Every day a Leetcode 题目来源&#xff1a;3289. 数字小镇中的捣蛋鬼 解法1&#xff1a;哈希 代码&#xff1a; /** lc appleetcode.cn id3289 langcpp** [3289] 数字小镇中的捣蛋鬼*/// lc codestart class Solution { public:vector<int> getSneakyNumbers(vector…...

13_Python的高阶函数

高阶函数 高阶函数是Python编程中一个非常强大和有用的特性&#xff0c;它们允许程序员编写更简洁、更抽象的代码。 Python中的高阶函数是那些至少满足以下一个条件的函数&#xff1a; 接受一个或多个函数作为输入&#xff08;也就是说&#xff0c;它的参数之一是函数&#…...

清空当前机器所有Docker容器和镜像

sudo docker stop $(sudo docker ps -aq) sudo docker rm $(sudo docker ps -aq) sudo docker rmi $(sudo docker images -q)删除当前机器上的所有Docker镜像是一个高风险操作&#xff0c;因为它会删除所有镜像&#xff0c;包括那些可能正在被容器使用的镜像。在执行此操作之前…...

FreeRTOS学习——Systick中断、SVC中断、PendSV中断

FreeRTOS学习——接口宏portmacro.h&#xff0c;仅用于记录自己阅读与学习源码 FreeRTOS Kernel V10.5.1 port &#xff1a;GCC/ARM_CM7 文章目录 Systick源码触发方式 SVC源码触发方式 PendSV源码触发方式 相关汇编指令 Systick 源码 在Systick中断xPortSysTickHandler中&am…...

汇量科技大数据面试题及参考答案

如何在 SQL 中处理三个字段完全一样的去重?在 Scala 中又该如何实现? 在 SQL 中,可以使用多种方法来处理三个字段完全一样的去重。一种常见的方法是使用 DISTINCT 关键字结合多个字段来实现。例如,假设有表 table_name,包含字段 field1、field2 和 field3,可以使用以下 S…...

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.AVL树

1.AVL 树 1.1AVL 树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962…...

Python 的数据类型与操作

一、常用内置类型&#xff08;Built - in Types&#xff09; Python 拥有多种内置数据类型&#xff0c;这些类型满足了各种编程需求&#xff0c;从简单的数据存储到复杂的数据结构表示。 1. 数值类型&#xff08;Numeric Types&#xff09; 整数&#xff08;int&#xff09;&a…...

Python燃烧废气排放推断算法模型

&#x1f3af;要点 宏观能耗场景模型参数化输入数据&#xff0c;分析可视化输出结果&#xff0c;使用场景时间序列数据模型及定量和定性指标使用线图和箱线图、饼图、散点图、堆积条形图、桑基图等可视化模型输出结果根据气体排放过程得出其时间序列关系&#xff0c;使用推断模…...

Qt中多语言的操作(以QtCreator为例)

1、首先&#xff0c;我们在代码中与文本相关的且需要支持多语言的地方&#xff0c;用tr来包含多语言key&#xff08;多语言key是我们自己定义的&#xff09;&#xff0c;如下 //举例 QPushButton* btnnew QPushButton(this); btn->move(20,20); btn->resize(100,50); //…...

计算机毕业设计 社区医疗服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

html+css学习

html 元素 html元素是HTML的根元素&#xff0c;一个文档只能有一个&#xff0c;其他所有元素都是其后代元素 html有一个属性为lang&#xff0c;其作用是&#xff1a; 帮助语言合成工具确定要使用的发音帮助翻译工具确定要使用的翻译规则 当属性lang“en”则表示告诉其浏览器…...

2.gitlab ce 细粒度的权限控制

需求&#xff1a; 在提交merge reqeust时&#xff0c;必须指定审核人&#xff0c;并且要选审核人清单里的 有个code owners应该可以做到&#xff08;gitlab ce应该也可以用&#xff09; 下面是参考的文档 细粒度的代码权限怎么做&#xff1f;极狐GitLab 代码所有者来帮忙 -…...

G - Merchant Takahashi / F - Useless for LIS

G - Merchant Takahashi 首先考虑暴力 DP。 设最后一步走到编号 ii 的城镇的方案的最大收益为 fifi​&#xff0c;则每次集市相当于是 fTi←fj−C∣Ti−j∣Pi&#xff08;1≤j≤n&#xff09;。 这样每次可以通过枚举 j 来转移&#xff0c;这样总时间复杂度是 O(nm) 的&…...

自然语言处理实例

引子:基于聊天机器人项目的自然语言处理(NLP)学习路线 自然语言处理(Natural Language Processing,简称 NLP)是人工智能的重要分支,旨在帮助计算机理解、生成和处理人类语言。NLP 技术广泛应用于搜索引擎、机器翻译、语音识别、文本摘要、情感分析、对话系统等领域。为…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...