文档章节

内部类

 去火星喝啤酒ba
发布于 2017/04/15 21:34
字数 837
阅读 3
收藏 0

1、内部类向上转型为接口

outclass2类定义了一个private的内部类,这个内部类实现了outFace接口,然后修改doit(),使其返回一个outFace接口。由于内部类innerclass的修饰符为private,所以外部类及其他类都不能访问,只有内部类访问,然后实现接口中的f()方法。这里很好的对继承该类的子类隐藏了实现细节,仅仅留下一个接口和一个外部类,同时也可以调用f(),但是细节却被很好的隐藏了,这就是内部类最基本的用途。

注意:非内部类不能被修饰为private和protected。

package a1;
interface OutFace{
	public void f();
}
public class InterFace 
{
	public static void main(String[] args)
	{
		OutFace2 out=new OutFace2();
		OutFace outinter=out.doit();
		 outinter.f();
	}
}
class OutFace2
{
	private class InnerClass implements OutFace
	{
		InnerClass(String s)
		{
			System.out.println(s);
		}
		public void f()
		{
			System.out.println("访问内部类中的f()方法");
		}
	}
	public OutFace doit()
	{
		return new InnerClass("访问内部类构造方法");
	}
}

 2、局部内部类

这里一样遵循内部类可以访问当前代码的常量以及此外部类的所有成员,但是doit()的外部类不能访问该内部类。此处注意doit()的参数设置为final类型,换句话说,包含内部类的方法中使用局部变量都要设置为final,在方法中定义的内部类只能访问方法中final类型的局部变量,这是因为在方法定义中定义的局部变量相当于一个常量,它的生命周期超出方法运行的生命周期,由于该局部变量设置为final,所以不能再内部类中改变该局部变量的值。

package a1;
interface OutFace2
{	
}
class OutClass {
	public OutFace2 doit(final String x)
	{
		class InnerClass implements OutFace2
		{
			InnerClass(String s)
			{
				s=x;
				System.out.println(s);
			}
		}
		return new InnerClass("doit");
	}

}

3、匿名内部类

 通过把return和内部类的定义语句结合在一起,这里A是类名,这种写法虽然莫名奇妙,但是能被java所认可,由于这个类没有名称,所以该内部类被称为匿名内部类。实质上这种内部类的作用就是创建一个实现于A接口的匿名类的对象。

注意,这里花括号后面加分号,这个分号并不是代表定义内部类结束,而是代表创建A引用表达式的标志。

匿名内部类编译后,会产生   外部类名$序号   为名称的.class文件,序号以1~n排列,分别代表1~n个匿名内部类。

return new A()
{
//内部类体

};

4、静态内部类

在内部类前面声名static,静态内部类的最大特点是不可以使用外部类的非静态成员,所以静态内部类很少见。

5、内部类的继承

内部类一样可以被继承,但是内部类的继承更复杂,需要专门的语法来实现。在继承某个内部类时,必须硬性的给这个类一个带参数的构造方法,并且该构造方法的参数为需要继承内部类的外部类的引用,同时在构造中使用   a.super();  语句,才能为继承提供必要的对象引用。

public class OutClass extends ClassA.ClassB
{
	public OutClass(ClassA a)
	{
		a.super();
	}
}
class ClassA
{
	class ClassB
	{

    }
}

这些是复习时的随笔。

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 8
码字总数 6337
作品 0
黄冈
私信 提问

暂无文章

Java 帝国对 Python 的渗透能成功吗?哈哈

引子 Java 帝国已经成立20多年,经过历代国王的励精图治,可以说是地大物博,码农众多。 可是国王依然不满足,整天想着如何继续开拓疆土, 这一天晚上他又把几个重臣招来商议了。 IO大臣说:...

边鹏_尛爺鑫
48分钟前
4
0
分布式事务解决方案框架(LCN)

什么是XA接口 XA是一个分布式事务协议,由Tuxedo提出。XA中大致分为两部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如Oracle、DB2这些商业数据库都实现了XA接口...

群星纪元
今天
6
0
linux 操作系统 常用命令和软件安装

1.系统时间更新 ntpdate time.windows.com 2.传送文件 rsync -av /home/data/a.dat -e ssh root@192.168.0.100:/home 3.传送文件夹 scp -r /home/data root@192.168.0.100:/home 4.JDK安装 ......

WJtiny
今天
2
0
pg_lightool基于basebackup的单表恢复和块恢复

开源软件pg_lightool,实现了基于wal日志的块恢复。详情参见博客:https://my.oschina.net/lcc1990/blog/1931485。由于wal日志中FPW的不确定性,它不能作为一个数据库恢复的解决方案。目前对...

movead
今天
2
0
对比剖析Swarm Kubernetes Marathon编排引擎

Docker Native Orchestration 基本结构 Docker Engine 1.12 集成了原生的编排引擎,用以替换了之前独立的Docker Swarm项目。Docker原生集群(Swarm)同时包括了(Docker Engine \/ Daemons)...

Linux就该这么学
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部