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

java内部类的本质

定义在类内部,可以实现对外部完全隐藏,可以有更好的封装性,代码实现上也往往更为简洁。

内部类可以方便地访问外部类的私有变量,可以声明为private从而实现对外完全隐藏。
在Java中,根据定义的位置和方式不同,主要有4种内部类:

  • 静态内部类:可以被外部使用(但要看访问权限而定)
  • 成员内部类:可以被外部使用(但要看访问权限而定)
  • 方法内部类:在一个方法内限定和使用
  • 匿名内部类:不能在外部使用

1.静态内部类:

class outer{private static int shared=100;public static class Staticinter{public void innermethod(){System.out.println(shared);}}public void test(){Staticinter si=new Staticinter();si.innermethod();}
}

静态内部类可以有:静态变量、静态方法、成员方法、成员变量、构造方法等。它可以访问外部类的静态变量和方法,如innerMethod直接访问shared变量。在类内部,可以直接使用内部静态类,如test()方法所示。

public静态内部类可以被外部使用,只是需要通过“外部类.静态内部类”的方式使用:

public static void main(String[] args) {outer.Staticinter O=new outer.Staticinter();O.innermethod();}

静态内部类的实现:
代码实际上会生成两个类:一个是Outer,另一个是Outer$StaticInner
在这里插入图片描述
内部类访问了外部类的一个私有静态变量shared,而我们知道私有变量是不能被类外部访问的,Java的解决方法是:自动为Outer生成一个非私有访问方法access$0,它返回这个私有静态变量shared。

静态内部类的使用场景是很多的,如果它与外部类关系密切,且不依赖于外部类实例,则可以考虑定义为静态内部类。比如,一个类内部,如果既要计算最大值,又要计算最小值,可以在一次遍历中将最大值和最小值都计算出来,但怎么返回呢?可以定义一个类Pair,包括最大值和最小值,但Pair这个名字太普遍,而且它主要是类内部使用的,就可以定义为一个静态内部类。

2.成员内部类:

class outer{private  int shared=100;public  class inter{public void innermethod(){System.out.println(shared);}}public void test(){inter si=new inter();si.innermethod();}
}

如果内部类与外部类关系密切,需要访问外部类的实例变量或方法,则可以考虑定义为成员内部类。
外部类的一些方法的返回值可能是某个接口,为了返回这个接口,外部类方法可能使用内部类实现这个接口,这个内部类可以被设为private,对外完全隐藏。

3.方法内部类:

class outer{private  int shared=100;public void test(){final String str="hello";class inner{public void innermethod(){System.out.println(shared);}}inner in=new inner;
in.innermethod();
}    
}

类Inner定义在外部类方法test中,方法内部类只能在定义的方法内被使用。如果方法是实例方法,则除了静态变量和方法,内部类还可以直接访问外部类的实例变量和方法,如innerMethod直接访问了外部私有实例变量a。如果方法是静态方法,则方法内部类只能访问外部类的静态变量和方法。方法内部类还可以直接访问方法的参数和方法中的局部变量,不过,这些变量必须被声明为final,如innerMethod直接访问了方法参数param和局部变量str。
在这里插入图片描述
4.匿名内部类
在这里插入图片描述
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 计算器原生js
  • 第一章 深度学习和神经网络
  • sonar 8.9版本k8s安装部署
  • Jetpack Compose实现一个简单的微信UI
  • C/C++ 进阶(7)模拟实现map/set
  • 论文研读:ViT-V-Net—用于无监督3D医学图像配准的Vision Transformer
  • 《C++并发编程实战》笔记(一、二)
  • 抗量子密码算法:保障未来信息安全的新盾牌
  • 比赛获奖的武林秘籍:06 5 分钟速通比赛路演答辩,国奖选手的血泪经验!
  • 《JavaScript权威指南第7版》中文PDF+英文PDF+源代码 +JavaScript权威指南(第6版)(附源码)PDF下载阅读分享推荐
  • Hadoop-25 Sqoop迁移 增量数据导入 CDC 变化数据捕获 差量同步数据 触发器 快照 日志
  • 手机和电脑通过TCP传输
  • Boost搜索引擎
  • 构建Memcached帝国:分布式部署策略与实践指南
  • uni-app 保存号码到通讯录
  • 【笔记】你不知道的JS读书笔记——Promise
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ES学习笔记(12)--Symbol
  • Fabric架构演变之路
  • JWT究竟是什么呢?
  • MySQL用户中的%到底包不包括localhost?
  • Redash本地开发环境搭建
  • tweak 支持第三方库
  • Vim Clutch | 面向脚踏板编程……
  • 后端_MYSQL
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 模型微调
  • 目录与文件属性:编写ls
  • 前端代码风格自动化系列(二)之Commitlint
  • 设计模式走一遍---观察者模式
  • 时间复杂度与空间复杂度分析
  • 网络应用优化——时延与带宽
  • 阿里云服务器如何修改远程端口?
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​​​【收录 Hello 算法】9.4 小结
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​Redis 实现计数器和限速器的
  • ​插件化DPI在商用WIFI中的价值
  • ​字​节​一​面​
  • # C++之functional库用法整理
  • # 数据结构
  • #define、const、typedef的差别
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $nextTick的使用场景介绍
  • (2)MFC+openGL单文档框架glFrame
  • (C#)一个最简单的链表类
  • (Git) gitignore基础使用
  • (poj1.3.2)1791(构造法模拟)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (论文阅读30/100)Convolutional Pose Machines
  • (一)80c52学习之旅-起始篇
  • (转)c++ std::pair 与 std::make
  • (转)用.Net的File控件上传文件的解决方案
  • (状压dp)uva 10817 Headmaster's Headache