首先需要记住的是extends表示继承关系、implements表示实现关系
那么extends用于哪些情形、implements又用于哪些情形呢?
extends:
子类(class) extends 父类(class)===>继承类只能是单继承,也就是如果父亲属于类(class),那么父亲只能有一个
类(class)/ 接口(interface) extends 接口1(interface,接口2(interface)===>继承接口可以是多继承,也就是如果父亲是接口(interface)那么可以有多个父亲
ps1: 这里子类继承父类的前提是父类class不是final类
ps2:如果父类是抽象类,那么子类需要实现父类中的所有抽象方法,否则子类也将变成抽象类(实际上子类继承抽象父类的过程,也就是抽象父类的实例化的过程,因为抽象类不能直接被实例化,即不能通过new一个对象来产生,而是要借助于一个普通的类通过继承,实现所有该抽象类中的所有抽象方法来进行实例化;但是事实上也可以通过new来实例化抽象类,只是还需要借助于匿名内部类来实现)
public class Test4 {
public abstract static class animal{
public abstract void say();
}
public static void main(String[] args){
//直接通过new一个抽象类来实例化
//而这里相当于省略了创建子类继承进行实例化的步骤,也就是利用了匿名内部类实现实例化
animal animal = new animal(){
public void say(){
System.out.println("miaomiao");
}
};
animal.say();
}
}
ps3:继承类虽然不能多继承,即一个子类不能有多个父亲,但是可以多重继承,即class A extends B{} classB extends C{}
ps4:子类不能继承父类的private属性和方法
ps5:子类继承父类的方法时可以对父类的方法进行重写,这时候就需要注意重写的规则(参数个数、参数类型、返回类型和父类保持一致,同时子类重写方法的修饰符范围不能小于父类的修饰符)重写和重载
implements:
类(class) implements 接口1(interface),接口2(interface)==>一个类可以实现多个接口
ps1:实现一个接口需要实现接口中的所有方法
ps2:接口不能实现接口,接口只能继承接口,因为接口中的方法都是没有方法体的,如果接口可以实现接口,那么实现的过程就必定要定义方法体,对方法进行重写,所以两者是矛盾的。
ps3:接口中的成员变量都是public + static + final的。当然在接口中具体定义某个成员变量的时候这三个修饰符可以默认省略,也就是可以不写。
interface animal{
int age = 10;//默认为Public static final
public static final int number = 20;
}
那么为什么是public呢,因为接口本来就是需要其他类通过实现了进行引用,所以只能是public,这样不同包,不同类都可以实现接口,引用接口中的成员变量。
那为什么是static呢,首先我们先举一个例子来说明
public interface animal {
int age = 10;//默认为Public static final
public static final int number = 20;
}
public interface person {
int age = 25;
}
public class Monkey implements person,animal {
public static void main(String[] args){
System.out.println(age)
}
}
这个时候就会提示错误信息:reference to 'age' is ambiguous, both 'person.age' and 'animal.age
所以我们必须要指定是谁的age,那么在指定的过程中就必须要通过person.age' and 'animal.age来指明
public class Monkey implements person,animal {
public static void main(String[] args){
System.out.println(animal.age);
System.out.println(person.age);
}
}
这里通过接口名.属性名来指定,那么只有static变量才可以
那么为什么是final呢?我们知道一个接口可以同时被不同的类实现,那么如果接口的成员变量不是final的话,那么凡是实现了该接口的类岂不是都可以修改了。