We believe that writing is about content, about what you want to say – not about fancy formatting.
我们坚信写作写的是内容,所思所想,而不是花样格式。
— Ulysses for Mac
Java第8天上午
上午主要做了三个练习:
拓展阅读:
下午主要复习了内部类:
内部类(innerclasses)
一般情况下,我们把类定义成为独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,称为内部类。
内部类的作用(好处):
- 内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问
- 内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。但外部类不能访问内部类的内部属性
内部类的使用场合:
由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性。所以,通常内部类只在为外部类提供服务的情况下优先使用。
内部类的分类:
1. 成员内部类(可以使用private、protected、public 任意进行修饰。类文件:外部类$内部类.class)
a 非静态内部类(外部类里使用非静态内部类和平时使用其他类没什么不同)
- 非静态内部类必须寄存在一个外部类对象里。因此,如果有一个非静态内部类对象那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。
- 非静态内部类可以使用外部类的成员,但是外部类不能直接访问非静态内部类成员。
- 非静态内部类不能有静态方法、静态属性、静态初始化快
- 静态成员不能访问非静态成员:外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量,创建实例
- 成员变量访问要点
- 内部类里的方法的局部变量:变量名
- 内部类属性:this.变量名
- 外部类属性:外部类名.this变量名
- 内部类的访问
- 外部类中定义内部类:new innerClass()
- 外部类以外的地方使用非静态内部类
b 静态内部类
- 定义方式
Static class ClassName{
// 类体
}
- 使用要点
- 当一个静态内部类对象存在,并不一定存在对应的外部类对象,静态内部类的实例化方法不能直接访问外部类的非静态实例方法。
- 静态内部类看做外部类的一个静态成员。因此外部类的方法中可以通过:静态内部类.名字 访问静态内部类的静态成员。通过new 静态内部类() 访问静态内部类的实例。
- 在外部类的外面创建静态内部类
Face.Ear e = new Face.Ear();
e.listen();
2 匿名内部类
顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。适合那种只需要使用一次的类。
当程序中使用匿名内部类时,在定义匿名内部类的地方往往直接创建该类的一个对象。
匿名内部类的声明格式如下:
new 父类构造器(参数列表)|实现接口()
{
//匿名内部类的类体部分
}
匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
- 只用到类的一个实例
- 类在定义后马上用到
- 类非常小(SUN推荐是在4行代码以下)
- 给类命名并不会导致你的代码更容易被理解
在使用匿名内部类时,要记住以下几个原则:
- 匿名内部类不能有构造方法
- 匿名内部类不能定义任何静态成员、静态方法
- 匿名内部类不能是public,protected,private,static
- 只能创建匿名内部类的一个实例
- 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类
- 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
- 不使用匿名内部类来实现抽象方法
- 匿名内部类的基本实现
- 在接口上使用匿名内部类
局部内部类
定义在方法内部,作用域只限于本方法,用的很少,几乎不用
拓展阅读:
每日一练:
课堂作业:
作业点我查看
课外练习:
课外作业点我查看
世界上所有的追求都是因为热爱
一枚爱编码 爱生活 爱分享的IT信徒
— hongXkeX