1.抽象类
(1)抽象类的引入:当父类的某些方法需要声明但是不知道具体如何实现时就可将其定义为抽象方法,该方法所在的类即为抽象类。抽象方法一定存在于抽象类,但抽象类不一定有抽象方法。
(2)抽象方法和抽象类用abstract来修饰,抽象方法要被子类重写,所以不能加private,final,static来修饰。用abstract修饰抽象方法时,抽象方法没有方法体。
(3)抽象方法被定义后,如果有其他类继承该方法所在的抽象类,则该类中必须要重写父类中的抽象方法,除非该子类也是一个抽象类。
(4)抽象类不能被实例化。抽象类中构造的方法常常没有方法体(抽象方法),即使在抽象类中可以有任意成员(非抽象方法,构造器,静态属性等),但它们一般是为不同的子类方法所服务的,所以实例化无意义,调用这些方法只需实例化子类即可。
(5)抽象类的实践——模板设计模式
模板设计模式是抽象类的经典实践。该模式的思想是:当某个功能内部某一些方法设计是确定的,某一些方法设计不确定,可以将确定的方法在父类中写出,不确定的方法抽象为抽象方法,让子类重写从而实现不同子类的不同需求。
2.接口
(1)java中的接口是一类抽象方法的集合,是比抽象类更抽象的类,抽象类中可以有方法体,但接口中没有方法体(jdk1.8后,可以定义静态(static)方法和默认(default)方法,可以有方法体)。
(2)接口不可以实例化,这一点与抽象类类似。
(3)接口的使用:接口使用interface定义,接口不可以被继承只能被实现(使用implements调用),实现接口的普通类必须重写接口中的所有抽象方法(抽象类则不必),默认方法可以选择重写,静态方法不可重写。同时接口中的默认方法通过实现它的类调用,静态方法通过接口名调用。
(4)一个类可以同时实现多个接口,而接口不能继承类,但是能继承多个其它接口。
(5)接口中的属性默认是public static final修饰的,无需加载接口就可以使用,使用方法是接口名.属性。
(6)继承中子类和父类是is-a的关系,而在接口和其实现它的类中,是like-a的关系,接口可以被视为是对java中单继承机制的一个补充。
3.内部类
内部类是指在某个类的内部又嵌套了其它的类,这种类称为内部类。内部类是对象的五大成员(属性,方法,构造器,代码块,内部类)之一。内部类共有四种:局部内部类,匿名内部类,成员内部类,静态内部类。
(1).局部内部类
局部内部类定义在类的局部位置,比如方法和代码块中。局部内部类有类名,它的地位等同于方法中的局部变量。
(a)局部内部类不能使用访问修饰符,但可以使用final 修饰符(与局部变量相同)。
(b)局部内部类的作用域仅在定义它的方法体中。只有在这个作用域中才可以访问局部内部类,方法是创建类对象访问即可。
(c)外部类和内部类的成员重名时,遵循就近原则,如果局部内部类想要访问外部类成员,访问方法为外部类名.this.成员(静态成员:外部类名.成员)。
(2)匿名内部类
匿名内部类与局部内部类相同,存在于外部类的方法中,但是匿名内部类没有类名。使用方式为:
new 接口名或类名(参数列表){
类体
};
(a)基于接口的匿名内部类:对于一个接口而言,一般要实现这个接口需要创建一个具体的类,而匿名内部类的作用是不需要创建具体的类,直接就可以调用。其实匿名内部类是隐式地创造了一个临时的类,使用匿名内部类时,jdk底层创建了一个 外部类名$1的类,这个类实现了接口。匿名内部类既是一个类的定义,同时也是一个对象。
a)基于抽象类的匿名内部类:对于一个抽象类而言,一般要创建一个具体的子类继承抽象类,而匿名内部类的作用是不需要创建具体的类,直接就可以调用。其实匿名内部类是隐式地创造了一个临时的类,使用匿名内部类时,jdk底层创建了一个 外部类名$2的类,这个类继承了抽象类。匿名内部类既是一个类的定义,同时也是一个对象。
(3)成员内部类
(a)成员内部类是外部类的一个成员,没有使用static修饰。可以添加任何访问修饰符。
(b)外部类访问内部类成员要创建对象。内部类可直接访问外部类,如果外部类 和内部类成员有重名,访问外部类成员方法为外部类名.this.外部成员。
(d)与外部类同级的其他类访问该外部类的内部类时,要先访问外部类,通过外部类访问内部类。
(4)静态内部类
(a)静态内部类是定义在成员位置的内部类,使用了static修饰符进行修饰。可以添加任何访问修饰符。
(b)静态内部类可以访问外部类中的静态成员,但不能访问非静态成员。外部类访问内部类成员要创建对象。如果外部类 和内部类成员有重名,访问外部类成员方法为外部类名.外部成员。
4.枚举
枚举是一种特殊的类,其中包含了一组特定的对象。
(1)枚举的基本步骤:
(a)私有化构造器。
(b)在类内部创造一组public final static对象,向外暴露这一组对象。