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 ...
随机推荐
- 2015/11/5用Python写游戏,pygame入门(5):面向对象的游戏设计
昨天的内容里有了运动的子弹,虽然我们只添加了一个子弹,但你可以看到我们需要记录子弹的x,y坐标,每次要更新它的坐标.如果我们想要有多颗子弹,就需要存储多个坐标.那时候处理起来就不显得那么简单,也许我们 ...
- zz 启动Matlab提示Microsoft Visual C++ 2005 Redistributable存在问题问题
帮助领导搞Matlab 2010a 绿色版; 领导把绿色版的文件夹挪了一下位置 (领导就是领导,做什么都按照自己的想当然的想法做) 然后, 脆弱的绿色版Matlab 2010a Portable就罢工 ...
- css文字超出显示省略号
单号: white-space:nowrap; overflow:hidden; text-overflow:ellipsis; 多行: word-break: break-all; text-ove ...
- Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location
spring-boot项目,生产环境运行一段时间后,上传图片报错,如下: threw exception [Request processing failed; nested exception is ...
- 【51nod】1766 树上的最远点对
[题意]给定n个点的树,m次求[a,b]和[c,d]中各选出一个点的最大距离.abcd是标号区间,n,m<=10^5 [算法]LCA+树的直径理论+线段树 [题解] 树的直径性质:距离树上任意点 ...
- mysql 数据范围总结
MEDIUMINT 带符号的范围是-8388608到8388607,无符号的范围是0到16777215,使用3个字节. 一般情况下推荐使用 unsigned (无符号,即只接受正整数)
- CSS 实现单边阴影
box-shadow: 0px -15px 10px -15px #111; 五个值分别为:x y blur spread color 将 spread 设置成 blur 的负值即可 这种只适用于 o ...
- Java NIO之拥抱Path和Files
Java面试通关手册(Java学习指南)github地址(欢迎star和pull):https://github.com/Snailclimb/Java_Guide 历史回顾: Java NIO 概览 ...
- popular short sentences
backward compatibility 向后兼容 archive 文档
- bind系统调用
/* * Bind a name to a socket. Nothing much to do here since it's * the protocol's responsibility to ...