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 辨析何时定义变 ...
随机推荐
- [转帖]使用 Crash 工具分析 Linux dump 文件
前言 Linux 内核(以下简称内核)是一个不与特定进程相关的功能集合,内核的代码很难轻易的在调试器中执行和跟踪.开发者认为,内核如果发生了错误,就不应该继续运行.因此内核发生错误时,它的行为通常被设 ...
- CentOS7 和 CentOS8 安装 rusers-server 然后使用LR 实时监控Linux主机性能的办法
LR 能够通过RPC 的工具 实时获取 被压测机器的 性能表现 但是需要安装几个组件. CentOS6 时期比较简单 可以通过网上 下载rstatd 的tar 包离线安装即可 但是发现CentOS7 ...
- MYSQL 简单验证
建立测试表 create table test001 (a varchar(2000),b varchar(2000),c varchar(2000),d varchar(2000),e varcha ...
- elementUI自定义单选框内容
<template> <div> <div class="heng-div"> <el-radio v-model="radio ...
- net core部署iis执行此操作时出错web.config
页面访问会报服务器内部错误,你点对应的IIS下的默认页面或模块会出现下面的错语. 请到官网下载对应的运行时:https://www.microsoft.com/net/download 如果是服务器, ...
- Go基础之指针
Go语言中的指针 目录 Go语言中的指针 一.Go语言中的指针介绍 1.1 指针介绍 1.2 基本语法 1.3 声明和初始化 1.4 Go 指针的3个重要概念 1.4.1 指针地址(Pointer A ...
- Git的使用(二):远程仓库
在github上创建远程仓库 本地创建Git仓库适合自己一个人完成工程,但是实际情况中我们需要其他人来协作开发,此时就可以把本地仓库同步到远程仓库,同时还增加了本地仓库的一个备份.常用的远程仓库就是g ...
- Flask 框架:实现简单API测试接口
通过使用Python中Flask框架实现一个简单的API接口程序,用户可发送JSON格式的请求,服务器响应请求,并以JSON格式将数据返回给用户,此处代码是一个模板可以测试接口时使用. Flask代码 ...
- 关于React-Router6 (React 路由)
一.概要 (1)每个单页应用其实是一系列的 JS 文件,当用户请求网站时,网站返回一整个(或一系列)的 js 文件和 HTML,而当用户在某个页面内点击时,你需要告诉浏览器怎么加载另一个页面地址.单页 ...
- 大数据技术之DataX
一.DataX简介 DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.ODPS.HBase.FTP等各种异构数据源之 ...