Java:内部类
1、内部类的定义:
一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分。
2、内部类的分类:
Java中的内部类共分为四种:
成员内部类member inner class
局部内部类local inner class
匿名内部类anonymous inner class
静态内部类static inner class
2.1、成员内部类member inner class
成员内部类是最普通的内部类,它的定义为位于另一个类的内部
package inner; public class Outer {// 外部类
String outerLabel = "outer";
private int i = 1;
static int j = 11;
public void printOuterLabel(){
System.out.println(outerLabel+"\t"+i+"\t"+j);
}
class Inner{// 内部类
String innerLabel = "inner";
public void printInnerLabel(){
System.out.println(outerLabel+"\t"+innerLabel+"\t"+i+"\t"+j);
}
}
// 外部类调用内部类的引用,需要通过new关键字新建对象
public void printInner(){
Inner inner = new Inner();
inner.printInnerLabel();
}
public static void main(String[] args){
Outer outer = new Outer();
outer.printOuterLabel();
outer.printInner();
} }
输出
outer 1 11
outer inner 1 11
说明:
1.内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
2.内部类的对象只有在与其外部类的对象相关联的情况下才被创建
3.当内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是内部类的成员
当内部类需要访问外部类同名变量或者方法的时候,通过下面方法
外部类.this.成员变量
外部类.this.成员方法
package inner; public class Outer {// 外部类
String Label = "outer";
private int i = 1;
static int j = 11;
public void printLabel(){
System.out.println(Label+"\t"+i+"\t"+j);
}
class Inner{// 内部类
String Label = "inner";
public void printLabel(){
// 内部类中调用外部类的同名变量、方法
System.out.println(Outer.this.Label+"\t"+Label+"\t"+i+"\t"+j);
Outer.this.printLabel();
} }
// 外部类调用内部类的引用,需要通过new关键字新建对象
public void printInner(){
Inner inner = new Inner();
inner.printLabel(); // 内部类的方法
}
public static void main(String[] args){
Outer outer = new Outer();
outer.printLabel();
outer.printInner();
} }
输出
outer 1 11
outer inner 1 11
outer 1 11
在内部类需要生成外部类对象的引用,可以下面方法
外部类.this
这里在内部类获取了外部类的引用,就可以很方面的操作外部类
package inner; public class Outer {// 外部类
String Label = "outer";
private int i = 1;
static int j = 11;
public void printLabel(){
System.out.println(Label+"\t"+i+"\t"+j);
}
class Inner{// 内部类
public Outer outer(){
return Outer.this;
} }
// 外部类 返回内部类的引用
public Inner inner(){
return new Inner();
}
public static void main(String[] args){
Outer outer = new Outer();
Outer.Inner inner = outer.inner();
inner.outer().printLabel();
} }
当其他对象要创建内部类的对象时候需要通过
new 外部类().new 内部类()
package inner; public class Outer {// 外部类
String Label = "outer";
private int i = 1;
static int j = 11;
public void printLabel(){
System.out.println(Label+"\t"+i+"\t"+j);
}
class Inner{// 内部类
public Outer outer(){
return Outer.this;
} }
// 外部类 返回内部类的引用
public Inner inner(){
return new Inner();
}
public static void main(String[] args){
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.outer().printLabel();
} }
输出和上面一样
通过.new 访问内部类,而内部类又是返回外部类的对象,通过这个对象我们就可以很方面的操作外部类的对象,变量等。
2.2、局部内部类local inner class
在方法的作用域内创建的一个完整类,称为局部内部类
package inner; public class Parcel2 {// 外部类
public Destination destination(String s){ // 方法内
class PDestination implements Destination{ // 方法内的内部类-->局部内部类
private String label;
private PDestination(String to){
this.label = to;
}
public String readLabel(){
return label;
}
}
return new PDestination(s);
} public static void main(String[] args) {
Parcel2 p = new Parcel2();
Destination d = p.destination("label");
System.out.println(d.readLabel());
} }
接口
package inner; public interface Destination {
String readLabel();
}
输出
label
局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
局部内部类属于其所在的方法,不属于外部类
2.3、匿名内部类anonymous inner class
接口
package inner; public interface Contents {
int value();
}
package inner; public class Parcel7 {
public Contents contents(){ // contents 方法将返回值的生成与表示这个返回值的类的定义结合在一起
return new Contents(){
private int i = 10;
public int value(){
return i;
}
};
}
public static void main(String[] args){
Parcel7 p = new Parcel7();
Contents c = p.contents();
System.out.println(c.value());
}
}
建立匿名内部类的关键点是重写父类的一个或多个方法。
上面匿名内部类等价于:
package inner; public class Parcel7b {
class MyContents implements Contents{
private int i = 10;
public int value(){
return i;
}
}
public Contents contents(){
return new MyContents();
}
public static void main(String[] args){
Parcel7b p = new Parcel7b();
Contents c = p.contents();
System.out.println(c.value());
}
}
上面就是成员内部类
2.4、静态内部类static inner class
当内部类是static时,就是静态内部类
注意:
(1)要创建静态内部类的对象,并不需要其外部类的对象
(2)不能从内部类的对象中访问非静态的外部类对象
package inner; public class Outer {// 外部类
static String Label = "outer";
int size = 10;
static class Inner{ // static 修饰
public void print(){
System.out.println(Label);
} }
public static void main(String[] args){ Outer.Inner inner = new Outer.Inner();
inner.print();
} }
3、为什么需要内部类?
内部类继承自某个类或实现某个接口,内部类的代码操作创建的外部类的对象,所以可以认为内部类提供了某种进入外部类的窗口
每个内部类都能独立底基础自一个接口的实现,所有无论外部类是否已经继承了某个接口的实现,对于内部类都是没有影响的
内部类允许继承多个抽象类
参考:《算法导论》---自己写的很差
Java:内部类的更多相关文章
- Java内部类final语义实现
本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- 黑马----JAVA内部类
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...
- java 内部类 *** 最爱那水货
注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...
- java内部类和匿名内部类
内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.clas ...
- Java内部类小程序(成员内部类,静态内部类,匿名内部类)
/** * 测试java内部类(成员内部类,静态内部类,匿名内部类) * 局部内部类不常用,就不写了. * @package :java05 * @author shaobn * @Describe ...
- [转] Java内部类详解
作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...
- java内部类的作用分析
提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...
- 9)Java内部类(Inner Class)
内部类:不可以有静态数据,静态方法或者又一个静态内部类 内部类的优点:隐藏类的细节,内部类可以声明为私有.内部类可以访问外部类的对象(包括private) 静态内部类:可以有静态数据,静 ...
- JAVA内部类(转)
源出处:JAVA内部类 在java语言中,有一种类叫做内部类(inner class),也称为嵌入类(nested class),它是定义在其他类的内部.内部类作为其外部类的一个成员,与其他成员一样, ...
随机推荐
- func_num_args(),func_get_arg(),func_get_args()
<?php function testFunction1(){ return func_num_args(); } function testFunction2(){ return func_g ...
- 关于自定义的NavigationBar
系统的NavigationBar局限太大,而且现在我要做的navigationBar需要四个按钮,一个Label,一个ImageView,所以不能用系统默认的. 刚刚咨询了一个高手,她的建议是,将系统 ...
- asp.net web.config 经典模式和集成模式相关配置
<?xml version="1.0"?> <configuration> <!--IIS经典模式下使用--> <system.web&g ...
- 微信支付.NET版开发总结(JS API),好多坑,适当精简。
前2天,做一个手机网页的微信支付的项目,费了好些周折,记录一下.接下来,按照开发步骤,细数一下,我遇到的那些坑. [坑1]官方邮件中下载的demo只有PHP版本,其他版本没有给链接.可能让人误以为只有 ...
- 分享一下 aix安装python提示C编译器问题的办法
今天在AIX上面安装Python-2.7.2时失败,报下面的错误 checking for --enable-universalsdk... no checking for --with-univer ...
- java数据结构和算法------合并排序
package iYou.neugle.sort; public class Merge_sort { public static void MergeSort(double[] array, i ...
- FPGA---ucf文件编写
摘要:本文主要通过一个实例具体介绍ISE中通过编辑UCF文件来对FPGA设计进行约束,主要涉及到的约束包括时钟约束.群组约束.逻辑管脚约束以及物理属性约束. Xilinx FPGA设计约束的分类 Xi ...
- PHP URL 重定向 的三种方法(转载)
为了方便查询,转载一篇. 1.使用header()函数 PHP的HTTP相关函数种提供了一个 header()函数,首先要清楚,header()函数必须放在php程序的开头部分,而且之前不能有另 ...
- C#制作高仿360安全卫士窗体<一>
开始写这一系列博客之前先要向大家说声抱歉,放肆雷特建立很久却很少有更新.当然博客人气也不旺,大部分都是看的人多评论收藏的人少.一直想要改变这种状态,正好赶上了最近工作上做了一个高仿360安全卫士窗体. ...
- HDU 5763 Another Meaning KMP+DP
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 Another Meaning Time Limit: 2000/1000 MS (Java/ ...