java 里的内部类
java里的内部类通常能帮我们隐藏一些具体实现,体现良好的封装效果。
内部类又分几种:
1.普通内部类
2.局部内部类
3.匿名内部类
4.静态内部类
普通内部类
先来看第一种普通的内部类,这种内部类就非常简单了,就是将一个类的声明放在另一个类的内部
class Outer{
//外部类
class Inner{
//内部类
}
}
这样的话就可以声明出一个普通的内部类

但是在内部类声明的同时,该内部类会追踪到外部类的引用,因此,内部类可以访问到外部类的所有的域和方法,包括private声明的域和方法,换个说法来说也就是外部类里的所有的域和方法对于内部类来说都是可见的。
class Outer{
//外部类
private int i = 1;
class Inner{
//内部类
public void func(){
System.out.println(i);
}
}
}
这样的写法是不会有任何的编译时报错的
这样恰巧证明了内部类是可以访问到外部类所有的域和方法
那么,我们怎样去创建一个内部类的对象呢?
废话不多说我们直接代码说话
public class Main {
public static void main(String[] args){
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
}
}
由于 Inner是内嵌在Outer里的,所以我们必须要声明整个Outer才能加载inner的这块内存,因此我们必须先创建Outer的对象,再来使用Outer的引用new出inner的对象。这样的话我们就持有inner对象的引用了
静态内部类
普通内部类介绍完了再来看静态内部类,这个内部类和普通内部类没什么区别,区别只是多了一个static关键字,为表明它是静态的,加上这个关键字以后,它不能持有外部类的引用了,并且不能访问到外部类的非静态方法和域。
我们将上面的代码加做修改
```
class Outer{
//外部类
private int i = 1;
static class Inner{
//内部类
public void func(){
System.out.println(i);
}
}
}
```
我们把它声明为static之后,会发现编译器报了一个错

不能访问到非静态的域。
这样的情况出现,我们就更清晰明了了,因为我们会发现它和static修饰字段和方法的作用是差不多的。除此之外,它和普通的内部类就没有什么区别了。
下面我们来看一下静态内部类怎样去创建一个对象
```
public class Main {
public static void main(String[] args){
Outer.Inner inner = new Outer.Inner();
}
}
```
由于静态内部类是一块独立的静态内存,因此我们可以直接这样去声明它,并且不用依靠外部类的对象
局部内部类
所谓的局部内部类就是声明在方法体里的内部类,或者声明在某个作用域里的内部类
```
class Outer{
//外部类
private int i = 1;
public void func(){
class Inner{
public Inner innerFunc(){
System.out.println(i);
return new Inner();
}
}
}
}
```
或者你也可以将类定义在随意的一个作用域里,比如if语句
```
class Outer{
//外部类
private int i = 1;
public void func(){
if(true){
class Inner{
public Inner innerFunc(){
System.out.println(i);
return new Inner();
}
}
}
else{
//
}
}
}
```
匿名内部类
在讲解这个之前,试问你们有没有见过new 一个接口,相信大家已经见过很多次了吧,但是java里明确的规定接口是不能被创建对象的,但是下面这个例子却能够正常的运行
```
public class Main {
public static void main(String[] args){
Temp temp = new Temp(){
public void func(){
System.out.println("hello world");
}
};
}
}
interface Temp{
void func();
}
然后我们调用func();
temp.func();
接下来我们可以明确的看到控制台上打印出来的"hello world",那么这又是怎么回事呢,这就要涉及到我们要讲解的匿名内部类
首先这根本不是我们看到的那样new了接口,而是用了一个匿名的内部类去实现了这个接口,然后重写了func方法,最后将整个内部类向上转型为Temp,赋值给它的引用。
这样的话,能够轻松的帮助我们实现接口,但是有一个问题也接踵而来,那就是限制了代码的复用。
java 里的内部类的更多相关文章
- java基础之 内部类
Java中的内部类共分为四种: 静态内部类static inner class (also called nested class) 成员内部类member inner class 局部内部类loca ...
- JAVA 第二天 内部类
package com.company; /** * Created by Administrator on 2016/8/23. */ public class Outter {//生成的字节码文件 ...
- Java 中的内部类
前言 在第一次把Java 编程思想中的内部类这一章撸完后,有点印象.大概知道了什么时内部类,局部内部类,匿名内部类,嵌套内部类.随着时间的推移,自己慢慢的就忘记了,总感觉自己思考的东西不多,于是 看了 ...
- Java中的 内部类(吐血总结)
1. 内部类的作用 内部类是一个独立的实体,可以用来实现闭包:能与外部类通信:内部类与接口使得多继承更完整 2. 内部类的分类 1)普通内部类 类的实例相关,可以看成是一个实例变量.内部类的类名由 “ ...
- Java Nested Classes(内部类~第一篇英文技术文档翻译)
鄙人最近尝试着翻译了自己的第一篇英文技术文档.Java Nested Classes Reference From Oracle Documentation 目录 嵌套类-Nested Classes ...
- 【转】Java中的内部类和匿名类
Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的 ...
- Java Inner Class 内部类
内部类 Inner Class 一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分. Java中的内部类共分为四种: 静态内部类static inner class ( ...
- Java学习笔记二十:Java中的内部类
Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...
- Java基础(五)--内部类
内部类简单来说就是把一个类的定义放到另一个类的定义内部 内部类分为:成员内部类.局部内部类.匿名内部类.静态内部类 成员内部类:最常见的内部类 public class Outter { privat ...
随机推荐
- Spring boot学习总结
引言之前也没有深入学习过spring框架,最近SpringBoot流行起来后想补下这方面的知识,于是照着SpringBoot官网上的英文教程开始helloworld入门,踩到几个小坑,记录下学习流程. ...
- 在mac环境下用QT使用OpenGL,glut,glfw
只需要在新建工程中.pro文件中添加: #opengl glut LIBS+= -framework opengl -framework glut 就可以使用glut了. 继续添加: ##glfw L ...
- 【codeforces】【比赛题解】#931 CF Round #468 (Div. 2)
因为太迟了,所以没去打. 后面打了Virtual Contest,没想到拿了个rank 3,如果E题更快还能再高,也是没什么想法. [A]Friends Meeting 题意: 在数轴上有两个整点\( ...
- 【记录】尝试用QEMU模拟ARM开发板去加载并运行Uboot,kernel,rootfs【转】
转自:https://www.crifan.com/try_use_qemu_emulate_arm_board_to_load_and_run_uboot_kernel_rootfs/ [背景] 手 ...
- HDU 2825 Wireless Password
题目链接:HDU-2825 题意:给出m个单词,要构造出满足包含其中大于等于k个单词的字符串,字符只包括小写字母,问长度为n的这样的串有多少个. 思路:令dp[i][j][k]表示当前已经构造了i个字 ...
- 读书笔记 effective c++ Item 48 了解模板元编程
1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...
- torchvision简介
安装pytorch时,torchvision独立于torch.torchvision包由流行的数据集(torchvision.datasets).模型架构(torchvision.models)和用于 ...
- vue实现结算淘宝购物车效果
实现单选时的价格,全选时价格 单选效果图 全选效果图 html <template> <!-- 淘宝结算购物车 --> <div class="settleme ...
- 在使用FastJson开发遇到的的坑
1.list中放入同一个对象,会出现内存地址引用{"$ref":"#[0]"},后台可以识别,但是前台不会识别 @Test public void testLi ...
- centos7 部署 seafile
=============================================== 2018/5/13_第1次修改 ccb_warlock == ...