在之前的文章我们介绍了一下 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 从入门到进阶之路(十六)的更多相关文章

  1. Java 从入门到进阶之路(六)

    之前的文章我们介绍了 Java 的数组,本章我们来看一下 Java 的对象和类. Java 是一种面向对象语言,那什么是对象呢,对象在编程语言中属于一个很宽泛的概念,我们可以认为万事万物都是对象,每个 ...

  2. Java 从入门到进阶之路(十)

    之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承. 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继 ...

  3. Java 从入门到进阶之路(十二)

    在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...

  4. Java 从入门到进阶之路(十五)

    在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...

  5. Java 从入门到进阶之路(十四)

    在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...

  6. Java 从入门到进阶之路(十九)

    在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类. 在 Java 中有八个基本类型:byte,short,int,long,float,double,ch ...

  7. Java 从入门到进阶之路(二十)

    在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...

  8. Java 从入门到进阶之路(二十二)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator. 当我们创建 ...

  9. Java 从入门到进阶之路(十八)

    在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object. 在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更 ...

随机推荐

  1. git学习:多人协作,标签管理

    多人协作: 查看远程库的信息, git remote 推送分支到远程库 git push origin master/dev 注意:master是主分支,时刻需要与远程同步 dev是开发分支,也需要与 ...

  2. XidianOJ 1154 Nhywieza 的串

    题目描述 输入 输出 对于每组数据输出 1 行,表示最少的操作次数. --正文 找到连续的0一起变就好 #include <iostream> #include <cstring&g ...

  3. swift学习之UI控件(一)

    // //  ViewController.swift //  test // //  Created by chuangqu on 15/7/23. //  Copyright (c) 2015年 ...

  4. iOS深入学习(再谈block)

    之前写过一篇博客,把Block跟delegate类比,说明了使用block,可以通过更少的代码实现代理的功能.那篇博客将block定义为类的property. 过了这么长时间,对于block的内容有了 ...

  5. 【转】larbin主要代码说明

    转自:http://blog.csdn.net/s030702614/article/details/5683928 1. 主函数: int main (int argc, char *argv[]) ...

  6. node.js + gulp用JENKINS作CI编译

    这里还是有点坑,要注意. 安装NODE.JS不说,GULP绿色化也不说. 但要让JENKINS识别环境变量. /etc/profile.... export NODE_HOME=/usr/local/ ...

  7. CollapsingToolbarLayout学习笔记

    CollapsingToolbarLayout包裹 Toolbar 的时候提供一个可折叠的 Toolbar,一般作为AppbarLayout的子视图使用. <?xml version=" ...

  8. JNI 对象处理 (转)

    JNI 的基本问题就是解决 Java 和 C++ 代码互相调用的通信问题,在 C++ 代码编写过程中最大的问题莫过于适应其中的代码编写规则,C++调用或是返回的内容必须遵守 JVM 和 C++ 代码的 ...

  9. 创建简单的npm脚手架

    前言 vue-cli, webpack-cli 等脚手架是不是用起来爱不释手?自己写了个模版每次来回复制粘贴代码是不是很难维护?如果你是对前端.Node操作有一定的了解,同时也存在以上疑问,那就请尽情 ...

  10. 树莓派 无屏幕 安装Ubuntu系统 无头安装 无显示器 用网线

    能看到此篇博客的人说明都尝试失败了,会发现内存卡刷入Ubuntu后,无法通过ssh操作树莓派.是因为官方的ubuntu系统在初次运行时需要设定一些东西,类似windows第一次启动也需要设置那样,如果 ...