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包下面的类都不了解,怎么混.后来在 ...
随机推荐
- jquery ajax beforeSend 提交等待问题
需要使用异步加载async : true 否则不会出现等待效果 $.ajax({ url : $('#form').attr("action"), data: $('#form') ...
- 全文搜索 Lucene.Net
Lucene简介 首先说明的是--Lucene.Net只是一个全文检索开发包,不是一个成型的搜索引擎, 它的功能就是负责将文本数据按照某种分词算法进行切词,分词后的结果存储在索引库中,从索引库检索数据 ...
- 深入理解javascript原型和闭包(8)——简述【执行上下文】上
什么是“执行上下文”(也叫做“执行上下文环境”)?暂且不下定义,先看一段代码: 第一句报错,a未定义,很正常.第二句.第三句输出都是undefined,说明浏览器在执行console.log(a)时, ...
- Raid与DAN、SAN、NAS基础
一. 磁盘基本知识 1. Raid分类 Raid磁盘阵列是由多个磁盘组合成的磁盘组,可将数据分割成许多区段,分别存放在各个磁盘上:同时利用不同排列技术,可提高磁盘性能和数据安全性.下列简单介绍几种Ra ...
- TopHat
What is TopHat? TopHat is a program that aligns RNA-Seq reads to a genome in order to identify exon- ...
- js创建,获取,检测cookie
- 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- php中几个字符串替换函数详解
在php中字符替换函数有几个如有:str_replace.substr_replace.preg_replace.preg_split.str_split等函数,下面我来给大家总结介绍介绍. 一.st ...
- Android中的动画机制
1 逐帧动画 逐帧动画 就是一系列的图片按照一定的顺序展示的过程. 逐帧动画很简单, 只需要在drawable中或者anim中定义一个Animation-list 其中包含多个it ...
- espcms特殊标签
内页banner图从后台调用分类图片 <div style="background:url({%$rootdir%}{%find:type class=$type.topid out= ...