当前位置: 首页 > java >正文

Java----内部类 以及 调用关系

目录标题

    • **一.内部类**
      • **一.内部类定义**
      • 二.**内部类** 与 **继承类** 之间的区别
        • ①定义 与 作用
        • ②访问权限
      • 二.内部类的**类型**
        • ①普通内部类
        • ②静态内部类
        • ③局部内部类
      • 要点
    • **二、内部类的核心优势**
    • **三.调用关系**
      • 一.**外部类**访问**内部类**
      • 二.**内部类**调用**外部类**

一.内部类

一.内部类定义

普通类 的定义 相同

[访问修饰符] [存储修饰符] class 类名
{……
}

内部类 也可以有 成员变量成员方法

内部类 整体也可以被当做 外部类 的一个 成员 使用

③因此也可以调用 外部类成员(成员变量、成员方法)

二.内部类继承类 之间的区别

①定义 与 作用
  • 内部类 : 定义方法及为普通方法的定义
    为了更好的保护内容,增强封装性

  • 继承类 : 用extends实现类与类的 继承
    为了 继承 并可以 扩写 父类内容

②访问权限
  • 内部类 : 可以访问自生所在 外部类 的所有成员,包括**(**private修饰的),但 外部类 不可以直接访问 内部类 的成员
  • 继承类 : 可以直接访问父类中 除了由private 修饰 的成员,若想访问,需要由 父类的实例 (对象)访问

二.内部类的类型

①普通内部类
  • 定义为 外部类 的成员,与 外部类成员方法、成员变量 同级
  • 可访问外部类的 所有成员
class Outer 
{private int x = 10;              class Inner {           void show() {               System.out.println(x); // 直接访问外部类私有变量          }       }   
}
②静态内部类
  • 使用 static 修饰的 内部类
  • 只能访问外部类的 静态成员
class Outer 
{static int y = 20; int x = 100;             static class StaticInner {           void display() {                System.out.println(y); // 只能访问静态成员           }       }   
}
③局部内部类
  • 存储在 方法 或者 作用域
  • 只能访问所在方法的 final 或者 与 final 等效的 局部变量
class Outer 
{void method() {           final int z = 30;          //内部类class LocalInner {               //内部类 的方法void print() {                   System.out.println(z);               }           }           //创造内部类的实例 并 调用方法new LocalInner().print();       }   
}

要点

编译完成后,会生成两个class文件(数量为类的数量),因为内部类也以独立的文件**(class文件)**存储在磁盘中,名称为
外部类名 $内部类名.class

二、内部类的核心优势

  1. 增强封装性
  • 内部类可声明为 private,仅对外部类可见
  • 外部类同样可以声明为private,仅对本类内可用,包括内部类
  1. 直接访问外部类成员
  • 内部类隐式有外部类引用(静态内部类除外)
  1. 实现多重继承
  • 通过多个内部类继承不同父类

三.调用关系

一.外部类访问内部类

需要创建内部类的实例(对象)
方法一:

内部类名 对象名 = new 外部类名.内部类名();

先创建外部类实例再由此创建内部类实例

外部类名 外部对象名 = new 外部类名();
外部类名.内部类名 内部对象名= 外部对象名.new 内部类名();
//例
Outclass out = new OutClass();
OutClass.InClass in = out.new InClass();
class Out
{    //内部类class In{//内部类的方法void First(){System.out.println("内部类的内容");}}//外部类 调用 内部类//先创建 内部类的 实例In in = new Out.In();//引用 内部类 内容in.First();            
}

二.内部类调用外部类

直接调用即可

但当内部类中有与要引用的外部类内容重名时

可如下使用显示引用

class Outer 
{private int x = 10;            //内部类class Inner{           void show() {// 显式访问 System.out.println(Outer.this.x);           // 隐式访问System.out.println(x);          }      }  
}
http://www.xdnf.cn/news/2245.html

相关文章:

  • Pygame终极项目:从零开发一个完整2D游戏
  • C++之map
  • ngrok 内网穿透技术系统性文档
  • 初始网络流(最小割)
  • 【C语言练习】005. 编写表达式并确定其值
  • leetcode刷题日记——环形链表
  • 新增Webhook通知功能,文档目录树展示性能优化,zyplayer-doc 2.5.1 发布啦!
  • Linux基础篇、第4章_03系统磁盘高级管理LVM 逻辑卷管理器
  • 【头脑风暴】加权平均
  • 模型 递弱代偿
  • [计算机科学#2]:从继电器到晶体管的电子计算机发展史(庞然大物的进化)
  • 视觉大模型专栏导航
  • C++泛型编程(一):模板详解
  • 可视化大屏开发前提了解
  • ssm驾校预约管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
  • dl学习笔记(13):从强化学习到PPO
  • cf | Median Splits
  • Dubbo(78)Dubbo的集群容错机制是如何实现的?
  • Ollama平替!LM Studio本地大模型调用实战
  • 509. 斐波那契数
  • 集合及相关
  • 什么是 Swagger 以及如何在 Spring Boot 中实现 Swagger:配置与实践指南
  • 【黑马JavaWeb+AI知识梳理】前端Web基础01 - HTML+CSS
  • 【leetcode100】单词拆分
  • C++:位图
  • 【Charles】抓包工具安装配置unknown问题解决
  • 《人件》第三章 正确的人
  • 在Windows11中配置Git+SSH环境,本此实践使用Gitee(码云),方法同样适用于其它绝大部分Git服务
  • Linux-进程控制
  • 安服实习面试面经总结(也适合hvv蓝初)