【JavaSE】Java基础语法(二十一):内部类

news2024/11/24 17:20:40

文章目录

  • 1. 内部类的基本使用
  • 2. 成员内部类
  • 3. 局部内部类
  • 4. 匿名内部类
  • 5. 匿名内部类在开发中的使用(应用)



在这里插入图片描述


1. 内部类的基本使用

  • 内部类概念

    • 在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类
  • 内部类定义格式

    • 格式&举例:
/*
	格式:
	class 外部类名{
		修饰符 class 内部类名{
		}
	}
*/

class Outer {
	public class Inner {
	}
}
  • 内部类的访问特点

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

/*
	内部类访问特点:
	内部类可以直接访问外部类的成员,包括私有
	外部类要访问内部类的成员,必须创建对象
*/
public class Outer {
	private int num = 10;
	
	public class Inner {
		public void show() {
			System.out.println(num);
		}
	}
	
	public void method() {
		Inner i = new Inner();
		i.show();
	}
}

2. 成员内部类

  • 成员内部类的定义位置
    • 在类中方法,跟成员变量是一个位置
  • 外界创建成员内部类格式
    • 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
    • 举例:Outer.Inner oi = new Outer().new Inner();
  • 私有成员内部类
    • 将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。
    • 示例代码:
class Outer {
	private int num = 10;
	private class Inner {
		public void show() {
			System.out.println(num);
		}
	}
	
	public void method() {
		Inner i = new Inner();
		i.show();
	}
}

public class InnerDemo {
	public static void main(String[] args) {
		//Outer.Inner oi = new Outer().new Inner();
		//oi.show();
		Outer o = new Outer();
		o.method();
	}
}
  • 静态成员内部类
    • 静态成员内部类访问格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
    • 静态成员内部类中的静态方法:外部类名.内部类名.方法名();
    • 示例代码
class Outer {
	static class Inner {
	public void show(){
		System.out.println("inner..show");
	}
	
	public static void method(){
		System.out.println("inner..method");
	}
	}
}

public class Test3Innerclass {
	/*
		静态成员内部类演示
	*/
	public static void main(String[] args) {
		// 外部类名.内部类名 对象名 = new 外部类名.内部类名();
		Outer.Inner oi = new Outer.Inner();
		oi.show();
		Outer.Inner.method();
	}
}

3. 局部内部类

  • 局部内部类定义位置
    • 局部内部类是在方法中定义的类
  • 局部内部类方式方式
    • 局部内部类,外界是无法直接使用,需要在方法内部创建对象并使用
    • 该类可以直接访问外部类的成员,也可以访问方法内的局部变量
  • 示例代码
class Outer {
	private int num = 10;
	public void method() {
		int num2 = 20;
		class Inner {
			public void show() {
				System.out.println(num);
				System.out.println(num2);
			}
		}
		
		Inner i = new Inner();
		i.show();
	}
}

public class OuterDemo {
	public static void main(String[] args) {
		Outer o = new Outer();
		o.method();
	}
}

4. 匿名内部类

  • 匿名内部类的前提
    • 存在一个类或者接口,这里的类可以是具体类也可以是抽象类
  • 匿名内部类的格式
    • 格式:new 类名 ( ) { 重写方法 } new 接口名 ( ) { 重写方法 }
    • 举例:
new Inter(){
	@Override
	public void method(){}
}
  • 匿名内部类的本质
    • 本质:是一个继承了该类或者实现了该接口的子类匿名对象
  • 匿名内部类的细节
    • 匿名内部类可以通过多态的形式接受
    Inter i = new Inter(){
    	@Override
    		public void method(){
    	}
    }
    
  • 匿名内部类直接调用方法
interface Inter{
	void method();
}

class Test{
	public static void main(String[] args){
		new Inter(){
			@Override
			public void method(){
				System.out.println("我是匿名内部类");
			}
		}.method(); // 直接调用方法
	}
}

5. 匿名内部类在开发中的使用(应用)

  • 匿名内部类在开发中的使用
    • 当发现某个方法需要,接口或抽象类的子类对象,我们就可以传递一个匿名内部类过去,来简化传统的代码
  • 示例代码:
/*
游泳接口
*/
interface Swimming {
void swim();
}

public class TestSwimming {
	public static void main(String[] args) {
		goSwimming(new Swimming() {
		@Override
		public void swim() {
			System.out.println("铁汁, 我们去游泳吧");
		}
		});
	}
	
	/**
	* 使用接口的方法
	*/
	public static void goSwimming(Swimming swimming){
		/*
		Swimming swim = new Swimming() {
			@Override
			public void swim() {
				System.out.println("铁汁, 我们去游泳吧");
			}
		}
		*/
		swimming.swim();
	}
}

在这里插入图片描述

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

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

相关文章

YOLOv8目标检测实战:Android手机部署 (视频课程)

课程链接:https://edu.csdn.net/course/detail/38595 YOLOv8 目标检测基于先前 YOLO 版本的成功,引入了新功能和改进,进一步提升了性能和灵活性。 本课程在Windows上手把手演示YOLOv8(YOLOv8n和YOLOv8s)目标检测在An…

jvm 分析调优工具-学习笔记

jvm 分析调优工具 jps命令查看java进程pid jps 列出java进程名(不完整类名) 和pid jps -l 列出java进程名(完整类名) 和pid jmap命令查看java进程占用的jvm资源情况 jmap -histo pid 查看内存情况 jmap -heap pid 查看java程序的堆占用信息 jmap -dump 导出heap快照分析文件he…

22 VueComponent 响应式处理

前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 测试用例 测试用例如下, 一个简单的 按钮事件的触发 问题的调试 数据…

老macbook升级新版本(Big sur、Monterey)

老macbook升级新版本(Big sur、Monterey) 一、前期须知以及准备1.摘要2.设备3.升级方法3.前期准备 二、引导U盘的搭建1.下载安装程序2.U盘格式问题3.下载系统镜像并写入U盘 三、系统安装结束语 一、前期须知以及准备 1.摘要 对于老版本的macbook一系列…

代码随想录训练营Day53| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划

目录 学习目标 学习内容 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划 学习目标 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划 学习内容 1143.最长公共子序列 1143. 最长公共子序列 - 力扣(LeetCode)ht…

PS磨皮插件免费电脑版Portraiture4.03下载及使用教程

Portraiture是一款智能磨皮插件,为Photoshop和Lightroom添加一键磨皮美化功能,快速对照片中皮肤、头发、眉毛等部位进行美化,Portraiture 4用于人像图片润色,磨皮等,减少了人工选择图像区域的重复劳动。它能智能地对图…

chatgpt赋能python:如何在Python中输入字符

如何在Python中输入字符 Python是一种非常流行的编程语言,它被广泛应用于各种领域,包括Web开发、人工智能、数据分析、科学计算等。在Python中输入字符是一项基本的操作,本文将介绍常见的输入字符方式以及注意事项。 使用input()函数输入字…

[数据结构] AVL树的插入旋转 和 概念理解

文章目录 定义 && 性质定义性质 实现思路架构节点AVL树框架Insert(插入)左单旋右单旋左右双旋右左双旋 定义 && 性质 定义 二叉搜索树虽可以缩短查找的效率,但 如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c…

初学Qt(Day04)

今日目标 创建一个类似游戏手柄的窗口,每次鼠标点击拖动手柄,在qt开发界面输出坐标,每当松开鼠标,手柄自动复位。 目标是实现类似下面这种 先说结论(免得我又忘记了):没写完,是一…

Makefile基础教学(include的使用方法)

文章目录 前言一、include在makefile中的概念介绍二、include使用示例三、include中需要注意的一些操作1. 在include前加-选项2. include触发规则创建了文件会发生什么3. include包含的文件夹存在 总结 前言 本篇文章将讲解include的使用方法,在C语言中使用include…

chatgpt赋能python:Python与SEO的奇妙关系

Python与SEO的奇妙关系 SEO(Search Engine Optimization),中文翻译为搜索引擎优化,是指通过对网站进行各种技术和内容方面的优化,来提升网站在搜索引擎自然排名中的位置,进而吸引更多的潜在客户。而Python语言,则成为…

jQuery-attr()、val()、add()属性和each函数

<!DOCTYPE HTML> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>jQuery-attr()、add()属性和each函数</title> <script type"text/j…

[数据集][目标检测]数据集VOC格式绝缘子缺陷检测数据集VOC-4086张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;4086 标注数量(xml文件个数)&#xff1a;4086 标注类别数&#xff1a;3 标注类别名称:["jueyuanzi",&…

25 VueComponent 的生命周期

前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 测试用例 测试用例如下, 一个简单的 按钮事件的触发 问题的调试 这里…

Linux——网络套接字3|Tcp客户端编写②

根据我们前面写的服务器,server端需要绑定,而client要不要bind呢? 不需要,因为客户端一旦和一个非常具体的端口号绑定,可能会导致端口号绑定多个客户端,因此可能会出现某个客户端无法启动。而服务器需要明确的端口号,因为服务器面对的是众多的客户端,服务器端口号一旦被…

c++ 11标准模板(STL) std::map(五)

定义于头文件<map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class map;(1)namespace pmr { template <class Key, class T, clas…

ros学习

1创建工作空间 catkin_init_workspace 将文件夹初始化成ros文件 编译工作空间catkin_make vi ~/.bashrc 加入环境变量bashrc一下在任何终端都生效 catkin_create_pkg learning_communication通讯机制 std_msgs数据结构 rospy roscpp catkin_create_pkg mbot_description ur…

雅思备考经验!阅读 8.5,听力 8.5!

成绩单 先上热乎乎的成绩单截图&#xff08;2023.5.19 考试&#xff09;&#xff0c;偏科选手出来挨打&#xff01;好在小分都达到了要求~ 英语基础 大概是两三年前考过托福和 GRE&#xff0c;成绩过期了没办法&#xff0c;只能重考&#xff0c;这次试试雅思。 雅思和托福的…

14-Vue技术栈之Vue3快速上手

目录 1.Vue3简介2. Vue3带来了什么2.1 性能的提升2.2 源码的升级2.3 拥抱TypeScript2.4 新的特性 1、海贼王&#xff0c;我当定了&#xff01;——路飞 2、人&#xff0c;最重要的是“心”啊&#xff01;——山治 3、如果放弃&#xff0c;我将终身遗憾。——路飞 4、人的梦想是…

【软考系统规划与管理师笔记】第3篇 信息技术知识2

目录 1 计算机网络 1.1网络技术标准、协议与应用 Internet技术及应用 2 标识技术 域名系统和统一资源定位器 3 网络分类、组网和接入技术 3.1 网络分类 3.2 网络交换技术 3.3 网络接入技术 3.4 无线网络技术 4 网络服务器和网络存储技术 4.1 服务器 4.2 网络存储技…