第二季主要是面向对象编程的,收获如下:
匿名内部类
匿名内部类没有类名,可以临时定义并马上使用其方法
匿名内部类主要用在直接调用接口方法而不在该类中override该方法的情况中(Android中比较常用),换句话说,它是临时写的方法,仅能使用一次,块内有效,用完后若要继续使用需要重新定义。用法如下:
new InterfaceName(){ //调用构造函数
//override InterfaceMethod
}.InterfaceMethod(arguments);
这样就能直接调用该方法了。
内部类
顾名思义,在主类中定义的一个类,称之为内部类。可以在类内直接定义,也可在方法中定义,此时成为方法内部类。
搞清它自身的特点以及与外部类(主类)的关系非常重要,总结如下:
- 内部类可以直接访问外部类的成员和方法,但外部类不能直接访问内部类的成员和方法。若外部类要访问内部类的成员和方法,需要实例化内部类。
- 对于方法内部类,类名是不能用static修饰符以及访问控制符修饰的,但非方法内部类是可以修饰的。
- 静态内部类不能直接访问外部类的非静态成员,若要访问,需要实例化(可用匿名内部类的方法)。静态方法类似,也需要实例化。可以想想main方法的使用,就需要在里面实例化main方法所在的类,才能使用其它方法。
- 若在内部类中,需要访问外部类的静态成员名称与内部类相同,则可通过“外部类.成员名称”访问外部类的静态成员。
- 在外部类创建非静态内部类对象时,方法如下:
InnerClassName Name = OuterClassName.new InnerClassName();
,若是静态内部类,则可以省略外部类名称。 - 若外部类与内部类具有相同的成员和方法,则可通过
OuterClassName.this.methodName();
访问外部类的方法。 - 在保存有内部类的java文件时,会生成额外生成名为“外部类名$内部类.class”的内部类文件。
对象初始化
在设计一个类时,可以在三个地方进行初始化,它们分别是:构造函数、初始化块和静态初始化块
public class xxx{
{
//初始化块
}
static{
//静态初始化块
}
public xxx(){
//构造函数
}
}
它们调用的先后顺序为:
静态初始化块 -> 初始化块 -> 构造函数