java 中的内部类介绍
内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类。如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液、跳动)。 |
显然,此处不能单方面用属性或者方法表示一个心脏,而需要一个类。
而心脏又在人体当中,正如同是内部类在外部内当中。
实例1:内部类的基本结构
//外部类 class Out {private int age = 12;//内部类class In {public void print() {System.out.println(age);}} }public class Demo {public static void main(String[] args) {Out.In in = new Out().new In();in.print();//或者采用下种方式访问/*Out out = new Out();Out.In in = out.new In();in.print();*/} }
运行结果:
12
从上面的例子不难看出,内部类其实严重破坏了良好的代码结构,但为什么还要使用内部类呢?
因为内部类可以随意使用外部类的成员变量(包括私有)而不用生成外部类的对象,这也是内部类的唯一优点。
如同心脏可以直接访问身体的血液,而不是通过医生来抽血。
程序编译过后会产生两个 .class 文件,分别是 Out.class 和 Out$In.class。
其中 $ 代表了上面程序中 Out.In 中的那个。
Out.In in = new Out().new In() 可以用来生成内部类的对象,这种方法存在两个小知识点需要注意:
- 开头的 Out 是为了标明需要生成的内部类对象在哪个外部类当中。
- 必须先有外部类的对象才能生成内部类的对象,因为内部类的作用就是为了访问外部类中的成员变量。
class Out {private int age = 12;class In {private int age = 13;public void print() {int age = 14;System.out.println("局部变量:" + age);System.out.println("内部类变量:" + this.age);System.out.println("外部类变量:" + Out.this.age);}} }public class Demo {public static void main(String[] args) {Out.In in = new Out().new In();in.print();} }
运行结果:
局部变量:14 内部类变量:13 外部类变量:12
从实例1中可以发现,内部类在没有同名成员变量和局部变量的情况下,内部类会直接访问外部类的成员变量,而无需指定Out.this.属性名。
否则,内部类中的局部变量会覆盖外部类的成员变量。
而访问内部类本身的成员变量可用 this.属性名,访问外部类的成员变量需要使用 Out.this.属性名。
实例2:静态内部类
class Out {private static int age = 12;static class In {public void print() {System.out.println(age);}} }public class Demo {public static void main(String[] args) {Out.In in = new Out.In();in.print();} }
运行结果:
12
可以看到,如果用 static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性。
其次,因为内部类被静态化,因此 Out.In 可以当做一个整体看,可以直接 new 出内部类的对象(通过类名访问 static,生不生成外部类对象都没关系)
实例3:私有内部类/h3>
class Out {private int age = 12;private class In {public void print() {System.out.println(age);}}public void outPrint() {new In().print();} }public class Demo {public static void main(String[] args) {//此方法无效/*Out.In in = new Out().new In();in.print();*/Out out = new Out();out.outPrint();} }
运行结果:
12
如果一个内部类只希望被外部类中的方法操作,那么可以使用 private 声明内部类。
上面的代码中,我们必须在 Out 类里面生成 In 类的对象进行操作,而无法再使用 Out.In in = new Out().new In() 生成内部类的对象。
也就是说,此时的内部类只有外部类可控制。
如同是,我的心脏只能由我的身体控制,其他人无法直接访问它。
实例4:方法内部类
class Out {private int age = 12;public void Print(final int x) {class In {public void inPrint() {System.out.println(x);System.out.println(age);}}new In().inPrint();} }public class Demo {public static void main(String[] args) {Out out = new Out();out.Print(3);} }
运行结果:
3 12
在上面的代码中,我们将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法。
如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用 final 定义。
至于 final 在这里并没有特殊含义,只是一种表示形式而已。
java 中的内部类介绍相关推荐
- java 为什么有匿名类_全面了解Java中的内部类和匿名类
Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了 ...
- Java中List集合介绍(炒鸡详细呦)
Java中List集合介绍 文章目录 Java中List集合介绍 1,Java集合介绍 2,List介绍 2.1 ArrayList集合 2.2 LinkedList集合 3,List常用方法 3.1 ...
- Java学习笔记二十:Java中的内部类
Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...
- java中ThreadPool的介绍和使用
文章目录 Thread Pool简介 Executors, Executor 和 ExecutorService ThreadPoolExecutor ScheduledThreadPoolExecu ...
- Java中BigDecimal类介绍及用法
Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高 ...
- javac 与java_javac中使用-d,以及javac / java中使用-cp介绍
javac中使用-d,以及javac / java中使用-cp介绍 发布时间:2019-01-15 20:39, 浏览次数:555 , 标签: javac java cp * 一般生成把java编译成 ...
- java中Cookie详细介绍
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是 ...
- java try catch_异常处理,JAVA中异常处理的介绍
异常处理的介绍 在Java程序的运行过程中,如果Java虚拟机检测出一个无法执行的操作,就会产生运行时错误(runtime error) 在Java中,运行时错误会作为异常来抛出. 抛出的异常是一个对 ...
- Java中所有锁介绍
在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 1.公平锁 / 非公平锁 2.可重入锁 / 不可重入锁 3.独享锁 / 共享锁 4.互斥锁 / 读 ...
最新文章
- kotlin重写构造方法编译报错:Primary constructor call expected
- 【mysql】关于事务的隔离级别
- 多个python文件相互调用_用 python提取两个文件之间的内容
- 排除网络故障课后习题参考答案
- Day 3 in India
- 【译】谨慎使用CSS中的波浪选择器
- 字体怎么安装到电脑上_文章还在使用电脑上的固定字体?这款字体软件超好用...
- GTK之任意拖动窗口中的按钮
- DeepLearning | Broad Learning System 宽度学习系统 : 高效增量式浅层神经网络
- Inno Setup 介绍
- ATX电源短接哪两个引脚可以开机
- Java若伊是啥_java运行环境和运行机制
- Java 下载 Excel文件打不开
- 洛谷P3975 [TJOI2015]弦论
- MVC、MVVM、MVP
- SSL加密与分布式IM系统-InChat1.1.3版本试用说明
- 配置 FoxyProxy 规则自由切换代理模式
- 我大学时代的文章,大学我很怀念!
- 关于实现3D立体旋转效果的轮播视图
- 北大青岛_深圳嘉华_shell特殊变量演示(六)总结