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之后,会发现编译器报了一个错
![](http://images2015.cnblogs.com/blog/1014798/201609/1014798-20160924161309856-643970765.png)
不能访问到非静态的域。
这样的情况出现,我们就更清晰明了了,因为我们会发现它和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 里的内部类的更多相关文章

  1. java基础之 内部类

    Java中的内部类共分为四种: 静态内部类static inner class (also called nested class) 成员内部类member inner class 局部内部类loca ...

  2. JAVA 第二天 内部类

    package com.company; /** * Created by Administrator on 2016/8/23. */ public class Outter {//生成的字节码文件 ...

  3. Java 中的内部类

    前言 在第一次把Java 编程思想中的内部类这一章撸完后,有点印象.大概知道了什么时内部类,局部内部类,匿名内部类,嵌套内部类.随着时间的推移,自己慢慢的就忘记了,总感觉自己思考的东西不多,于是 看了 ...

  4. Java中的 内部类(吐血总结)

    1. 内部类的作用 内部类是一个独立的实体,可以用来实现闭包:能与外部类通信:内部类与接口使得多继承更完整 2. 内部类的分类 1)普通内部类 类的实例相关,可以看成是一个实例变量.内部类的类名由 “ ...

  5. Java Nested Classes(内部类~第一篇英文技术文档翻译)

    鄙人最近尝试着翻译了自己的第一篇英文技术文档.Java Nested Classes Reference From Oracle Documentation 目录 嵌套类-Nested Classes ...

  6. 【转】Java中的内部类和匿名类

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

  7. Java Inner Class 内部类

    内部类  Inner Class 一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分. Java中的内部类共分为四种: 静态内部类static inner class ( ...

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

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

  9. Java基础(五)--内部类

    内部类简单来说就是把一个类的定义放到另一个类的定义内部 内部类分为:成员内部类.局部内部类.匿名内部类.静态内部类 成员内部类:最常见的内部类 public class Outter { privat ...

随机推荐

  1. Matlab debug

    输入彩色,imwrite保存黑白图片,imwrite的维度错误. 程序如下,正常图像,少了一个维度imwrite,把图片展开,是一个二维的灰色图像(R=G=B),.如果限定了第二维,也是一个灰色图像. ...

  2. Webpack的安装、配置与执行

    先用npm安装 npm install webpack -g 然后在项目路径下进行项目安装 npm init # 会自动生成一个package.json文件 npm install webpack - ...

  3. java学习第01天(搭建环境配置)

    搭建环境配置分为3个步骤 1.下载并安装 jdk使用1.8.0_151版本,下载地址(包含32位和64位):链接:https://pan.baidu.com/s/1qZau8oO 密码:0t5o 2. ...

  4. UITableView--文档版

    CHENYILONG Blog UITableView Fullscreen   UITableView技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http: ...

  5. Mother's Mil 母亲的牛奶

    Description 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装 ...

  6. vue项目的配置

    1.第一首先我们先安装:visual studio code开发环境,可以换成中文版的. 2.安装note.js   下载链接:https://nodejs.org/en/ 3.安装npm使用淘宝镜像 ...

  7. faskclick

        PC网页上的大部分操作都是用鼠标的,即响应的是鼠标事件,包括mousedown.mouseup.mousemove和click事件.一次点击行为,事件的触发过程为:mousedown -> ...

  8. 线段树区间更新(set暴力)

    题目链接:https://cn.vjudge.net/contest/66989#problem/I 具体思路:使用栈存储村庄被损坏的顺序,然后set存的是被损坏的村庄,然后每一次查询,直接找到要查询 ...

  9. 使用Picker的时候,让input输入框使用焦点,手机键盘不弹出

    $("#address").click(function(){ document.activeElement.blur(); })

  10. Redis—数据结构之list

    Redis的列表对象底层所使用的数据结构其中之一就是list. list Redis的list是一个双端链表,其由3部分构成:链表节点.链表迭代器.链表.这一设计思想和STL的list是一样的,STL ...