介绍

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面向对象之内部类的几类使用场景的更多相关文章

  1. Java面向对象之内部类(访问格式)

    一.基础概念 1.内部类是定义在类中的类.A类需要直接访问B类中的成员时,可以将A类定义到B类中,作为B类的内部类存在. 2.内部类可以相当于外部类中的一个成员,可以被成员修饰符所修饰.(如:publ ...

  2. Java面向对象之内部类

    内部类 内部类:在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对于B类来说就是外部类了. 1.成员内部类 2.静态内部类 3.局部内部类 4.匿名内部 ...

  3. Java面向对象之内部类(匿名内部类)

    一.基础概念 匿名内部类:简化书写的内部类.其实匿名内部类就是一个子类对象. 前提:内部类需要继承或者实现外部的类或者接口. 格式:new 父类或者接口(){定义子类的内容} 二.将内部类定义到局部的 ...

  4. JAVA基础之内部类

    JAVA基础之内部类 2017-01-13 1.java中的内部类都有什么?! 成员内部类 局部内部类 匿名内部类 静态内部类 2.内部类详解 •成员内部类 在一个类的内部再创建一个类,成为内部类 1 ...

  5. java 面向对象(一):类与对象

    1.面向对象学习的三条主线: * 1.Java类及类的成员:属性.方法.构造器:代码块.内部类 * * 2.面向对象的大特征:封装性.继承性.多态性.(抽象性) * * 3.其它关键字:this.su ...

  6. C++之内部类(嵌套类)与外部类及友元

    本人能力.精力有限,所言所感都基于自身的实践和有限的阅读.查阅,如有错误,欢迎拍砖,敬请赐教——博客园:钱智慧. 先上代码: class Outer { public: Outer(){m_outer ...

  7. 【转】C++之内部类(嵌套类)与外部类及友元

    [转]http://baike.baidu.com/link?url=Md223wQoT5s-3cZ5xRnj1pGmvm310DKAuh-HDrcEdc2l24rwobHrdEc_Mi4Z3BGP0 ...

  8. java学习面向对象之内部类

    什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中. 那么内部类都有什么特点呢? 1.内部类可以访问包裹他的类的成员. 2.如果包裹他的类想访问被其包裹的类的话就得实例 ...

  9. 黑马程序员——JAVA基础之内部类,匿名内部类

    ------- android培训.java培训.期待与您交流! ---------- 内部类 将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类). 内部类访问特点: •  内部 ...

  10. Java面向对象(Eclipse高级、类与接口作为参数返回值)

      面向对象 今日内容介绍 u Eclipse常用快捷键操作 u Eclipse文档注释导出帮助文档 u Eclipse项目的jar包导出与使用jar包 u 不同修饰符混合使用细节 u 辨析何时定义变 ...

随机推荐

  1. [转帖]iostat相关参数说明——await:平均每次设备I/O操作的等待时间 (毫秒),如果%util接近 100%,说明产生的I/O请求太多

    https://www.cnblogs.com/bonelee/p/6323587.html iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动 ...

  2. Nginx拆分配置文件的办法

    Nginx拆分配置文件的办法 摘要 最近公司使用Nginx进行微服务的路由处理 但是发现随着业务发展, 配置文件越来越复杂. 修改起来也很容易出现错误. 基于此. 想通过拆分配置文件的方式来提高修改效 ...

  3. [转帖]kubelet 原理解析三:runtime

    本文转自:https://feisky.xyz/posts/kube... 架构 Kubelet 架构图 Generic Runtime Manager:这是容器运行时的管理者,负责于 CRI 交互, ...

  4. DBLink实现备份文件不落盘的导入其他Oracle数据库实例的方法

    DBLink实现备份文件不落盘的导入其他Oracle数据库实例的方法 背景 公司内经常有从其他服务器备份数据库实例的需求 之前的操作一般需要,备份源服务器使用expdp将source导出dump文件. ...

  5. js判断一个时间是否在某一个时间段内

    很多时候,我们需要对时间进行处理: 比如说:获取当前的时间 判断某一个时间是否在一段时间内:如果在显示出某一个按钮: 让用户可以操作:如果不在,按钮隐藏 这个时候,我们就需要对时间进行处理了 < ...

  6. 使用Java读取Excel文件数据

    通过编程方式读取Excel数据能实现数据导入.批量处理.数据比对和更新等任务的自动化.这不仅可以提高工作效率还能减少手动处理的错误风险.此外读取的Excel数据可以与其他系统进行交互或集成,实现数据的 ...

  7. MacBook m2 笔记本 + k8s容器环境开发笔记

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 为最近两周在 MacBook m2 + k8s 容器环境的 ...

  8. nodejs的npm改为国内源和参数

    npm源改为国内 此方法不需要安装cnpm也可以使用淘宝镜像,提高国内访问速度 由于 Node 的官方模块仓库网速太慢,模块仓库需要切换到阿里的源. npm config set registry h ...

  9. 【一】LaTeX的安装和使用、安装TeXstudio、中文界面输出设置

    安装方法一:(推荐) 下载链接·:http://tug.org/texlive/acquire-netinstall.html 下载zip,然后运行Windows批处理脚本(install-tl-wi ...

  10. 6.6 Windows驱动开发:内核枚举Minifilter微过滤驱动

    Minifilter 是一种文件过滤驱动,该驱动简称为微过滤驱动,相对于传统的sfilter文件过滤驱动来说,微过滤驱动编写时更简单,其不需要考虑底层RIP如何派发且无需要考虑兼容性问题,微过滤驱动使 ...