首页 > 编程语言 >Java面向对象之内部类的几类使用场景

Java面向对象之内部类的几类使用场景

时间:2024-02-28 16:11:28浏览次数:20  
标签:Java void ActionListener public 面向对象 new 几类 data class

介绍

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,void,ActionListener,public,面向对象,new,几类,data,class
From: https://www.cnblogs.com/wikiman/p/18040745

相关文章

  • java远望,第一次触摸
    AboutJAVAJDkjavadevelopmentkit卸载JDK删除java的安装目录删除环境变量的JAVA_HOME删除path下关于java的目录cmd查看java-version安装JDK百度搜索JDK8同意协议下载对应电脑版本双击安装JDK记住安装路径配置环境变量1.此电脑->右键->属性2.环境变量->新建-......
  • Python会超越Java吗
    与Java相比,PythonPython和Java,作为各自领域的领导者,他们的力量在工程界和开发者社区不断被讨论。Python因其简洁的语法和快速的开发而被广泛应用于数据分析、人工智能、网络爬虫等领域。Java在企业级应用、安卓应用开发和大型系统建设中占有重要地位,具有强大的类型和面向对象的特......
  • Hudi-FlinkSQL导入数据报错:[ERROR] Could not execute SQL statement. Reason: java.l
    问题描述通过FlinkSQL创建Hudi表后,向表中插入数据报错:[ERROR]CouldnotexecuteSQLstatement.Reason:java.lang.ClassNotFoundException:org.apache.hadoop.fs.FSDataInputStream 解决办法向Hudi表中写入数据时,会调用Hadoop的Jar包,但是Flink的lib目录中没有该Jar包。......
  • JAVA基础
    基础知识常用快捷键Ctrl+A:全选Ctrl+X:剪切Ctrl+Z:撤销Ctrl+Z:撤销Ctrl+S:保存Alt+F4:关闭窗口Shift+Delete:永久删除win+E:文件资源管理器Alt+Alt:切换界面Win+Rcmd:控制台(若以管理员身份运行,则右击)Ctrl+D:复制当前行到下一行常用Dos命令(cmd)#盘符切换#查看当前目录下的所......
  • 2.15 javabean
    Javabeanpackagebean;publicclassBase_InformationBean{privateStringcode;privateStringpassword;publicStringgetCode(){returncode;}publicvoidsetCode(Stringcode){this.code=code;}publ......
  • Java遇到PKIX path building failed错误的解决办法
    Java调用HTTPS可能出现如下错误:PKIXpathbuildingfailed:sun.security.provider.certpath.SunCertPathBuilderException:unabletofindvalidcertificationpathtorequestedtarget。测试验证测试是否会出现本问题可以使用如下命令:javaSSLPokejira.example.com443......
  • AWT仿射变换:java.awt.geom.AffineTransform的使用
    使用AffineTransform的包有哪些?java.awt包:包含用于创建用户界面和绘制图形图像的所有类。java.awt.font包:提供与字体相关的类和接口。java.awt.geom包:提供用于在与二维几何形状相关的对象上定义和执行操作的Java2D类。java.awt.image包:提供创建和修改图像的各种类。ja......
  • Python面向对象,类属性,实例属性,类方法,实例方法,静态方法的区别及用法详解
    一.前言在Python的面向对象编程中,类属性和实例属性是两个不同的概念,它们在作用域和使用方式上有所区别。在Python中的面向对象编程中有三种方法:实例方法、类方法和静态方法,它们之间的差异主要体现在参数传递和调用方式上。二.面向对象-类属性和实例属性1.区别在Pyth......
  • 【Spring Framework】IoC容器、依赖注入 + 基于XML && 基于注解 && 基于Java Config配
    概念IoC,InversionofControl,控制反转:将对象的控制权交由第三方统一管理DI,DependencyInjection:依赖注入,使用反射技术,是一种IoC的实现SpringIoC容器:用于统一创建与管理对象依赖XML管理对象(bean):applicationContext.xmlSpring框架使用流程-基于XML配置IoC容器1.导入spring......
  • Java中使用Jsoup实现网页内容爬取与Html内容解析并使用EasyExcel实现导出为Excel文件
    场景Pythont通过request以及BeautifulSoup爬取几千条情话:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/87348030Node-RED中使用html节点爬取HTML网页资料之爬取Node-RED的最新版本:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124182289Jsoup......