Java的四种内部类
Java的四种内部类包括如下:
- 成员内部类
 - 静态内部类
 - 局部内部类
 - 匿名内部类
 
成员内部类:
定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类,......相当于外部类的非静态方法,如果被static修饰,就变成静态内部类了。
注意事项:
- 成员内部类中不能存在static关键字,即,不能声明静态属性、静态方法、静态代码块等。【非静态内部类也可以定义静态成员但需要同时有final关键词修饰,静态方法鉴于无法用final修饰,仍必须是在静态内部类 或者非内部类中定义。】
 - 创建成员内部类的实例使用:外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数),可以理解为隐式地保存了一个引用,指向创建它的外部类对象。
 - 在成员内部类中访问外部类的成员方法和属性时使用:外部类名.this.成员方法/属性。
 - 内部类在编译之后生成一个单独的class文件,里面包含该类的定义,所以内部类中定义的方法和变量可以跟父类的方法和变量相同。例如上面定义的三个类的class文件分别是:MyTest.class、Outer.class和Outer$Inner.class三个文件。
 - 外部类无法直接访问成员内部类的方法和属性,需要通过内部类的一个实例来访问。
 - 与外部类平级的类继承内部类时,其构造方法中需要传入父类的实例对象。且在构造方法的第一句调用“外部类实例名.super(内部类参数)”。
 
//成员内部类......相当于非静态方法
class Outer{
private int a = 3;
private Inner in;
public Outer(){
in = new Inner();
}
public int getInnerA(){
return in.a; // 引用内部类的变量,需通过实例
}
public class Inner {
public int a = 2;
public void doSomething() {
// 调用外部类的属性
System.out.println(MemberInner.this.a);// 这块要注意......很重要!!!
System.out.println(a);
}
}
} public class Test3 {
public static void main(String[] args) {
Outer.Inner inner = new Outer().new Inner();// 非静态内部类要new实例
inner.doSomething();
}
} class Extender extends Outer.Inner{
public Extender(Outer outer){
//外部类实例名.super(内部类参数列表)
outer.super();
}
}
静态内部类
使用static修饰的成员内部类叫静态内部类。
可以这样理解:与外部类同级的类,或者叫做外部类的静态成员。与成员内部类的对比如下:
| 
 说明  | 
 成员内部类  | 
 静态内部类  | 
| 
 静态成员  | 
 静态成员需同时有final关键词修饰  | 
 可以  | 
| 
 静态方法  | 
 不可定义  | 
 可以  | 
| 
 访问外部类非static属性/方法  | 
 外部类名.this.成员方法/属性  | 
 不可以  | 
| 
 外部类访问内部类  | 
 需要通过内部类的一个实例来访问  | 
 需要通过内部类的一个实例来访问  | 
| 
 创建实例  | 
 外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数)  | 
 外部类名.内部类名 实例名 = new 外部类名.内部类名(参数)  | 
| 
 编译后的class文件  | 
 单独的class文件(so内部类中的方法和变量可以跟父类的方法和变量同名),外部类$内部类.class  | 
 单独的class文件(so内部类中的方法和变量可以跟父类的方法和变量同名),外部类$内部类.class  | 
| 
 其他  | 
 与外部类平级的类继承内部类时,其构造方法中需要传入父类的实例对象。且在构造方法的第一句调用“外部类实例名.super(内部类参数)”  | 
 无  | 
局部内部类
定义在代码块、方法体内、作用域(使用花括号“{}”括起来的一段代码)内的类叫局部内部类。
- 局部内部类只能在代码代码块、方法体内和作用域中使用(如创建对象和使用类对象等)
 - 局部内部类访问作用域内的局部变量,该局部变量需要使用final修饰。
 - 可以使用abstract修饰,声明为抽象类。
 
匿名内部类
匿名内部类定义和实例化形式如下:
new 父类构造方法(参数){
//注:该方法名必须在父类中已经存在
修饰符 返回参数类型 方法名(参数列表){
。。。
}
}
- 只能使用一次,创建实例之后,类定义会立即消失(想要多次使用就要用到反射的知识了)
 - 必须继承一个类(抽象的、非抽象的都可以)或者实现一个接口。如果父类(或者父接口)是抽象类,则匿名内部类必须实现其所有抽象方法。
 - 不能是抽象类,因为匿名内部类在定义之后,会立即创建一个实例。
 - 不能定义构造方法,匿名内部类没有类名,无法定义构造方法,但是,匿名内部类拥有与父类相同的所有构造方法。
 - 可以定义代码块,用于实例的初始化,但是不能定义静态代码块。
 - 可以定义新的方法和属性(不能使用static修饰),但是无法显式的通过“实例名.方法名(参数)”的形式调用,因为使用new创建的是“上转型对象”(即父类声明指向子类对象)。
 - 是局部内部类,所以要符合局部内部类的要求。
 
| 
 说明  | 
 成员内部类  | 
 匿名内部类  | 
| 
 静态成员  | 
 静态成员需同时有final关键词修饰  | 
 不可定义  | 
| 
 静态方法  | 
 不可定义  | 
 不可定义  | 
| 
 访问外部类非static属性/方法  | 
 外部类名.this.成员方法/属性  | 
 外部类名.this.成员方法/属性  | 
| 
 外部类访问内部类  | 
 需要通过内部类的一个实例来访问  | 
 需要通过内部类的一个实例来访问  | 
| 
 创建实例  | 
 外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数)  | 
 如上:父类 实例名 = new 父类(){}  | 
| 
 编译后的class文件  | 
 单独的class文件(so内部类中的方法和变量可以跟父类的方法和变量同名),外部类$内部类.class  | 
 单独的class文件,使用类$数字.class  | 
| 
 其他  | 
 与外部类平级的类继承内部类时,其构造方法中需要传入父类的实例对象。且在构造方法的第一句调用“外部类实例名.super(内部类参数)”  | 
 无  | 
Java的四种内部类的更多相关文章
- Java的四种内部类(含代码实例)
		
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
 - java的四种内部类详解
		
引言 内部类,嵌套在另一个类的里面,所以也称为:嵌套类; 内部类分为以下四种: 静态内部类 成员内部类 局部内部类 匿名内部类 一.静态内部类 静态内部类: 一般也称"静态嵌套类" ...
 - 类与接口(二)java的四种内部类详解
		
引言 内部类,嵌套在另一个类的里面,所以也称为 嵌套类; 内部类分为以下四种: 静态内部类 成员内部类 局部内部类 匿名内部类 一.静态内部类 静态内部类: 一般也称"静态嵌套类" ...
 - java的四种内部类(转)
		
一般来说,有4中内部类:常规内部类.静态内部类.局部内部类.匿名内部类. 一.常规内部类:常规内部类没有用static修饰且定义在在外部类类体中. 1.常规内部类中的方法可以直接使用外部类的实例变量 ...
 - Java中的四种内部类
		
Java中有四种内部类: 成员内部类:定义在另一个类(外部类)的内部,而且与成员属性和方法平级,故称成员内部类.类比于外部类的非静态方法,如果用static修饰就变成了静态内部类 静态内部类:使用st ...
 - java内部类及四种内部类的实现方式
		
java内部类及四种内部类的实现方式 一.内部类定义:内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类. 二.为何要内部类?a.内部类提供了某种进入外围类的窗户.b.也是最吸引人的原因, ...
 - Java中四种访问权限总结
		
一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.protected,还有一种不带任何修饰符(default). 1. private: Java语言中对访 ...
 - Java中四种引用:强、软、弱、虚引用
		
这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...
 - java中四种引用类型
		
java中四种引用类型 今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在 ...
 
随机推荐
- Java创建对象的几种方法
			
有时候,也可能碰到这样面试题,如: Java创建对象有哪几种方法? 除了new之外,java创建对象还有哪几种方式? 本文结合例子,给出几种Java创建对象的方法,Here we go~~~~ 使用n ...
 - C# 的TCP  Socket (同步方式)
			
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
 - OC JS交互(通常情况下,如果网页写得正规的话,是可以正常交互的,之前就遇到后台写h5始终拿不到事件,元素也拿不到,更别说交互了,真是奇了怪了)
			
自动填充表单 @"document.getElementById('loginid').value = '这里填入你的用户名';document.getElementById('userpa ...
 - 数据存储_ SQLite(3)
			
SQLite的应用 一.简单说明 1.在iOS中使用SQLite3,首先要添加库文件 libsqlite3.dylib 2.导入主头文件 #import <sqlite3.h> 二.具体说 ...
 - Android开发-取消程序标题栏或自定义标题栏
			
注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 在Android开发中,跟据需要我们有时候需要自定义应用程序的标题栏或者取消程序的标题栏,下面本菜鸟在此记录与分享一下自己使用的方法 ...
 - 诸城模拟赛 dvd的逆序对
			
[题目描述] dvd是一个爱序列的孩子. 他对序列的热爱以至于他每天都在和序列度过 但是有一个问题他却一直没能解决 给你n,k求1~n有多少排列有恰好k个逆序对 [输入格式] 一行两个整数n,k [输 ...
 - 使用git status快速commit
			
提交之前使用git status可以看到将要提交的文件,如果想部分提交,需要单独commit.使用下面这句可以快速commit git commit `git status | grep 'mod' ...
 - 如何让自己的app尽量不被系统杀死
			
1. 在Service中重写下面的方法,这个方法有三个返回值, START_STICKY是service被kill掉后自动重写创建 @Override public int onStartComman ...
 - vuejs
			
简介 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易 ...
 - Python系统命令操作
			
系统命令 1.call 执行命令,返回状态码 ret = subprocess.call(['ls', '-l'], shell=False) ret = subprocess.call('ls -l ...