内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类。如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液、跳动)。

显然,此处不能单方面用属性或者方法表示一个心脏,而需要一个类。

而心脏又在人体当中,正如同是内部类在外部内当中。

实例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() 可以用来生成内部类的对象,这种方法存在两个小知识点需要注意:

  1. 开头的 Out 是为了标明需要生成的内部类对象在哪个外部类当中。
  2. 必须先有外部类的对象才能生成内部类的对象,因为内部类的作用就是为了访问外部类中的成员变量。
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 中的内部类介绍相关推荐

  1. java 为什么有匿名类_全面了解Java中的内部类和匿名类

    Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了 ...

  2. Java中List集合介绍(炒鸡详细呦)

    Java中List集合介绍 文章目录 Java中List集合介绍 1,Java集合介绍 2,List介绍 2.1 ArrayList集合 2.2 LinkedList集合 3,List常用方法 3.1 ...

  3. Java学习笔记二十:Java中的内部类

    Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...

  4. java中ThreadPool的介绍和使用

    文章目录 Thread Pool简介 Executors, Executor 和 ExecutorService ThreadPoolExecutor ScheduledThreadPoolExecu ...

  5. Java中BigDecimal类介绍及用法

    Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高 ...

  6. javac 与java_javac中使用-d,以及javac / java中使用-cp介绍

    javac中使用-d,以及javac / java中使用-cp介绍 发布时间:2019-01-15 20:39, 浏览次数:555 , 标签: javac java cp * 一般生成把java编译成 ...

  7. java中Cookie详细介绍

    Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是 ...

  8. java try catch_异常处理,JAVA中异常处理的介绍

    异常处理的介绍 在Java程序的运行过程中,如果Java虚拟机检测出一个无法执行的操作,就会产生运行时错误(runtime error) 在Java中,运行时错误会作为异常来抛出. 抛出的异常是一个对 ...

  9. Java中所有锁介绍

    在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 1.公平锁 / 非公平锁 2.可重入锁 / 不可重入锁 3.独享锁 / 共享锁 4.互斥锁 / 读 ...

最新文章

  1. kotlin重写构造方法编译报错:Primary constructor call expected
  2. 【mysql】关于事务的隔离级别
  3. 多个python文件相互调用_用 python提取两个文件之间的内容
  4. 排除网络故障课后习题参考答案
  5. Day 3 in India
  6. 【译】谨慎使用CSS中的波浪选择器
  7. 字体怎么安装到电脑上_文章还在使用电脑上的固定字体?这款字体软件超好用...
  8. GTK之任意拖动窗口中的按钮
  9. DeepLearning | Broad Learning System 宽度学习系统 : 高效增量式浅层神经网络
  10. Inno Setup 介绍
  11. ATX电源短接哪两个引脚可以开机
  12. Java若伊是啥_java运行环境和运行机制
  13. Java 下载 Excel文件打不开
  14. 洛谷P3975 [TJOI2015]弦论
  15. MVC、MVVM、MVP
  16. SSL加密与分布式IM系统-InChat1.1.3版本试用说明
  17. 配置 FoxyProxy 规则自由切换代理模式
  18. 我大学时代的文章,大学我很怀念!
  19. 关于实现3D立体旋转效果的轮播视图
  20. 北大青岛_深圳嘉华_shell特殊变量演示(六)总结

热门文章

  1. 北大高材生割美国韭菜被FBI通缉?本人回应予以否认
  2. 视学算法第五轮送书活动获奖名单
  3. 使用Pyecharts制作Bar3D用法详解
  4. python之⾯向对象-多态
  5. 爬虫-selenium初步学习与使用!
  6. APS:大型多模态室内摄像机定位系统
  7. WCF学习笔记(基于REST规则方式)
  8. 公开课视频-《第04章 部署-Microsoft-服务器虚拟化-Hyper-V 2012 R2》
  9. ExtJs grid合并单元格
  10. 为特定用户创建监牢 chroot