Java复习第三天------基础夯实之路(Java基础)

4 篇文章 0 订阅
4 篇文章 0 订阅

Java复习第三天

第十章(内部类)

1.内部类和组合是完全不同的概念,这一点很重要。内部类了解外部类,并能与之通信。
2.内部类拥有其外部类全部元素的访问权。
3.当外部类对象创建一个内部类对象时,这个内部类对象会秘密地获取一个指向那个外围类对象的引用,通过这个引用才可以访问到外部类的数据,这是编译器帮你处理的细节。
4.当你需要生成对外部类对象的引用时,可以使用外部类名字.this。
5.要想直接创建内部类对象,就必须用外部类对象来创建内部类对象,而且必须引用外部类对象的名字。因此,在拥有外部类对象之前是不可能拥有内部类对象的。但如果你创建的是嵌套类,也称静态内部类,那就不需要外部对象的引用。
6.如果一个内部类是private,这个内部类实现了某个接口,那么除了它的外部类以外,没有人能访问它,因此甚至不能将它向下转型为它的实际类型,因为访问不到它的类名字。对于protected内部类,除了它的外部类和它的子类以外,没有人能访问它。所以,private内部类给类的设计者提供了一个途径,通过这种方式可以完全阻止任何依赖于类型的编码,并且完全隐藏了实现细节。
7.在方法的作用域内创建一个完整的类,这被称为局部内部类。因为是在方法的作用域内创建的,所以离开了方法,这个局部内部类就不能被访问了,但是这并不意味着方法结束后这个局部内部类就不可用了。
8.除了在方法里定义内部类,还可以在任何其他的作用域里定于内部类,比方说if语句后。
9.可以在同一个子目录下的任意类中对某个内部类使用和之前某个内部类的标识符,这并不会造成冲突。
10.匿名内部类。创建一个类继承自某个类,但是不给予它名字,通过new表达式返回的引用会自动转换成这个父类的引用类型。匿名内部类的例子:

public class Paecel7{

	public Contents contents(){
		return new MyContents(){
			..........
			.........
		};
	}
}

上述匿名内部类的创建语法是下列形式的简化形式:

public class Paecel7b{
	class MyContents implements Contents{
	........		
	}
	public Contents contents(){
		return new MyContents();
	}
}

在这个匿名内部类中,使用了默认构造器来生成Contents。
如果你的基类有一个需要一个参数的构造器,那么你怎么创建匿名内部类对象呢?只需要把参数传进构造器即可。

    return new Wrapping(x){
........
......
};

11.在匿名内部类的末尾有个分号,这个分号并不是来标记这个内部类结束的,他标记的是语句表达式的结束,只不过这个语句正巧包含了匿名内部类而已。
12.如果匿名内部类希望使用一个定义在其外部定义的对象,那么编译器就会要求其参数引用是final的。例如:

public class Parcel9{
	public Destination destination(final String dest){
		return new Destination(){
			private String label=dest;
		};
	}
}

13.在匿名内部类中不可能有构造器,它压根就没有名字,可以通过实例初始化来达到为匿名内部类创建一个构造器的效果。
14.匿名内部类与正规的继承相比有些受限,因为匿名内部类可以扩展类,也可以实现接口,但是二者不能兼得。而且如果是实现接口,也只能实现一个。
15.如果不需要内部类对象和外部类对象有联系,那么就可以将内部类声明为static,这通常被称为嵌套类。嵌套类意味着:要创建嵌套类的对象,并不需要其外围类对象。不能从嵌套类的对象中访问非静态的外围类对象。
16.普通的内部类的字段和方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类,但是嵌套类可以包含以上所有。
17.在一个普通的内部类中,通过一个特殊的this引用可以链接到其外围类对象。嵌套类没有这个this引用,这使得它类似于一个static方法。
18.正常情况下,不能在接口中放置任何代码,但是嵌套类可以作为接口的一部分。甚至嵌套类可以实现其外围接口。如果你想创建某些公共代码,使得他们可以被某个接口的所有不同实现所共用,使用接口内部的嵌套类会显得很方便。
19.可以使用嵌套类来放置测试方法(main方法)。
20.嵌套类和其外围类编译后,名字之间有个$。
21.内部类可以访问它的所有外围类,不管嵌套多少层。
22.内部类最吸引人的地方在于:每个内部类都能独立地继承自一个(接口)的实现,所以无论外围类是否已经继承了某个(接口)的实现,对内部类都没有影响。可以说,内部类实现了多重继承,也就是说,内部类允许继承多个非接口类型(类或抽象类)。
23.如果拥有的是抽象的类或者具体的类,而不是接口,那么就只能使用内部类来实现多重继承。
24.闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。通过这个定义,可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象的信息,还自动拥有一个指向该外围类对象的引用,在此作用域内,内部类有权操作所有的成员,包括private成员。通过内部类提供闭包的功能是优良的解决方案,他比指针更灵活、更安全。
25.局部内部类不能有访问说明符,因为他不是外围类的一部分。
26.使用局部内部类而不是匿名内部类的两个原因:1.我们需要一个已命名的构造器,或者需要重载构造器,而匿名内部类是能用于实例初始化。2.需要不止一个该内部类对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值