在之前的文章我们介绍了一下 Java 中类的多态,本章我们来看一下 Java 中类的内部类。

在 Java 中,内部类分为成员内部类和匿名内部类。

我们先来看一下成员内部类:

1、类中套类,外面的叫外部类,里面的叫内部类

2、内部类通常只服务于外部类,对外不具备可见性

3、内部类对象通常是在外部类中创建

4、内部类可直接访问外部类成员,包括私有的。因为内部类中有个隐式的引用指向创建它的外部类对象。

具体代码如下:

 public class HelloWorld {
public static void main(String[] args) {
Mother mother = new Mother();
mother.show();
}
} class Mother { // 外部类
private int age = 10; void show() {
Son son = new Son(); // 可在外部类中创建
son.test();
} class Son { // 内部类
void test() {
System.out.println(age); //
System.out.println(Mother.this.age); // 10 隐式的引用指向创建它的外部类对象
System.out.println(this.age); // 编译错误
}
}
} class Test {
void show() {
Mother mother = new Mother();
Son son = new Son(); // 编译错误,内部类不具备可见性
}
}

在实际开发中,我们很少会用到成员内部类的写法,通常情况下会用到匿名内部类,如下代码:

 public class HelloWorld {
public static void main(String[] args) { // Mother mother = new Mother(); // 编译错误,接口不能实例化 /**
* 1、系统创建了 Mother 的一个子类,没有名字
* 2、为该子类创建了一个对象,叫 mother
* 3、大括号中的为子类的类体
* */
Mother mother = new Mother() {
};
}
} interface Mother { }

在之前我们说过接口能不能被实例化,否则会出现编译错误,但如果我们在实例化的接口后面添加一对大括号,系统则会隐式地为我们创建一个子类,这样就不会出现编译错误了,我们可以再形象地来看一下上面的解释,如下代码:

 public class HelloWorld {
public static void main(String[] args) { // 向上造型
Mother mother1 = new Son();
mother1.show(); // son final int num = 10;
// 匿名内部类
Mother mother2 = new Mother() {
public void show() {
System.out.println("mother"); // mother
System.out.println(num); // num
}
};
mother2.show(); // mother
}
} interface Mother {
void show();
} class Son implements Mother {
public void show() {
System.out.println("son");
}
}

在上面的代码中,我们可以通过之前讲过的向上造型的方法,重写 Mother 中的 show() 方法来实现程序的正常运行,同时我们也可以通过上面说的匿名内部类的方法来实现,即在实例后面添加一对大括号,并将 Mother 内的 show() 方法重写,这样所运行的结果和向上造型的实现结果是一样的。

匿名内部类:

1、如果想创建一个类的对象,并且对象只被创建一次,此时该类不必命名,称为匿名内部类。

2、匿名内部类中访问外部的数据,该数据必须是 final 类型。

最新文章

  1. python django基础(二)
  2. Web之路笔记之二 - CSS Positioning
  3. AC日记——简单密码 openjudge 1.7 10
  4. HDU 5762 Teacher Bo (鸽笼原理) 2016杭电多校联合第三场
  5. js 添加广告
  6. 晶振波形、MIPI波形
  7. javascript 中的this
  8. SpringBoot应用的属性管理
  9. Apt下载安装包时Hash校验和不符
  10. cnn神经网络入门
  11. LightGBM介绍及参数调优
  12. 三层结构与MVC
  13. 使用import简化spring的配置 spring import 标签的解析 使用import或加载spring配置时,报错误There is no ID/IDREF 多个Spring配置文件import resource路径配置
  14. 手动实现一个简单的ArrayList
  15. C#中http请求下载的常用方式demo
  16. 浏览器根对象window之值为数值的属性
  17. Java50道经典习题-程序23 求岁数
  18. 一个servlet如何处理多个请求
  19. 20155210潘滢昊 2016-2017-2 《Java程序设计》第2周学习总结
  20. 【剑指offer】把二叉树打印成多行,C++实现

热门文章

  1. 限制mongoDB内存的方法
  2. c# Path类
  3. IDEA实用教程(九)—— 创建Servlet
  4. 【转】An introduction to using and visualizing channels in Go
  5. Oracle 查询结果去重保留一项
  6. 浮点数转成字符串函数gcvt()
  7. LightOJ - 1236 - Pairs Forming LCM(唯一分解定理)
  8. 2.1 什么是C++
  9. 最长不下降子序列 nlogn && 输出序列
  10. Apache Kylin在4399大数据平台的应用