一、多态
Java中的多态体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值。
举个例子,一个Child类,继承与Father类,那么这个Child类的实现类,既可以赋值给一个Child类型的引用,也可以赋值给一个Fatcher类型的引用。
所以,多态的表现就是父类的引用指向的是子类对象。
多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。
在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
二、抽象类
Java中定义抽象类用的关键字是abstract,抽象类是不可以实例化的。在Java中使用多态的时候,并不需要父类可以实例化,只需要子类可以实例化,也就是只需要子类对象。
由于抽象类只能被继承,子类必须重写父类的所有抽象方法,即使子类不需要,也必须重写。
三、接口
接口用关键字interface来定义,也可以将接口看作是抽象类的延伸,可看作纯粹的抽象类。
但是接口中的方法,子类可以选择性的实现。
四、接口与继承
Java中不允许多重继承,即不允许一个子类同时继承一个或多个父类(即同时extends多个类)。但是可以使用接口实现多个(即可以同时implements多个接口,同时实现多个接口)。
这就是多重继承。
多重继承语法:
*class 类名 implements 接口1,接口2,...,接口n *
1、一个类只能继承一个类:class A extends B{}
2、一个类可以实现多个接口:class A implements B,C,...{}
3、一个接口可以继承多个接口:interface intf1 extends intf2,intf3,...{}
4、在继承类的同时也可以继承接口:class A extends B implements intf1,intf2,...{}
五、多态的使用方式
多态的使用格式一般为:
父类类型 变量名 = new 子类类型();
变量名.方法名();
1.普通类多态定义的格式
父类 变量名 = new 子类();
如: class Father {}
class Child extends Father {}
//类的多态使用
Father father = new Child();
2.抽象类多态定义的格式
抽象类 变量名 = new 抽象类子类();
如: abstract class Father {
public abstract void method();
}
class Child extends Father {
public void method(){
System.out.println(“重写父类抽象方法”);
}
}
//类的多态使用
Father father = new Child();
3. 接口多态定义的格式
接口 变量名 = new 接口实现类();
如: interface Father {
public abstract void method();
}
class Child implements Father {
public void method(){
System.out.println(“重写接口抽象方法”);
}
}
//接口的多态使用
Father father = new Child();
注意事项
同一个父类的方法会被不同的子类重写。在调用方法时,调用的为各个子类重写后的方法。
如
Person p1 = new Student();
Person p2 = new Teacher();
p1.work(); //p1会调用Student类中重写的work方法
p2.work(); //p2会调用Teacher类中重写的work方法
当变量名指向不同的子类对象时,由于每个子类重写父类方法的内容不同,所以会调用不同的方法。