热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

内部类(成员、局部、匿名)

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

概述:内部类就是在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类

内部类定义格式

public class 类名{修饰符 class 类名{}}

image-20210626164428863

内部类的访问特点


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

``

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

按照内部类在类中的定义的位置不同,分为两种形式

  • 在类的成员位置:成员内部类
  • 在类的局部位置:局部内部类

成员内部类

image-20210626172639215

上面这个方法不常使用

经常是定义一个外部类的对象,然后调用外部类的方法A,方法A里面在调用内部类

``

package com.itheima_02;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();}}

``

package com.itheima_02;
/*测试类*/
public class InnerDemo {public static void main(String[] args) {//创建对象调用
// Outer.Inner oi=new Outer().new Inner();
// oi.show();Outer outer=new Outer();outer.method();}
}

局部内部类

局部内部类是方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用。该类可以直接访问外部类的成员,也可以访问方法内的局部变量

``

package com.itheima_03;public class Outer {private int num = 100;public void method() {int num2=90;class Inner {public void show() {System.out.println(num);System.out.println(num2);}}Inner i = new Inner();i.show();}}

``

package com.itheima_03;
/*测试类*/
public class Demo {public static void main(String[] args) {Outer o=new Outer();o.method();}
}

匿名内部类

前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类

image-20210627090648189

本质:是一个继承了该类或者实现了该接口的子类匿名对象

``

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

``

package com.itheima_04;public class Outer {public void method(){// 是定义在方法内部,且本质是一个对象//对象调用方法形式/* new Inter(){@Overridepublic void show() {System.out.println("匿名内部类");}}.show();
*/
Inter i= new Inter(){@Overridepublic void show() {System.out.println("匿名内部类");}};//利用接口创建对象,实现多次调用i.show();i.show();}
}

匿名内部类在开发中的使用

``

package com.itheima_05;
/*测试类
* 需求:创建接口操作类的对象,调用method方法*/

public class JumppingDemo {public static void main(String[] args) {JumppingOperator jo=new JumppingOperator();Jumpping j=new Cat();jo.method(j);System.out.println("-----");//使用匿名内部类,这样就不用每次调用jump方法都需要先创建一个类,然后再让该类继承接口,再让接口指向该类对象//因为匿名内部类本质上就是一个实现该接口的实现类或者继承该类的子类的 对象,//用匿名内部类有了对象,直接调用方法jo.method(new Jumpping() {@Overridepublic void jump() {System.out.println("Fox可以跳高了");}});jo.method(new Jumpping() {@Overridepublic void jump() {System.out.println("Pig");}});}
}
em.out.println("Fox可以跳高了");}});jo.method(new Jumpping() {@Overridepublic void jump() {System.out.println("Pig");}});}
}


推荐阅读
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • SQLite数据库CRUD操作实例分析与应用
    本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。 ... [详细]
  • 本文深入探讨了Java中正确使用return语句的方法。通过详尽的示例和解释,帮助读者理解return语句在不同场景下的应用,提升代码质量和可读性。希望读者在阅读后能够掌握return语句的最佳实践,从而在实际开发中更加得心应手。 ... [详细]
  • 捕获并处理用户输入数字时的异常,提供详细的错误提示与指导
    在用户输入数字时,程序能够有效捕获并处理各种异常情况,如非法字符或格式错误,并提供详尽的错误提示和操作指导,确保用户能够准确输入有效的数字数据。通过这种方式,不仅提高了程序的健壮性和用户体验,还减少了因输入错误导致的系统故障。具体实现中,使用了Java的异常处理机制,结合Scanner类进行输入读取和验证,确保了输入的合法性和准确性。 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • 题目要求将数字字符串转换为对应的字母组合,例如“111”可以转化为“AAA”、“KA”或“AK”。本文通过深入解析暴力递归方法,详细探讨了这一问题的解法,并结合真实的 Facebook 面试题目,提供了从左至右尝试模型的具体实现和优化策略。 ... [详细]
  • 在 Goland IDE 中配置 Go 开发环境的方法与步骤
    在 Goland IDE 中配置 Go 开发环境的方法与步骤 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 在解决区间相关问题时,我发现自己经常缺乏有效的思维方式,即使是简单的题目也常常需要很长时间才能找到解题思路,而一旦得到提示便能迅速理解。题目要求对一个包含n个元素的数组进行操作,并给出一个参数k,具体任务是…… ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • Java 中 print、println 和 printf 的功能与区别详解
    在 Java 中,`print` 方法将参数内容输出到控制台,并将光标停留在最后一个字符的后面。而 `println` 方法不仅显示参数内容,还会在输出结束后自动添加一个换行符,使下一次输出从新的一行开始。此外,`printf` 方法则提供了更灵活的格式化输出选项,允许用户通过指定格式字符串来控制输出的格式和样式。这三种方法各有特点,适用于不同的输出需求。 ... [详细]
  • 数组容量的动态调整与优化策略
    在探讨数组容量动态调整与优化策略时,本文分析了两种常见的方法。首先,通过使用for循环逐个复制元素实现扩容,但这种方法存在计算索引的复杂性问题。其次,利用System.arraycopy()方法进行高效复制,显著提升了性能和代码可读性。此外,文章还讨论了动态数组在不同应用场景下的优化策略,包括预分配容量和按需扩展等技术,以提高程序的整体效率。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
author-avatar
漫漫瞹fyS-1908
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有