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. spark-shell启动spark报错

    前言 离线安装好CDH.Coudera Manager之后,通过Coudera Manager安装所有自带的应用,包括hdfs.hive.yarn.spark.hbase等应用,过程很是波折,此处就不 ...

  2. 为什么JavaScript声明变量的时候鼓励加var关键字

    在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它. var x = "XX"; y ="xx ...

  3. 【AtCoder Grand Contest 001F】Wide Swap [线段树][拓扑]

    Wide Swap Time Limit: 50 Sec  Memory Limit: 512 MB Description Input Output Sample Input 8 3 4 5 7 8 ...

  4. Python练习-sys.argv的无聊用法

    代码如下: # 编辑者:闫龙 #将三次登陆锁定的作业改为: # python login.py -u alex -p 123456 输入的形式 # (-u,-p是固定的,分别代表用户名和密码) imp ...

  5. jQuery 库的优缺点

    通用性良好,适合大多数常规网站,省去了为浏览器兼容性写封装函数的麻烦(1+版本支持IE6.7.8,2+版本支持包括IE9在内的现代浏览器). 通用性良好意味着特异性不好,所以jQuery并不适合特异性 ...

  6. 手动刷入Android 4.4.1 KOT49E OTA更新包

    一.Android 4.4 KitKat Google前段时间发布了Android新版本Android 4.4 KitKat,由于我的Nexus 4也是托朋友从US带回来的,所以很快就收到了Googl ...

  7. Spring4笔记4--基于XML的DI(依赖注入)

    基于XML的DI(依赖注入): Bean 实例在调用无参构造器创建了空值对象后,就要对 Bean 对象的属性进行初始化.初始化是由容器自动完成的,称为注入.根据注入方式的不同,常用的有两类:设值注入. ...

  8. sicily 1500. Prime Gap

    Description The sequence of n ? 1 consecutive composite numbers (positive integers that are not prim ...

  9. Splay算法摘要

    先介绍变量定义 int n; struct Node { //Splay节点定义 ],val,num,siz; //fa:它爸爸:son它儿子,左0右1:val:这个节点的值 //num:这个值的数量 ...

  10. restful API 规范(转)

    1. URI URI 表示资源,资源一般对应服务器端领域模型中的实体类. URI规范 不用大写: 用中杠-不用下杠_: 参数列表要encode: URI中的名词表示资源集合,使用复数形式. 资源集合 ...