目录
1、抽象类和抽象方法
抽象方法:将共有的行为抽取到父类中,由于子类执行不同,将方法定义为抽象方法。
抽象类:如果一个类中有抽象方法,则该类需要声明为抽象类。
抽象方法格式:
public abstract 返回值类型 方法名(参数列表);
抽象类格式:
public abstract class 类名{};
抽象类不能实例化。抽象类不一定有抽象方法,但有抽象方法一定是抽象类。可以有构造方法。
抽象类的子类要么重写抽象类中的所有抽象方法,要么是抽象类。
2、接口
某些行为不是所有都有,但是大部分都有,为了方便,可以使用接口。
一些行为虽然是共有的,但是可能用到的参数不同,为了方便,可以使用接口。
接口的定义:
public interface 接口名{}
接口不能实例化,
接口的实现:
public class 类名 implements 接口名{}
接口和类的实现关系可以单实现也可以多实现。
public class 类名 implements 接口名1,接口名2{}
public class 类名 extends 父类 implements 接口名1,接口名2{}
接口的子类(实现类)要么重写接口中的所有抽象方法,要么是抽象类。
接口中的成员的特点:
成员变量只能是常量,默认修饰符public static final;
没有构造方法;
成员方法只能是抽象方法,默认修饰符public abstract。
jdk8实现了接口中的方法有方法体。允许在接口中定义默认方法,需要使用default修饰。
接口中默认方法的定义格式:
public default 返回值类型 方法名(参数列表){}
默认方法不是抽象方法,不强制被重写,如果被重写,重写时去掉default关键字。public可以省略,default不能省。
若实现多个接口,多个接口中有相同名字的默认方法,子类必须对方法进行重写。
当一个接口中抽象方法过多但只需要一部分时,可以设计为适配器。
3、内部类
(1)概述
类的组成:属性、方法、构造方法、代码块、内部类。
内部类是在类里面定义的类。
public class Person{
public class User{
}
}
User就是一个内部类。内部类可以理解为外部类的一部分。(Person和User的例子未必合适。仅供说明内部类和外部类的位置关系。)
内部类可以直接访问外部类的成员包括私有的。
外部类使用内部类的成员需要创建对象。
(2)内部类的分类
内部类的分类:成员内部类、静态内部类、局部内部类、匿名内部类。
成员内部类写在成员位置的,属于外部类的成员。可以被权限描述符以及static等修饰。
JDK16之前,成员内部类不能定义静态变量。
获取成员内部类对象的方法:一是在外部类中编写方法,对外提供内部类的对象。
二是直接创建即外部类名.内部类名 对象名=外部类对象.内部类对象。
静态内部类只能访问外部类中的静态变量和静态方法。访问非静态的需要创建对象。
静态的可以用类名直接获取。
创建静态内部类对象格式:外部类名.内部类名 对象名=new 外部类名.内部类名();
调用静态方法的格式:外部类名.内部类名.方法名()
局部内部类:即将内部类定义在方法里面。类似于方法的局部变量。
外界无法直接使用局部内部类,需要在方法内部创建对象使用。该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
匿名内部类:即隐藏了名字的内部类。其实是有名字的,会自动生成,有一定的格式。
格式:
new 类名或者接口名(){
重写方法;
}
整体是new出来的对象。大括号才是类,大括号和前面是继承或者实现的关系。如果是接口,就是实现关系,如果是类,就是继承关系。
匿名内部类可以写在局部位置,也可以写在成员位置。