java的四种内部类,从0讲清楚

什么是内部类?

为什么要学习内部类?

可以发现,发动机虽然跟汽车相关,但发动机不像车龄或颜色一样,只用一个变量就可以描述,而是要有发动机品牌,发动机年限,多个变量描述发动机。那么这样写Car类是不合适的

所以要用上内部类描述发动机

内部类的访问特点

1.内部类可以直接访问外部类,包括私有

2.外部类要访问内部类,必须创建对象

这里的this指针用法要复习一下,

如果Car.this没写,this.carName直接写成carName也是没错的,因为就算不写编译器也会自动添加this关键字。这个过程被称为隐式引用。

内部类的分类

成员内部类

举个例子

可以看到,我们把内部类理解当成成员属性就好了。

1.成员内部类的修饰符

着重介绍一个,private修饰成员内部类,怎么理解呢?

把他当成成员变量一样就好了。即只能在类内(Car类里)访问,只能在外部类内实例化对象(比如说第二个红框的位置),外部类以外是操作不到的

那如果用static修饰成员内部类呢?实际上这就叫静态内部类了,后面会介绍

2.获取成员内部类的对象

实例化方法1:

class Outer{class Inner{;}}public class Main {public static void main(String[] args) {Outer o = new Outer();Outer.Inner io1 = o.new Inner();//可以简写成这样Outer.Inner io2 = new Outer().new Inner();}
}

实例化方法2:

如果成员内部类是私有的,外部就访问不到了,就不能用方法1来实例化对象

要怎么改呢?写一个对外提供内部类的方法

class Outer{private class Inner{;}public Inner getInner() {//对外提供Innerreturn new Inner();}}

如何接收呢?

这样是错的

下面是对的

或者直接使用也可以。此处打印的是地址

静态内部类

1)注意:静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的,需要创建对象。

2)创建静态内部类的格式:外部类名.内部类名 对象名 = new 外部类名.内部类名()。因为是静态的,所以就不用先创建一个外部类对象,再创建内部类。

如何调用静态内部类中的方法?

3)调用非静态方法的格式:先创建内部类的对象,用对象调用

4)调用静态方法的格式:外部类名.内部类名.方法名()

只要是静态的东西,都可以用类名点直接获取!

对于(1)

class Outer{int a = 10;static int b = 20;static class Inner{public void show1() {System.out.println(new Outer().a);//此时是报错的,因为不能直接访问非静态的变量System.out.println(b);//但是b可以,因为b是静态的}static public void show2() {System.out.println(new Outer().a);System.out.println(b);}}}public class Main {public static void main(String[] args){Outer o = new Outer();Outer.Inner io = new Outer.Inner();io.show1();Outer.Inner.show2();}}

局部内部类

1)将内部类定义在方法里就叫局部内部类,类似与方法里的局部变量

2)外界是无法直接使用的,要在方法内部创建并调用。

3)该类可以直接访问外部类的成员,也可以访问方法内的局部变量

class Outer{int a = 10;void show() {int b = 20;class Inner{//注意!把局部内部类当成局部变量就行了!//public等修饰符不能修饰局部变量,那么也不能修饰局部内部类public void test1() {System.out.println(a);System.out.println(b);}}Inner i = new Inner();i.test1();}}public class Main {public static void main(String[] args){Outer o = new Outer();o.show();}}

匿名内部类

怎么写匿名内部类?

interface Swim{public void swim();
}abstract class Animal{abstract void eat();
}public class Solve {public static void main(String[] args) {//编写匿名内部类代码new Swim(){//Swim是接口,这里是实现关系public void swim() {System.out.println("重写swim");}};new Animal() {//Animal是类,这里是继承关系@Overridevoid eat() {// TODO Auto-generated method stubSystem.out.println("重写eat");}};}}

进一步了解什么是匿名内部类

实际上,红圈内的内容才是匿名内部类,因为它是没有名字的。

而蓝圈在做的是是创建一个匿名内部类

为什么要学习匿名内部类?


class Animal{void shout() {}
}
class Dog extends Animal{@Overridevoid shout() {// TODO Auto-generated method stubSystem.out.println("dog is barking");}}public class Main {public static void method(Animal a) {//多态a.shout();}public static void main(String[] args){//假设我们现在要调用method函数实现dog的行为,该怎么办呢?//以前的方法://创建一个狗的类,实例化一个狗的类,类内重写方法Dog d = new Dog();method(d);//以前的方法有点麻烦,因为如果我们只需要使用一次dog,那么单独再写一个Dog类就太麻烦了//所以可以用匿名内部类,用完一次就丢。//跟以前的办法相比,这个只要重写并创建匿名对象就行了method(new Animal(){void shout() {System.out.println("dog2 is barking");}});}
}

匿名内部类的一些实用小技巧

1.创建的对象可以被接收

class Animal{void shout() {}
}public class Main {public static void method(Animal a) {//多态a.shout();}public static void main(String[] args){//我们知道,new Animal()其实是创建对象的过程,只不过是匿名的//那么我们可不可以用一个对象来接收呢?可以!//那这样有什么好处呢?//这样我们就不用单独再写一个Dog类,省去了不必要的类,//而且调用比上一段代码更灵活(个人感觉)Animal a =  new Animal(){//注意,因为经过重写,所以实际上是创建了一个子类的对象//但这里用父类的对象接收,所以这里也是多态!void shout() {System.out.println("dog is barking");}};method(a);method(a);method(a);//...//想用几次就用几次,代码比上一段简洁一些}
}

2.直接调用方法

public class Main {public static void main(String[] args){	new Animal(){void shout() {System.out.println("dog is barking");}}.shout();//还可以这样去调用方法}
}

小结

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

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

相关文章

测试面经1203

测试面经1203 4. 什么是黑盒测试5. 除了黑盒测试还有其他的测试吗?6. 灰盒测试是谁来进行的?7. 使用Excel表格设计测试用例,使用Excel表格有什么优势呢?Xmind优势Xmind劣势 12. 测试需求怎么分析?13. 黑盒测试都有哪些…

MATLAB 自抗扰控制 - Active Disturbance Rejection Control

系列文章目录 MATLAB 模型参考自适应控制 - Model Reference Adaptive Control 文章目录 系列文章目录前言一、控制器结构1.1 一阶逼近1.2 二阶逼近 二、指定控制器参数参考 前言 自抗扰控制 (ADRC) 是一种无模型控制方法,适用于为具有未知动态特性以及内部和外部…

利用vue3SeamlessScroll简单实现列表的无限循环滚动

1、安装 yarn add vue3-seamless-scroll2、导入及基本使用 <!--组件.vue--> <script setup>import { Vue3SeamlessScroll } from vue3-seamless-scroll;import {ref} from vue//vue3导入组件是不需要用component注册的//导入完成后如果项目本身是在运行的记得重新…

Azure Machine Learning - 使用 Azure SDK 进行全文搜索

了解如何使用 Azure SDK 中的 Azure.Search.Documents 客户端库创建、加载和查询使用示例数据的搜索索引&#xff0c;实现全文搜索。 全文搜索使用 Apache Lucene 进行索引和查询&#xff0c;使用 BM25 排名算法对结果进行评分。 关注TechLead&#xff0c;分享AI全维度知识。作…

【Spring Boot 源码学习】ApplicationContextInitializer 详解

Spring Boot 源码学习系列 ApplicationContextInitializer 详解 引言往期内容主要内容1. 初识 ApplicationContextInitializer2. 加载 ApplicationContextInitializer3. ApplicationContextInitializer 的初始化 总结 引言 书接前文《初识 SpringApplication》&#xff0c;我们…

ubuntu18编译Android8的Failed to contact Jack server问题

环境 ubuntu18.04 Android8.1.0 步骤 安装环境 apt install git-core apt install gnupg apt install flex apt install bison apt install gperf apt install build-essential apt install curl apt install libc6-dev apt install libssl-dev apt install libncurses5-dev:…

【傻瓜级JS-DLL-WINCC-PLC交互】6.​向PLC里面装载数据变量

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…

使用String.valueOf()的坑

说明&#xff1a;记录一次使用String.valueOf()的坑&#xff0c;以下是一段有问题的代码&#xff1a; String count String.valueOf(listData.get(0).get(0).get("count");if (StringUtils.isBlank(count) || "0".equals(count)) {result.setResult(page)…

【bat】批处理脚本大全

目录 1.概述 2.变量 3.运算符 3.2.重定向运算符 3.3.多命名运算符 3.4.管道运算符 4.命令 4.1.基本命令 4.2.参数传递 4.3.查看脚本内容 4.4.注释 4.5.日期和时间 4.6.启动脚本 4.7.调用其他bat 4.8.任务管理 4.8.1.任务列表查看 4.8.2.任务终止 4.9.文件夹 …

react-native实践日记--3.ui-kitten中的button设置字体颜色无效

react-native搭建App&#xff0c;UI框架采用ui-kitten&#xff0c;遇到其中的button组件设置字体颜色无效&#xff0c;一直都是白色 设置button的style和textStyle更改字体颜色&#xff0c;一直都是不起作用 <Buttonstyle{[styles.dateBtn,{flexDirection: row-reverse,fle…

Vue经典面试题源码级分析【一】

01-Vue组件通信方式有哪些 父子组件 &#xff1a; props/ emit/ $parent / ref / $attrs $attrs: https://cn.vuejs.org/api/component-instance.html#attrs 兄弟组件&#xff1a;$parent / $root / eventbus / vuex跨层级关系&#xff1a;eventbus / vuex / provide inject 父…

美容院管理系统服务预约会员小程序效果如何

美容院在美业场景中需求度较高&#xff0c;尤其女性爱美悦己消费逐年增加&#xff0c;如清洁焕肤、祛皱抗衰、激光脱毛等美容项目都有不少需求者。 互联网深入美业行业多年&#xff0c;传统线下经营模式已经很难满足当今客户消费流程&#xff0c;如品牌寻找、服务预约、到店、…

Effective Java解读

Effective Java 第一章 引言第二章 创建和销毁对象第1条&#xff1a;用静态工厂方法代替构造器第2条&#xff1a;遇到多个构造器参数时要考虑使用构建器第3条&#xff1a;用私有构造器或者枚举类型强化Singletion属性第4条&#xff1a;通过私有构造器强化不可实例化的能力第5条…

pandas基础操作2

数据读取 我们想要使用 Pandas 来分析数据&#xff0c;那么首先需要读取数据。大多数情况下&#xff0c;数据都来源于外部的数据文件或者数据库。Pandas 提供了一系列的方法来读取外部数据&#xff0c;非常全面。下面&#xff0c;我们以最常用的 CSV 数据文件为例进行介绍。 …

【LeetCode:1423. 可获得的最大点数 | 滑动窗口】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

微前端实战:打造高效、灵活的前端应用架构

文章目录 一、微前端简介二、微前端的优势1. 高度模块化2. 独立部署3. 易于扩展4. 技术栈无关5. 独立升级 三、微前端的原理四、微前端案例思路《微前端实战》编辑推荐内容简介作者简介目录前言/序言 随着互联网行业的快速发展&#xff0c;前端应用的规模和复杂度也在不断增加。…

windows11 调整鼠标灵敏度方法

首先 我们打开电脑设置 或者在 此电脑/此计算机/我的电脑 右击选择属性 然后 有的电脑 左侧菜单中 直接就有 设备 然后在设备中直接就可以找到 鼠标 选项 调整光标速度即可 如果操作系统和我的一样 可以直接搜索鼠标 然后 选择 鼠标设置 然后 调整上面的鼠标指针速度即可

论文解读--Robust lane detection and tracking with Ransac and Kalman filter

使用随机采样一致性和卡尔曼滤波的鲁棒的车道线跟踪 摘要 在之前的一篇论文中&#xff0c;我们描述了一种使用霍夫变换和迭代匹配滤波器的简单的车道检测方法[1]。本文扩展了这项工作&#xff0c;通过结合逆透视映射来创建道路的鸟瞰视图&#xff0c;应用随机样本共识来帮助消…

网络编程之套接字

端口 && IP 在学习套接字编程之前&#xff0c;我们必须了解一下前缀知识。首先是IP和端口的作用。 在这之前&#xff0c;我们要明白一件事。那就是把数据从一台主机发送到另一台主机&#xff0c;是目的吗&#xff1f;&#xff1f;&#xff1f;当然不是&#xff01;&a…

qt-C++笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解

qt-C笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解 文章目录 qt-C笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解1.示例运行2.event->pos();详解3.event->pos()的坐标系原点4.Qt中的坐标系详解5.QMainWindow::mousePressEvent(event);详解 1.示例运行 截图时鼠…