书接上回。
前言
面向对象的编程中,继承、多态等是非常重要的内容。这里主要总结概念性知识,具体实操需要自行练习。
一、继承与组合
继承是指一个类获得了另一个类的全部非private字段和方法,同时有扩展了其他字段和方法。由于一些字段不想直接被外部引用又需要传递给子类,因此需要定义为protected。
在子类中,使用super来表示父类,使用super.Name来表示父类的字段。在定义构造函数时,如果构造函数第一句没有super()那编译器会自动添加super()代表调用父类的无参构造。注意,如果父类调用了有参构造且没有默认的无参构造,那么子类构造函数第一句必须是super(...)有参构造函数。如果类有final修饰,那么任何类不得继承该类。
向上转型:Person P = new Student();将子类安全转化成父类,代表向上转型。
向下转型:Person p = new Person();Student s=(Student) p;这种情况就存在一个问题,因为父类的方法字段一般少于子类的方法字段,因此需要先进行instanceof判断,再实现向下转型。即第二个语句变为if(p instanceof Student){Student s=(Student) p;}
一般学生可以继承人的属性,学生看书,最好不要学生继承书的属性,可以直接定义书的字段。这就是组合——has关系,继承是is关系。
二、多态与接口
1.多态
多态是指一个事物的多种形态。对父类中定义的各种方法,可以在子类中重写,使用注解@override来检查。注意,如果父类方法被覆写,需要使用super来调用父类方法。可以使用final阻止覆写。
这里总结一下final:①阻止方法被覆写②阻止类被继承③命令字段必须在构造函数中初始化且不可被修改。
2、接口
如果多态中,父类的方法不需要实现,只需要定义一种规范,让子类都来实现这个规范,那么可以通过抽象类来实现。在抽象类中,需要规范使用的方法称为抽象方法,public abstract void run();对应的类也需要使用abstract修饰。
抽象类中,如果所有的方法都是抽象方法,没有字段,那么这个抽象类就被称为接口。一个类如果要实现接口,可以使用implements。接口也可以继承其他接口。接口中,如果新增一个方法,那么所有子类都需要实现该方法,因此可以定义一种default方法,default void run();对于有需要的类直接覆写即可。与抽象类中的普通方法(非抽象方法)相比,default是无参数的,因为接口中没有任何字段。
三、面向对象的其他内容
静态字段属于所有实例“共享”的字段,实际上是属于class
的字段;调用静态方法不需要实例,无法访问this
,但可以访问静态字段和其他静态方法;静态方法常用于工具类和辅助方法。
还有静态类、内部类、匿名类等内容,在此不一一赘述。
总结
这里仅仅把继承、接口、多态的基础概念介绍了一下,真正应用是需要结合spring、注解等知识学习的,后续会一一介绍。