Java面向对象之内部类的几类使用场景
介绍
Java内部类是一种特殊的类,它定义在另一个类的内部。内部类提供了许多有用的特性,包括访问外部类的私有成员、隐藏实现细节以及实现回调接口等。以下是Java内部类的一些常用场景及其举例说明:
回调接口
当某个类需要一个对象来执行其方法时,通常可以使用回调接口。这时,内部类可以作为一个匿名实现类,简化代码。
在这个例子中,ActionListener是一个回调接口,Button类通过ActionListener来执行某个动作。在Main类中,我们使用了一个匿名内部类来实现ActionListener接口。
interface ActionListener {
void actionPerformed();
}
class Button {
private ActionListener listener;
public void setActionListener(ActionListener listener) {
this.listener = listener;
}
public void click() {
if (listener != null) {
listener.actionPerformed();
}
}
}
public class Main {
public static void main(String[] args) {
Button button = new Button();
button.setActionListener(new ActionListener() {
@Override
public void actionPerformed() {
System.out.println("Button clicked!");
}
});
button.click();
}
}
访问外部类的私有成员
内部类可以访问外部类的私有成员,这使得内部类成为了一种封装和隐藏实现细节的有效手段。在这个例子中,Inner类可以访问Outer类的私有成员secret。
class Outer {
private int secret = 42;
class Inner {
void revealSecret() {
System.out.println("The secret is: " + secret);
}
}
public Inner getInner() {
return new Inner();
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.getInner();
inner.revealSecret(); // 输出 "The secret is: 42"
}
}
实现多继承
Java不支持多继承,但内部类可以帮助我们实现类似的效果。
interface A {
void methodA();
}
interface B {
void methodB();
}
class MyClass implements A {
private class InnerB implements B {
@Override
public void methodB() {
System.out.println("Method B from InnerB");
}
}
private InnerB innerB = new InnerB();
@Override
public void methodA() {
System.out.println("Method A from MyClass");
}
public void methodB() {
innerB.methodB();
}
}
public class Main {
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.methodA(); // 输出 "Method A from MyClass"
myClass.methodB(); // 输出 "Method B from InnerB"
}
}
在这个例子中,MyClass实现了接口A,并通过内部类InnerB实现了接口B。这样,MyClass就具有了A和B两个接口的行为。
数据隐藏
内部类可以将实现细节隐藏在外部类内部,从而提供一个更简洁、更易于使用的API。
class DataHolder {
private int data;
public DataHolder(int data) {
this.data = data;
}
class DataProcessor {
void processData() {
// 在这里可以对data进行复杂的处理
System.out.println("Processed data: " + data);
}
}
public DataProcessor getProcessor() {
return new DataProcessor();
}
}
public class Main {
public static void main(String[] args) {
DataHolder holder = new DataHolder(42);
DataHolder.DataProcessor processor = holder.getProcessor();
processor.processData(); // 输出 "Processed data: 42"
}
}
在这个例子中,DataProcessor内部类隐藏了对data的处理细节,外部类只需要调用getProcessor()方法即可。
总之,Java内部类在回调接口、访问外部类私有成员、实现多继承和数据隐藏等场景中非常有用。
Java面向对象之内部类的几类使用场景的更多相关文章
- Java面向对象之内部类(访问格式)
一.基础概念 1.内部类是定义在类中的类.A类需要直接访问B类中的成员时,可以将A类定义到B类中,作为B类的内部类存在. 2.内部类可以相当于外部类中的一个成员,可以被成员修饰符所修饰.(如:publ ...
- Java面向对象之内部类
内部类 内部类:在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对于B类来说就是外部类了. 1.成员内部类 2.静态内部类 3.局部内部类 4.匿名内部 ...
- Java面向对象之内部类(匿名内部类)
一.基础概念 匿名内部类:简化书写的内部类.其实匿名内部类就是一个子类对象. 前提:内部类需要继承或者实现外部的类或者接口. 格式:new 父类或者接口(){定义子类的内容} 二.将内部类定义到局部的 ...
- JAVA基础之内部类
JAVA基础之内部类 2017-01-13 1.java中的内部类都有什么?! 成员内部类 局部内部类 匿名内部类 静态内部类 2.内部类详解 •成员内部类 在一个类的内部再创建一个类,成为内部类 1 ...
- java 面向对象(一):类与对象
1.面向对象学习的三条主线: * 1.Java类及类的成员:属性.方法.构造器:代码块.内部类 * * 2.面向对象的大特征:封装性.继承性.多态性.(抽象性) * * 3.其它关键字:this.su ...
- C++之内部类(嵌套类)与外部类及友元
本人能力.精力有限,所言所感都基于自身的实践和有限的阅读.查阅,如有错误,欢迎拍砖,敬请赐教——博客园:钱智慧. 先上代码: class Outer { public: Outer(){m_outer ...
- 【转】C++之内部类(嵌套类)与外部类及友元
[转]http://baike.baidu.com/link?url=Md223wQoT5s-3cZ5xRnj1pGmvm310DKAuh-HDrcEdc2l24rwobHrdEc_Mi4Z3BGP0 ...
- java学习面向对象之内部类
什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中. 那么内部类都有什么特点呢? 1.内部类可以访问包裹他的类的成员. 2.如果包裹他的类想访问被其包裹的类的话就得实例 ...
- 黑马程序员——JAVA基础之内部类,匿名内部类
------- android培训.java培训.期待与您交流! ---------- 内部类 将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类). 内部类访问特点: • 内部 ...
- Java面向对象(Eclipse高级、类与接口作为参数返回值)
面向对象 今日内容介绍 u Eclipse常用快捷键操作 u Eclipse文档注释导出帮助文档 u Eclipse项目的jar包导出与使用jar包 u 不同修饰符混合使用细节 u 辨析何时定义变 ...
随机推荐
- [转帖]总结:nginx502:Tomcat调优之acceptCount
问题背景:UI页面点击会偶尔返回error,检查调用日志,发现nginx报502报错,因此本文即排查502报错原因. 如下红框可知,访问本机个备机的服务502了,用时3秒左右(可见并不是超时) 先给出 ...
- UnixBench的简单测试与验证
UnixBench的简单测试与验证 目标 飞腾2000+ (物理机和虚拟机) Intel Golden 6170 物理机 Intel Golden 5218 虚拟机 Gold 5218 CPU @ 2 ...
- Unity下调试ToLua(基于IDEA和VSCode)
公司移动端项目是基于Unity的,底层支持由C#提供,上层Lua调用C#中注册的函数支持来做业务逻辑,框架用的是ToLua.开始做移动端有一段时间了,一直都觉得调试代码是个很蛋疼的体验:几乎都是靠肉眼 ...
- 【DP】DMOPC '21 Contest 8 P5 - Tree Building
Problem Link 给定 \(n,m\) 和一个长为 \(m\) 的代价序列,对于一棵 \(n\) 个节点,每个节点度数不超过 \(m\) 的树,定义它的代价为 \(\sum\limits_{i ...
- 如何写RN样式 如何写RN组件 如何满屏 如何使用变量
app.js 文本水平居中了哈 控制文本的大小 字体颜色等 只有在文本元素上去控制哈 import React from 'react'; import {View, Text, StyleSheet ...
- 西门子PLC高校作业以及创新项目
抢答器 在主持人按下启动按钮,3秒内
- PGL图学习项目合集&数据集分享&技术归纳业务落地技巧[系列十]
PGL图学习项目合集&数据集分享&技术归纳业务落地技巧[系列十] 1.PGL图学习项目合集 1.1 关于图计算&图学习的基础知识概览:前置知识点学习(PGL)[系列一] :ht ...
- Python xlwt数据保存到 Excel中以及xlrd读取excel文件画图
1.方法一:xlwt 1.1 安装包 pip install xlwt 1.2 保存数据到 Excel import xlwt import numpy as np import random # 新 ...
- 《Spring 手撸专栏》| 开篇介绍,我要带新人撸 Spring 啦!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 不正经!写写面经,去撸Spring源码啦? 是的,在写了4篇关于Spring核心源码 ...
- 详细了解Transformer:Attention Is All You Need
1. 背景 在机器翻译任务下,RNN.LSTM.GRU等序列模型在NLP中取得了巨大的成功,但是这些模型的训练是通常沿着输入和输出序列的符号位置进行计算的顺序计算,无法并行. 文中提出了名为Trans ...