Java内部类概述
时间:2021-08-02
本文章向大家介绍Java内部类概述,主要包括Java内部类概述使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Java内部类概述
成员内部类
-
就像外部类总的一个成员,可以访问外部类中的所有参数和方法,但是外部类不能直接访问内部类的参数和方法
-
成员内部类也可以设定访问权限修饰符,private、public、protected,缺省
-
在成员内部类中不能有静态参数和静态方法
-
成员内部类的实例化需要借助外部类的实例来实例,即
Outer.Inner inner=new Outer().new Inner();
局部内部类
- 顾名思义,这是在方法或者作用域中的类,所以不能有public、private等访问控制符修饰
匿名内部类
-
匿名内部类是一种没有具体类名的类,但是是一种用的较多的内部类
-
匿名内部类可以用于实现接口,继承类,并且实现其中的方法,例如
public class Outter3 { public static void main(String[] args) { Animal animal = new Animal() { //实现了接口Animal的匿名内部类 @Override public String xiaoLaoFu() { return "dai"; } }; System.out.println(animal.xiaoLaoFu()); Temp2 temp2 = new Temp2() { //匿名内部类继承Temp2 @Override public String method3() { return "被重写了的方法"; } }; System.out.println(temp2.method3()); } } interface Animal { String xiaoLaoFu(); } class Temp2 { public String method3() { return "temp2中的方法"; } }
- 匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为 Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承类和实现的接口中的方法重写。
静态内部类
-
静态内部类与成员内部类类似,但是其是static修饰的,所以同样的,静态内部类类似于外部类中的静态变量一样,可以直接访问外类类中的静态属性
-
静态内部类的实例化不需要借助于外部类实例:
class Outter4 { static String dabenxiang = "快跑呀"; String dazhuzhu = "白花花"; //静态内部类 static class Inner4 { public void method() { System.out.println("静态内部类可以直接访问外部类中的静态变量:" + dabenxiang); // System.out.println(dazhuzhu); // 访问不到 System.out.println("静态内部类中的方法!"); } } public static void main(String[] args) { //静态内部类的实例化 Inner4 inner4 = new Inner4(); inner4.method(); Outter4.Inner4 inner41 = new Outter4.Inner4(); } } // 在其他类中实例化静态内部类 class Temp { public static void main(String[] args) { Outter4.Inner4 inner4 = new Outter4.Inner4(); inner4.method(); } }
内部类的使用场景和好处
- 使得多继承的解决方案变得完整,每个内部类都能独立的继承和实现接口,并且无论外部类是否已经继承或实现接口
- 可以将存在一定逻辑关系的类组织在一起,同时可以对外界隐藏,例如事件驱动程序,线程运行
成员内部类也可以被继承,当成员内部类被继承的时候,其引用方式必须为 Outter.Inner,并且构造器中必须有指向外部类对象的引用,并通过这个引用调用super() :
class WithInner {
class Inner{
}
}
class InheritInner extends WithInner.Inner {
// InheritInner() 是不能通过编译的,一定要加上形参
InheritInner(WithInner wi) {
wi.super(); //必须有这句调用
}
public static void main(String[] args) {
WithInner wi = new WithInner();
InheritInner obj = new InheritInner(wi);
}
}
原文地址:https://www.cnblogs.com/zwwang/p/15089864.html
- js实现css3的过渡,需要注意的一点(浏览器优化)
- 居中详解
- 通过pl/sql计算程序的运行时间(r3笔记第77天)
- 操作系统存储管理和oracle数据库(第一篇) (r3笔记第76天)
- 关于虚拟索引的学习(r3笔记第75天)
- python数据挖掘:能不能找出吃货最佳住宿点?
- 解决ajax跨域请求 (总结)
- Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录
- 在深度学习TensorFlow 框架上使用 LSTM 进行情感分析
- python玩微信:如何获得自己微信的好友统计信息
- 关于不可见索引的学习(r3笔记74天)
- 【专业技术第五讲】动态链接库及其用法
- 用scrapy爬虫抓取慕课网课程数据详细步骤
- 关于pl/sql中的绑定变量(r3笔记第73天)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- StyleGAN2玩出新高度!从华盛顿到特朗普,无缝切换生成历届美国总统
- 深入理解MySQL中事务隔离级别的实现原理
- 浅析常见的算法范式
- 检查 JavaScript 变量是否为数字的几种方式
- 玩转Google Colab!附20种小技巧
- 猿实战19——商品发布之商详数据准备
- 【大家的项目】code-minimap
- 尤大 几天前发在 GitHub 上的 vue-lit 是啥?
- 用回溯算法求解数独问题
- bug 回忆录(四)
- 新手入门系列之-React / Vue 应用持续集成Docker 化
- Android 获取进程名函数,如何优化到极致?
- R语言做K均值聚类的一个简单小例子
- 如何自动化Salesforce应用程序
- 2万字带你学习Qos原理,还有6个实验案例,建议一定要收藏!