有名内部类 匿名内部类
内部类,从名字上就可以看出,是定义在外部类里的类,可以更加详细地说明某个事物的特征,举个例子,就像一个人(把他定义为一个类[外部类]),这个人有大脑、肝脏、心脏等器官,这些器官都有自己特有的属性,但又必须待在身体里面,而不能单独列出来(单创一个类),这时就要创建内部类了。内部类按是否有名称可分为:有名内部类和匿名内部类,
class Body{ //外部类double bloodFlow = 13.5;//外部类成员变量class Heart{ //有名内部类double heartRate = 70;void beat(){System.out.println("每分钟跳动70次");}}public static void main(String[] args) {Body body = new Body();Heart heart = body.new Heart(); //调用内部类
// Body.Heart heart = new Body().new Heart(); 也可以这样调用(因为该内部类是非静态的,不能直接调用,需要通过创建对象来调用)System.out.println(heart.heartRate); //输出结果:70heart.beat(); //输出结果:每分钟跳动70次}
}
该程序编译后会生成两个文件:Body.class 和 Body$Heart.class
其实上面的内部类也是非静态内部类,所以也就有静态内部类:
class Body{ //外部类static class Brain{ //静态内部类void happen(){System.out.println("大脑每秒发生10万次化学反应");}}public static void main(String[] args) {// Body body = new Body();(在一个外部类中调用时不需要这行代码)Brain brain = new Brain(); //调用静态内部类
// Body.Brain brain = new Body.new Brain(); 也可以这样调用(因为该内部类是静态的,所以可以直接调用)brain.happen(); //输出结果:大脑每秒发生10万次化学反应}
}
匿名内部类,顾名思义就是没有名字的内部类,想一下一个没有名字的类该怎么调用它?怎么创建对象?肯定都不能实现了,所以匿名内部类一定要和创建对象一起存在,此时的匿名内部类也就是上转型对象(所以无法调用匿名内部类中新增的属性和方法),且跟在new后面的若是“类”,则该匿名内部类是其子类,若跟在new后面的是“接口”,则该匿名内部类是其实现类。
我们再想一下在多态中,子类要重写父类的方法,但首要前提就是创建一个子类,然后重写,再调用。这样会很麻烦,而且如果就几个或一个抽象方法时,再单独创建一个子类很浪费,所以此种情况下就可以考虑用匿名内部类了(也就是说匿名内部类通常用作实现或重写接口或父类中的抽象方法)
public interface IBlood{void cycle();
}
class Body{static IBlood blood = new IBlood(){ //从这个大括号到对应的大括号之间就是匿名内部类,它可以直接作为一个整体去使用@Overridepublic void cycle(){System.out.println("血液循环");}}; //注意:要加英文分号public static void main(String[] args) {blood.cycle(); //输出结果:血液循环}
}
该程序编译时创建三个文件:IBlood.class文件、Body.class文件、Body$1.class文件。
(内部类是一个独立的class文件)
总之匿名内部类要和创建对象一起使用,多用于继承其他类或实现接口,对继承方法进行重写或实现,因为不用另创建一个单独的子类,所以就简化了代码
最后补充一点内部类的访问权限,外部类或接口的访问权限只能是public或默认的,而内部类四种访问权限都可以,但局部内部类跟局部变量一样 不允许添加任何访问权限:
class Out{//只能是public或默认的protected Class In{//四种都可以}public static void main(String[] args) {Class PartIn{//不可添加任何访问权限int age = 12;//jdk8.0及以后,在内部类中定义局部变量不需要加final/*final int age = 12 jdk8.0以前需要加final*/}}
}
有名内部类 匿名内部类相关推荐
- Java学习笔记:内部类/匿名内部类的全面介绍
编写java程序时,一般一个类(或者接口)都是放在一个独立的java文件中,并且类名同文件名(如果类是public的,类名必须与文件名一致:非public得,无强制要求).如果想把多个java类放在一 ...
- 【java笔记】成员内部类 局部内部类 匿名内部类
内部类:一个类的内部包含另一个类 如:身体和心脏的关系,汽车和发动机的关系 分类:(1)成员内部类 (2)局部内部类(包含匿名内部类) 成员内部类: 定义格式:修饰符 class 外部类名称{ 修饰符 ...
- JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?
本文主要记录:在JAVA中,(局部)内部类访问某个局部变量,为什么这个局部变量一定需要用final 关键字修饰? 首先,什么是局部变量?这里的局部是:在方法里面定义的变量. 因此,内部类能够访问某局部 ...
- JAVA内部类匿名内部类总结
个人简介 大家好,我是翰慧腾.一名正在努力学JAVA的大一小白,本文章为初学的笔记,希望各位多多指教.
- Java内部类(匿名内部类)
Java内部类(匿名内部类) 一.内部类 二.静态内部类 三.成员内部类 四.局部内部类(了解即可) 五.匿名内部类(重要) 一.内部类 1.概述 内部类就是一个定义在一个类里面的类,里面的类可以理解 ...
- JAVA基础——内部类(成员内部类、静态内部类、局部内部类、匿名内部类)
成员内部类 静态内部类 局部内部类 匿名内部类 1.成员内部类(实例内部类.非静态内部类) 成员内部类中不能写静态属性和方法 实例化内部类,首先需要实例化外部类,通过外部类去调用内部类 作用 要想 ...
- 【java】兴唐第十九节课(内部类)
内部类:在类的内部定义的类叫内部类 1.有名内部类: (1)实例化时必须先实例化外部对象,格式: 外部类.内部类 对象名 = 外部类对象名.new.内部类名(): 代码实现: //student类 p ...
- Java 内部类
概述: 定义在类的内部的类就叫做内部类 作用: 1.可以对资源进一步的封装,提升代码的安全性 2.间接的实现多继承 分类: 根据位置不同: 成员内部类 普通成员内部类 ...
- Java:四大内部类详解及总结
文章目录 声明 成员内部类 局部内部类 匿名内部类 静态内部类 内部类总结 普通内部类 局部内部类 匿名内部类 静态嵌套类 声明 1)该文章部分内容整理自网上的资料,如不小心侵犯了大家的权益,还望海涵 ...
最新文章
- RichTextBox粘贴两次以及去掉粘贴内容的格式问题
- Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型...
- 2007基于循环链表的队列的基本操作(C++)
- 程维谈智慧交通:我们赶上好时代 走出了自己路
- 苹果失策?新iPhone捆绑Apple TV+或会致硬件利润率下滑
- linux下如何升级gcc和g++编译器
- 问题 G: 三个数比较大小
- 流行的Spring Boot + Vue架构整合开发的网易云+QQ音乐(附源码)!
- 【LDAP】LDAP常用命令解析
- python 修改用户对文件权限_用户管理相关内容的学习(查看文件权限 修改文件权限chmod 改变文件归属chown和chgrp)...
- 日语学习的实用网址大全!
- 从普通回溯到三色标记法法
- IEC60958和IEC61937
- CF1527D MEX Tree(mex树容斥)
- windows开机自动运行bat文件
- C语言程序设计教材九斗验证,C语言程序设计
- Vim中如何替换字符串
- 基于Java实现的区块链供应链金融系统平台设计
- 基于SVM的智能家居模拟系统
- 【服务器数据恢复】NetApp存储无法访问的数据恢复案例