什么是多态
- 多态的概念本身是比较抽象的,简单的解释就是一种事物有多种表现形态,具体到Java程序中,就是定义一个方法,在具体的生产环境中根据不同的需求呈现出不同的业务逻辑。
- 定义方法时形参为父类,调用方法时传入参数为子类对象。
- 定义方法时返回值的类型为父类调用方法时返回子类对象。
- 具有继承关系的两个对象可以相互转换,子类转父类即父类引用指向子类对象,可以自动完成,无需强制转换,也叫做向上转型。
- 父类转子类即子类引用指向父类对象,不能自动完成转换,需要强制转换,也叫做向下转型。
理解下面的代码。帮助你快速了解多态知识。
public class Member {
public abstract void buyBook(){
}
}
public class SuperMember extends Member{
@Override
public void buyBook() {
// TODO Auto-generated method stub
System.out.println("超级会员买书打三折!");
}
}
public class OrdinaryMember extends Member{
@Override
public void buyBook() {
System.out.println("普通会员买书打6折");
}
}
public class Cashier {
private Member member;
public Member getMember() {
return member;
}
public void setMember(Member member) {
this.member = member;
}
public void settlement(Member member) {
member.buyBook();
}
public Member getMember(String name) {
if(name.equals("ordinaryMember")) {
return new OrdinaryMember();
}else {
return new SuperMember();
}
}
}
public class Test {
public static void main(String[] args) {
OrdinaryMember ordinaryMember = new OrdinaryMember();
SuperMember superMember = new SuperMember();
Cashier cashier = new Cashier();
//定义方法时形参为父类,调用方法时传入的参数为子类对象
cashier.settlement(superMember);
//定义方法时返回值的类型为父类调用方法时返回子类对象
OrdinaryMember member = (OrdinaryMember)cashier.getMember("ordinaryMember");
SuperMember member2 = (SuperMember)cashier.getMember("superMember");
}
}
进阶
构造器和多态
思考下面代码,各类之间如何发生的!
class Meal {
Meal() {
System.out.println("Meal()");
}
}
class Bread {
Bread() {
System.out.println("Bread()");
}
}
class Cheese {
Cheese() {
System.out.println("Cheese()");
}
}
class Lettuce {
Lettuce() {
System.out.println("Lettuce()");
}
}
class A{
A(){
System.out.println("A()");
}
}
class Lunch extends Meal {
Lunch() {
System.out.println("Lunch()");
}
}
class PortableLunch extends Lunch {
private A a = new A();
PortableLunch() {
System.out.println("PortableLunch()");
}
}
public class Sandwich extends PortableLunch {
private Bread b = new Bread();
private Cheese c = new Cheese();
private Lettuce l = new Lettuce();
public Sandwich() {
System.out.println("Sandwich()");
}
public static void main(String[] args) {
new Sandwich();
}
}
下面附加一个Java编程思想解释
- 构造器调用的顺序: