Java学习笔记19---内部类之简介成员内部类、局部内部类及匿名内部类
内部类,顾名思义,即定义在某个类内部的类,称包含该内部类的类为外部类。
从定义的位置来说,分为成员内部类和局部内部类;从类的特征来说,分为匿名内部类和静态内部类。
今天先简要介绍一下前三种内部类的定义及简单使用。
如需转载请注明出处,谢谢:
http://www.cnblogs.com/chanchan/p/8235169.html
1.成员内部类
成员内部类可看成外部类的一个成员,定义的位置与外部类的其他成员一样,只不过它是个类而已。
示例:
类Person中定义了一个成员内部类InnerClass,具体如下:
private String hobby;
//笔记19:内部类--成员内部类
class InnerClass {
String name; void printInC() {
System.out.println("inner class");
} void printPriVar() {
System.out.println("hobby:" + hobby);
}
}
// public static void main(String[] args) { Person per = new Person(); //笔记19:内部类--成员内部类
Person.InnerClass inC = per.new InnerClass();
inC.printInC();
inC.printPriVar();
}
输出结果为:
inner class
hobby:null
分析:
(1).成员内部类可以访问外部类的private成员,当然也可以访问其他权限的成员;
也可以由访问权限修饰符来修饰。
(2).Person.InnerClass inC = per.new InnerClass();
该行定义了一个内部类的对象inC,可推知:
1>.成员内部类的类型为 外部类名.内部类名
2>.创建成员内部类对象时,要先创建一个外部类对象,再由该外部类对象使用.new来创建内部类对象;
即,成员内部类是依附于外部类的,必须由一个外部类的实例来完成对内部类对象的创建;
从这里也能理解为什么可以把成员内部类看成外部类的一个成员:一个类的非静态成员必须等创建类的实例后才会分配空间,成员内部类也类似。
2.局部内部类
局部内部类是定义在方法体与作用域内的内部类,可与局部变量类比。
示例:
类Person的成员方法localInClass中定义了一个内部类LoInnerClass,具体如下:
//笔记19:内部类--局部内部类
public void localInClass() {
class LoInnerClass {
void printLI() {
System.out.println("local inner class");
}
}
LoInnerClass lInC = new LoInnerClass();
lInC.printLI();
}
// public static void main(String[] args) { Person per = new Person(); //笔记19:内部类--局部内部类
per.localInClass();
}
输出结果为:
local inner class
分析:
(1).局部内部类的作用域为定义它的方法体内,其他地方不可见,同局部变量。
(2).局部内部类不可以由访问权限修饰符修饰;既然其作用域只在方法体内,由访问权限修饰符修饰也没什么意义。
(3).局部内部类对象的创建不依赖于外部类,同一般类。
前面两种内部类是从定义位置来划分的,成员内部类可看成类的成员,局部内部类可看成局部变量。这两种类都有名有姓,与一般类还比较相似,只是定义位置比较特殊。下面要说的匿名内部类就更特殊,它连名字都没有,来看看具体怎么操作吧。
3.匿名内部类
匿名内部类属于局部内部类,可以作为返回值或参数,直接看示例比较直观。
示例中的AnoInnerClass是一个接口,代码如下:
package human; public interface AnoInnerClass {
void printAnoI();
}
示例1:作为返回值
//笔记19:内部类--匿名内部类--作为返回值
public AnoInnerClass anonymousClass() {
return new AnoInnerClass () {
public void printAnoI() {
System.out.println("anonymous inner class:return value");
}
};
} public static void main(String[] args) { Person per = new Person(); //笔记19:内部类--匿名内部类--作为返回值
AnoInnerClass anoInC = per.anonymousClass();
anoInC.printAnoI();
}
输出结果为:
anonymous inner class:return value
分析:
(1).先来看12和15行,12行创建一个Person类的对象per,15行定义AnoInnerClass类型的对象引用anoInC,并指向了per调用anonymousClass后的返回值;
成员方法anonymousClass的返回值是AnoInnerClass类型,由于AnoInnerClass类型是接口,是无法实例化的,所以返回的值必须是某个实现了该接口的类的实例,这里,这个实现了接口AnoInnerClass的类就是匿名内部类,参见3-7行;
该匿名内部类的具体内容就跟在new AnoInnerClass()后面,以{}括起来;
(2).这里还涉及到向上转型的问题
由于匿名内部类没有类名,所以第2行返回值的类型也是写得内部类的父类接口AnoInnerClass,实际返回的是匿名内部类的实例,把该实例赋给了父类的对象引用。
示例2:作为参数
//笔记19:内部类--匿名内部类--作为参数--重载
public void anonymousClass( AnoInnerClass anoInC ){
anoInC.printAnoI();
}
// public static void main(String[] args) { Person per = new Person(); //笔记19:内部类--匿名内部类--作为参数--重载
per.anonymousClass(new AnoInnerClass() {
public void printAnoI() {
System.out.println("anonymous inner class:argument");
}
});
}
输出结果为:
anonymous inner class:argument
分析:
(1).与示例1不同的是,匿名内部类作为参数时,是在实际调用时实现的,也就是说匿名内部类是实参。
(2).其他地方与示例1大同小异。
从示例1和示例2也可以看出来,匿名内部类是属于局部内部类的。
匿名内部类没有名字,它必须要继承一个父类或实现一个接口,且只能继承或实现一个父类或接口;否则作为返回值时,返回值类型就不知道怎么表示了,作为参数时,参数类型也没法表示了。
PS:
这段时间确实有点事情,但主要是懒癌发作,拖了1个月才找回状态,实在惭愧!!!
Java学习笔记19---内部类之简介成员内部类、局部内部类及匿名内部类的更多相关文章
- Java学习笔记20---内部类之对成员内部类的补充说明(一)
上篇文章--笔记19简要介绍了成员内部类.局部内部类和匿名内部类,下面对成员内部类再补充一些内容. 主要有以下6点: 1.成员内部类不可以有静态成员,成员变量为static final时除外 2.外部 ...
- Java学习笔记21---内部类之对成员内部类的补充说明(二)
上篇文章--笔记20补充说明了前四点,这里接着来说剩下的两点. 要点如下: 5.访问权限修饰符可以修饰成员内部类 1).访问权限修饰符对内部类的访问限制与外部类的一般成员遵循一样的规则,具体请参考笔记 ...
- Java学习笔记(1)--- 简介
简介: 注:和之前的C不一样,本人没有学过java,所以内容上可能会相对详细一些. 主要特性: 1.这跟c++一样是面对对象语言: Java语言提供类.接口和继承等面向对象的特性,为了简单起见,只支持 ...
- Java学习笔记19(String类)
String代表字符串,在Java中,所有的字符串字面值都作为此类的实例实现 字符串的特点以及简单的原理分析: package demo; /* * String类的特点: * 所有的"&q ...
- java学习笔记19(Arrays类)
Arrays类: 此类包含用来操作数组的各种方法(比如升序和搜索): import java.util.Arrays; public class Demo { public static void m ...
- Java学习笔记之---内部类
Java学习笔记之---内部类 (一)成员内部类 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化 内部类的访问修饰符可以任意,但是访问范围会受到影响 内部类可以直接访问外部类的成员, ...
- Java学习笔记23---内部类之局部内部类只能访问final的局部变量
局部内部类是定义在方法体或代码块中的类,在笔记19中已有过简单介绍. 今天要讨论的是局部内部类为什么只能访问为常量的局部变量. 作者: 博客园--蝉蝉 请尊重作者劳动成果,转载请在标题注明“转载”字样 ...
- Java基础进阶:内部类lambda重点摘要,详细讲解成员内部类,局部内部类,匿名内部类,Lambda表达式,Lambda表达式和匿名内部类的区别,附重难点,代码实现源码,课堂笔记,课后扩展及答案
内部类lambda重点摘要 内部类特点: 内部类可以直接访问外部类,包括私有 外部类访问内部类必须创建对象 创建内部对象格式: 外部类.内部类 对象名=new外部类().new内部类(); 静态内部类 ...
- 0027 Java学习笔记-面向对象-(非静态、静态、局部、匿名)内部类
内部类 内部类就是把一个类写在另一个类的内部 用途: 如果一个类只希望它被某一个类访问,那么可以把它定义在另一个类的内部,并用private修饰 内部类可以访问它所在外部类的private成员:但所在 ...
随机推荐
- django同时查询两张表的数据,合并检索对象返回
原始需求: 1.一篇文章内容分N个版块,每篇文章的版块数量不同. 2.有个文章搜索功能,需要同时搜索标题和内容. 实现思路: 1.由于每篇文章的内容版块数量不同,因此将每个文章的标题和内容分开存入2张 ...
- ubuntu14.04 升级mysql到5.7版本
Ubuntu14.04默认安装的是mysql5.5,由于开发需要支持utf8mb4,因此需要升级到mysql5.7 默认情况下,apt是无法直接升级到mysql5.7的,因此需要额外设置 首先,备份数 ...
- javascript实时保存时出现改动多条记录的bug
文章实现编辑,编辑页面是右側弹出层,当有改动时就保存,对文章标题title加入改变change事件,有改变时就保存文章(saveArticle) $("#title").chang ...
- UVA 10465 Homer Simpson(全然背包: 二维目标条件)
UVA 10465 Homer Simpson(全然背包: 二维目标条件) http://uva.onlinejudge.org/index.php? option=com_onlinejudge&a ...
- SDUTOJ 贪心 -商人小鑫
题目描写叙述 小鑫是个商人,当然商人最希望的就是多赚钱.小鑫也一样. 这天,他来到了一个遥远的国度.那里有着n件商品,对于第i件商品须要付出ci的价钱才干得到. 当然.对于第i件商品,小鑫在自己心中有 ...
- 报表开发之扩展GROUP BY
在实际运用中.比方在数据仓库中,常常须要对数据进行多维分析.不仅须要标准分组的结果(相当于 GROUP BY),还须要不同维度的小计(简单 GROUP BY 中取部分列分组)和合计(不分组).从而 提 ...
- Matlab 2014b For Mac安装破解
1.Matlab 2014b 的安装和破解文件下载: 安装文件:http://www.cncrk.com/downinfo/80718.html 破解文件:http://pan.baidu.com/s ...
- 为什么说要搞定微服务架构,先搞定RPC框架?
今天开始聊一些微服务的实践,第一块,RPC框架的原理及实践,为什么说要搞定微服务架构,先搞定RPC框架呢? 一.需求缘起 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队 ...
- 获取AJAX加载的内容
1.有些网页内容使用AJAX加载,AJAX一般返回的是JSON,直接对AJAX地址进行post或get,就返回JSON数据了. 2.用抓包工具分析https://movie.douban.com/j/ ...
- Nginx优点
1.高并发响应性能非常好,官方Nginx处理静态文件并发5w/s 2.反向代码性能非常强(可用于负载均衡) 3.内存和cpu占比率低(为Apache的1/5-1/10); 4.对后端服务有健康检查功能 ...