首页 > 编程语言 >JAVA内部类

JAVA内部类

时间:2023-08-16 09:38:06浏览次数:51  
标签:部类 JAVA 内部 静态 成员 接口 局部

当一个事物 A 的内部,还有一个部分需要一个完整的结构 B 进行描述,而这个内部的完整的结构 B 又为外部事物 A 提供服务,不在其他地方单独使用,那么整个内部的完整结构 B 最好使用内部类。颇有细胞,组织,器官,系统,个体,种群,群落,生态系统,生物圈的感觉了。一层又一层的封装。遵循高内聚、低耦合的面向对象开发原则。该隐藏的隐藏,该暴露的暴露。

内部类,在类里边。那是和属性们待在一起还是和方法们待在一起?

所以有成员内部类和局部内部类的区分。

成员内部类

因为作为类的一部分存在,所以也会有和类绑定的情况,此时static也可以修饰内部类(注:仅限内部类,外部类不可以哦)

所以划分为静态成员内部类和非静态成员内部类。

(1)作为属性,作为类中的成员:可以声明为 private 或 protected(毕竟此时只算一个属性,有private可以隐藏一部分信息),可以调用外部类的结构。(注意:在静态内部类中不能使用外部类的非静态成员)
(2)作为类的角色:可以在内部定义属性、方法、构造器、代码块、内部类等结构;可以继承自己想要继承的父类,实现自己想要实现的父接口们,和外部类的父类和父接口无关;可以声明为 abstract 类 ,可以被其它的内部类继承;可以声明为 final 表示不能被继承;编译以后生成OuterClass$InnerClass.class 字节码文件(也适用于局部内部类)。从这一点来说,内部类使得类可以继承多个具体类或抽象类。

外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式
• 成员内部类可以直接使用外部类的所有成员,包括私有的数据
• 当想要在外部类的静态成员部分使用内部类时,可以考虑声明内部类为静态的
• 在内部类中调用外部类的结构时,不重名可以直接调,重名之后就近原则,name -- this.name -- person.this.name

静态成员内部类

静态内部类不能再使用外层类的非 static 的成员变量;
被 static 修饰的内部类可以直接作为一个普通类来使用,不需要实例化一个外部类。
实例化静态内部类:

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

那么静态内部类可不可以定义非静态方法呢?当然可以,只是变出非静态的东西后,必须创建对象才能调用(普通方法是属于对象的)。(因为在调的时候没有对象不知道调的到底是什么,这也是静态和非静态最大的区别:一个随类加载,一个没有。在不确定时,没法一起合作。)

非静态成员内部类

非静态内部类可以访问外部类的所有成员(方法、属性);
类似的,不被 static 修饰的内部类则需要实例化一个外部类。
实例化非静态内部类:

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

参考链接:https://blog.csdn.net/zuo_er_lyf/article/details/103488246

局部内部类

局部内部类,就是放在类的方法、构造器、代码块里的一个类,这个类是为这些方法等服务的,作用域小,是不是一定要有名字呢?
所以有匿名局部内部类和非匿名局部内部类的区分。

开发中一般见到的是调用的方法需要返回接口的实例,需要提供实现接口的类,返回实现接口类的对象。
一般常看见的代码有提供接口的实现类的对象、接口的实现类的匿名对象、接口的匿名实现类的对象和接口的匿名实现类的匿名对象。

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

标签:部类,JAVA,内部,静态,成员,接口,局部
From: https://www.cnblogs.com/yuyuanliu/p/17630658.html

相关文章

  • JavaScript程序中的文本、注释和字面量
    JavaScript程序中的文本。JavaScript区分大小写。这意味着它的关键字、变量、函数名和其他标识符必须始终保持一致的大小写。例如,“while”关键字必须写成“while”,而不是“While”或“WHILE”。同样,“online”、“Online”、“OnLine”和“ONLINE”是四个完全不同的变量名。Jav......
  • 2023前端JavaScript面试题大全
    一、基础题题目1:什么是JavaScript的数据类型?如何检查一个变量的数据类型?答案:JavaScript有七种数据类型:基本数据类型(PrimitiveDataTypes):Number、String、Boolean、Null、Undefined、Symbol引用数据类型(ReferenceDataTypes):Object、Array要检查一个变量的数据类......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • JavaSE--IO流
    一、IO流1、IO流概述  通过IO可以完成对硬盘文件的读和写  从硬盘中读取文件,读到内存中:读(Read)、输入(Input)、输入流(InputStream)  从内存中写入文件,写到硬盘中:写(Write)、输出(Output)、输出流(OutputStream)  java.io.*;2、IO流的分类  1)一种方式是按照流的方向进行分类......
  • JavaSE--foreach
    一、增强for(foreach)1、语法格式for(元素类型变量名:数组或集合){System.out.println(变量名);}2、foreach缺点  foreach有一个缺点:没有下标。在需要使用下标的循环中,不建议使用增强for循环3、举例publicclassForEachTest01{publicstaticvoidmain(String......
  • JavaSE--泛型
    一、泛型1、泛型语法机制  泛型这种语法机制,只在程序编译阶段起作用,只是给编译器参考的。(运行阶段泛型没用!)2、泛型的好处  第一:集合中存储的元素类型统一了。  第二:从集合中取出的元素类型是泛型指定的类型,不需要进行大量的“向下转型”3、泛型的缺点  导致集合中......
  • JavaSE--集合
    一、集合概述java.util.*;包下1、什么是集合  集合实际上就就是一个容器,可以来容纳其他类型的数据,例如数组就是一个容器,一个集合  集合在开发中使用较多,可以一次容纳多个对象,  注意:集合不能直接存储基本数据类型,另外集合也不能直接存储java对象,集合当中存储的都是java......
  • java基础04
    变量变量就是变化的量Java是强类型语言,每个变量都必须声明类型Java变量是程序中最基本的单元,其要素包括变量名,变量类型和作用域如何定义变量?例:tybe/*数据类型*/varName/*变量名*/[=value/*=值*/]不建议一行多个变量每个变量必须有类型,可以是基础类型,也可以是引用类型......
  • JavaSE--异常处理机制
    一、异常exception1、什么是异常,以及Java提供的异常处理机制  程序执行过程中发生了不正常的情况,而这种不正常的情况叫做:异常  java语言提供了异常的处理方式,如果程序执行过程中出现了不正常情况,  java把该异常信息打印输出到控制台,供程序员参考。程序员看到异常信息之......
  • JAVA向Mysql插入亿级数量数据各种方式效率对比
    研究mysql优化中查询效率,通过随机生成人的姓名、年龄、性别、电话、email、地址,向mysql数据库大量插入数据,便于用大量的数据测试SQL语句优化效率。生成过程中发现使用不同的方法,效率天差万别。1、先上Mysql数据库,随机生成的人员数据图。分别是ID、姓名、性别、年龄、Email、电话......