Java 从入门到进阶之路(十六)
在之前的文章我们介绍了一下 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 类型。
Java 从入门到进阶之路(十六)的更多相关文章
- Java 从入门到进阶之路(六)
之前的文章我们介绍了 Java 的数组,本章我们来看一下 Java 的对象和类. Java 是一种面向对象语言,那什么是对象呢,对象在编程语言中属于一个很宽泛的概念,我们可以认为万事万物都是对象,每个 ...
- Java 从入门到进阶之路(十)
之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承. 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继 ...
- Java 从入门到进阶之路(十二)
在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...
- Java 从入门到进阶之路(十五)
在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...
- Java 从入门到进阶之路(十四)
在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...
- Java 从入门到进阶之路(十九)
在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类. 在 Java 中有八个基本类型:byte,short,int,long,float,double,ch ...
- Java 从入门到进阶之路(二十)
在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...
- Java 从入门到进阶之路(二十二)
在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator. 当我们创建 ...
- Java 从入门到进阶之路(十八)
在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object. 在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更 ...
随机推荐
- javascript_19-DOM初体验
DOM DOM: 文档对象模型(Document Object Model),又称为文档树模型.是一套操作HTML和XML文档的API. DOM可以把HTML和XML描述为一个文档树.树上的每一个分支 ...
- Python 依赖版本控制 (requirements.txt 文件生成和使用)
requirements.txt 最好配合虚拟空间使用, 虚拟空间的使用请参考 Python 虚拟空间的使用 - 难以想象的晴朗. requirements.txt 可以保证项目依赖包版本的确定性, ...
- Flask之WTfroms组件
一.WTfroms简介 WTForms插件是类似于django的form组件的插件,可以帮我们写标签,校验数据等. 二.安装与使用 安装: pip install WTForms 使用: from w ...
- 数据库事务和锁(三)——INNODB_LOCKS, INNODB_LOCK_WAITS, INNODB_TRX表的简单介绍
INNODB_LOCKS, INNODB_LOCK_WAITS, INNODB_TRX是MYSQL中事务和锁相关的表.通常我们遇到事务超时或锁相关问题时,直接运行下面SQL语句即可进行简单检查: -- ...
- acrobat 导出300dpi图片
文件-导出-图象-jpeg 设置 分辨率118.11像素/厘米
- Optaplanner与Google OR-Tools的区别
在规划相关的项目工作中,近两年我们的项目主要使用的是Optaplanner作为规划引擎,其核心也是一个的规划求解器(Solver).但作为另一个著名开源求解器Google OR-Tools(下称OR- ...
- Count the Colors 线段树
题目 参考博客地址 题意: n范围[1,8000] , li 和 ri 的范围[0,8000]. n个操作,每个操作是把 [li , ri]内的点修改成一个颜色c. n个操作过后,按颜色从小到大 ...
- matlab运行程序时出现failed to start a parallel pool
运行matlab做并行时得到如下报错: failed to start a parallel pool. (For information in addition to the causing err ...
- 学习Spring-Data-Jpa(六)---spring-data-commons中的repository
1.spring-data-commons项目 spring-data-commons项目是所有spring-data项目的核心,我们来看一下该项目下的repository包中的接口和注解. 2.Re ...
- [Kubernetes] Defining a Pod with YAML
1. Define a yml file: nginx.pod.yml: apiVersion: v1 kind: Pod metadata: name: my-nginx labels: app: ...