thinking in java学习记录(十)内部类

可以将一个类的定义放在另一个类的定义内部,这就是内部类
10.1 创建内部类
从外部类非静态方法以外任何位置想要创建某个内部类,那就必须指明其完整的类型,例如:A.B

public class A{
	class B{}
	public B method(){
		return new B();
	}
	public static void main(String[] args){
		A a=new A();
		A.B b= a.method();
	}
}

10.2 连接到外部类

内部类拥有外部类的所有访问权,因为编译器再创建内部类时会创建一个指向外部类的引用供内部类使用,所以要想创建内部类,那就必须先存在一个与之关联的外部类,所以在创建一个外部类之前是不可能创建一个内部类的。(静态内部类除外)

10.3 使用.this和.new

如果想在内部类中使用外部类的引用,那就可以使用在外部类的名称后面加上.this:OuterClass.this
如果其他外部类想使用另一个外部类的内部类,那就要使用.new:

public static void main(String[] args){
		A a=new A();
		A.B b= a.new B();
	}

10.4 内部类和向上转型

private 内部类给类的设计者提供了一种思路,通过这种方式可以完全阻止任何依赖于类型的编码,并且完全隐藏了实现的细节

10.5 在方法和作用域内的内部类

可以在一个方法里面或者在任何作用域内定义内部类,这么做有两个理由:
1.实现了某类型的接口,于是可以创建并返回对其的引用
2.要解决一个复杂的问题,想创建一个辅助类,但又希望这个类不是公共可用的

10.6 匿名内部类

public Contents contents(){
	return new Contents(){//Insert a class defination
		private int i=11;
		public int value(){return i;}
	};//这个;表示的是return结束了,而不是内部类定义结束了,只不过总是恰好内部类也同时结束了
}

匿名内部类指的是创建了一个继承自其他类的匿名对象,他使用了默认构造器来初始化被继承的类

如果定义了一个匿名内部类,并且希望它使用一个在其外部定义的对象(可以是外部类中的对象,但不能是其他之外的对象),那么编译器要求其参数引用的final的

10.6.1 再访工厂方法
优先使用的是类而不是接口。如果你的设计中需要某个接口,必须先了解它,否则就不要用。

10.7 嵌套类
如果不需要内部类与外部类有什么联系,那就可以将内部类声明为static,那么这个内部类就没有外部类的引用了,于是要创建内部类就不需要其外部类的对象,同时内部类也不能访问非静态外部类的成员。

10.7.1 接口内部的类
可以在接口中放置嵌套类充当测试代码

10.7.2 从多层嵌套类中访问外部类的成员
不管一个内部类有多少层内部类,它都能透明的访问外部类的所有成员。

10.8 为什么需要内部类

一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象,也就是说内部类提供了某种进去其外部类的窗口

如果只是需要一个对接口的引用,为什么不通过外围类实现那个接口呢?答案是:“如果这能满足需求,那么就应该这么做。”那么内部类实现一个接口与外围类实现这个接口有什么区别呢?答案是:“后者不是总能享用到接口带来的便利。”所以内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)的实现,对于内部类都没有影响 也就是说接口解决了一部分多重继承的问题,而内部类允许继承多个非接口类型

如果不需要解决多重继承的问题,那么自然可以使用其他方法进行编码而不需要使用到内部类。但如果使用了内部类还有以下这些优势:
1.每个内部类都可以有多个实例,每个实例都有自己的状态信息,并与外部类对象的信息相互独立
2.在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类

10.8.1 闭包和回调
闭包是指一个可调用的对象,它记录一些信息,这些信息来源于创建它的作用域,可见:内部类就是面向对象的闭包

10.8.2 内部类与控制框架
内部类就像是继承了外部类和声明继承的类

10.9 内部类的继承

10.10 内部类可以被覆盖吗

在外部类被继承后,在子类中有与父类中相同名称的内部类,两个内部类之间并无关联,也就是说:在父类方法中调用的内部类时父类中的内部类而与子类中的内部类没有关系。

10.11 局部内部类

局部内部类的优先级比匿名内部类的优先级高。理由:
1.需要一个命名的构造器
2.需要不止一个内部类的对象

10.12 内部类标识符

10.13 总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值