当前位置:网站首页 > 技术博客 > 正文

java内部类有什么作用



 🚀 个人简介:某大型国企资深软件开发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~

🌈 创作不易,如果能帮助到带大家,欢迎 收藏+关注  💕

​ 🌈🌈文章目录  

一、内部类概述

1.1 什么是内部类

1.2 为什么要声明内部类呢

1.3 内部类的分类

二、成员内部类

2.1 概述

2.2 创建成员内部类对象

2.3 代码举例

三、局部内部类

3.1 非匿名局部内部类

举例:

3.2 匿名内部类

举例1:使用匿名内部类的对象直接调用方法:

举例2:通过父类或父接口的变量多态引用匿名内部类的对象

举例3:匿名内部类的对象作为实参

四、小练习

1.1 什么是内部类

将一个类A定义在另一个类B里面,里面的那个类A就称为,类B则称为

1.2 为什么要声明内部类呢

具体来说,当一个事物A的内部,还有一个部分需要一个完整的结构B进行描述,而这个内部的完整的结构B又只为外部事物A提供服务,不在其他地方单独使用,那么整个内部的完整结构B最好使用内部类。

总的来说,遵循的面向对象开发原则。

1.3 内部类的分类

根据内部类声明的位置(如同变量的分类),我们可以分为:

2.1 概述

如果成员内部类中不使用外部类的非静态成员,那么通常将内部类声明为静态内部类,否则声明为非静态内部类。

语法格式:

 

成员内部类的使用特征,概括来讲有如下两种角色:

  • 成员内部类作为:
    • 和外部类不同,Inner class还可以声明为private或protected;
    • 可以调用外部类的结构。(注意:在静态内部类中不能使用外部类的非静态成员)
    • Inner class 可以声明为static的,但此时就不能再使用外层类的非static的成员变量;
  • 成员内部类作为
    • 可以在内部定义属性、方法、构造器等结构
    • 可以继承自己的想要继承的父类,实现自己想要实现的父接口们,和外部类的父类和父接口无关
    • 可以声明为abstract类 ,因此可以被其它的内部类继承
    • 可以声明为final的,表示不能被继承
    • 编译以后生成OuterClass$InnerClass.class字节码文件(也适用于局部内部类)

注意点:

  1. 外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式
  2. 成员内部类可以直接使用外部类的所有成员,包括私有的数据
  3. 当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的

2.2 创建成员内部类对象

  • 实例化静态内部类

外部类名.静态内部类名 变量 = 外部类名.静态内部类名();
变量.非静态方法();

  • 实例化非静态内部类

外部类名 变量1 = new 外部类();
外部类名.非静态内部类名 变量2 = 变量1.new 非静态内部类名();
变量2.非静态方法();

2.3 代码举例

 

3.1 非匿名局部内部类

语法格式:

[修饰符] class 外部类{
    [修饰符] 返回值类型  方法名(形参列表){
            [final/abstract] class 内部类{
        }
    }    
}

  • 编译后有自己的独立的字节码文件,只不过在内部类名前面冠以外部类名、$符号、编号。
    • 这里有编号是因为同一个外部类中,不同的方法中存在相同名称的局部内部类
  • 和成员内部类不同的是,它前面不能有权限修饰符等
  • 局部内部类如同局部变量一样,有作用域
  • 局部内部类中是否能访问外部类的非静态的成员,取决于所在的方法
举例:
 

3.2 匿名内部类

因为考虑到这个子类或实现类是一次性的,那么我们“费尽心机”的给它取名字,就显得多余。那么我们完全可以使用匿名内部类的方式来实现,避免给类命名的问题。

new 父类([实参列表]){
    重写方法...
}

new 父接口(){
    重写方法...
}

举例1:使用匿名内部类的对象直接调用方法:
 
举例2:通过父类或父接口的变量多态引用匿名内部类的对象
 
举例3:匿名内部类的对象作为实参
 

练习:判断输出结果为何?

 

练习2:

编写一个匿名内部类,它继承Object,并在匿名内部类中,声明一个方法public void test()打印码喽的自我修养。

请编写代码调用这个方法。

 

到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易,如果能帮助到大家,希望大家点点收藏+关注 ~💕  

​ 

  更多专栏订阅推荐:

🥕 JavaScript深入研究

✈️ HTML5与CSS3

🖼️ JavaScript基础

⭐️ uniapp与微信小程序

📝 前端工作常见问题与避坑指南

✍️ GIS地图与大数据可视化

📚 常用组件库与实用工具

💡 java入门到实战 

版权声明


相关文章:

  • 动态sql的种类有哪些 ?2024-12-31 12:01:03
  • mq在软件系统中的作用2024-12-31 12:01:03
  • 单臂路由的配置要点和关键命令2024-12-31 12:01:03
  • seq2seq loss2024-12-31 12:01:03
  • 你知道的数据库有哪些2024-12-31 12:01:03
  • 左外连接的sql语句实例2024-12-31 12:01:03
  • error-correction2024-12-31 12:01:03
  • combo box控件使用2024-12-31 12:01:03
  • c语言,用scanf输入数据2024-12-31 12:01:03
  • orm框架有哪些优缺点2024-12-31 12:01:03