类型的检测——向上转型 向下转型
向上转型:父类对象的引用指向子类对象,向下转型:向上转型的基础上再次指向子类的对象
1.向上转型

package text5; public class Father { public void say(){ System.out.println("father say()"); } public static void main(String[] args) { Father son=new Son(); son.say(); } } class Son extends Father{ public void say(){ System.out.println("son say()"); } }
有时候使用向上转型会丢掉子类特有的方法,

package text5; public class Father { public void say(){ System.out.println("father say()"); } public static void main(String[] args) { Father son=new Son(); son.sayMe(); } } class Son extends Father{ public void say(){ System.out.println("son say()"); } public void sayMe(){ System.out.println("son sayMe"); } }
2.向下转型(强转)注意强转的方法

package text5; public class Father { public void say() { System.out.println("father say()"); } public static void main(String[] args) { // 向上转型 Father son = new Son(); son.say(); // 向下转型 Son son2 = (Son) son; son2.sayMe(); } } class Son extends Father { public void say() { System.out.println("son say()"); } public void sayMe() { System.out.println("son sayMe"); } }
动态绑定;

package text5; public class Father { public void say() { System.out.println("father say()"); } public static void main(String[] args) { // 向上转型 Father son = new Son(); son.say(); } } class Son extends Father { public void say() { System.out.println("son say()"); } public void sayMe() { System.out.println("son sayMe"); } }
静态绑定;!!!!

package text5; public class Father { private String name = "father"; public static void say() { System.out.println("father say()"); } public void say1() { System.out.println("father say1()"); } /// 主运行程序 public static void main(String[] args) { // 向上转型 Father son = new Son(); System.out.println(son.name); son.say1(); son.say(); Son f = (Son) son; f.say(); f.say1(); } } class Son extends Father { String name = "Son"; public static void say() { System.out.println("son say()"); } public void say1() { System.out.println("son say1"); } }
1.使用多态实现主人给宠物喂食:
2.使用多态实现主人领养宠物并与宠物玩耍
3.使用多态计算汽车租赁总租金
4.使用多态完善汽车租赁系统计价
父亲不能调用儿子的方法,需要强制转换
A.实现主人给宠物喂食:
Pet:

package Animal2; public abstract class Pet { private String name; private int health; private int love; public Pet() { } public Pet(String name, int health, int love) { this.name = name; this.health = health; this.love = love; } public void print() { System.out.println("宠物的自白:"); System.out.print("我的名字叫" + getName() + ",健康值是" + getHealth() + ",和主人的亲密度是" + getLove()); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getHealth() { return health; } public void setHealth(int health) { // 设置默认 if (health < 0 || health > 100) health = 60; this.health = health; } public int getLove() { return love; } public void setLove(int love) { if (love < 0 || love > 100) love = 60; this.love = love; } public abstract void eat(); }
Dog

package Animal2; public class Dog extends Pet { private String strain; public Dog(String name, int health, int love) { super(name, health, love); // this.strain = strain; } public Dog(String name, int health, int love, String strain) { super(name, health, love); this.strain = strain; } // 接飞盘 public void getFrise() { System.out.println("接飞盘啊"); } public Dog() { // TODO Auto-generated constructor stub } public void print() { System.out.println("宠物的自白"); System.out.println("我的名字叫" + this.getName() + ",健康值是" + this.getHealth() + "和主人的亲密度是" + this.getLove() + ",我是一只酷酷的" + strain); } public String getStrain() { return strain; } public void setStrain(int strain) { if(strain==1){ this.strain = "拉布拉多"; }else this.strain="博美"; } @Override public void eat() { // TODO Auto-generated method stub if(getHealth()==100){ System.out.println("狗狗已经饱了,不需要吃东西了。"); }else { System.out.println("带狗狗去吃骨头......"); setHealth(getHealth() + 3); System.out.println("狗狗的健康值为:"+getHealth()); } } }
Penguin

package Animal2; public class Penguin extends Pet { String sex; public Penguin(String name, int health, int love, String sex) { super(name, health, love); this.sex = sex; } public Penguin(String name, int health, int love) { super(name, health, love); // this.sex=sex; } public Penguin() { // TODO Auto-generated constructor stub } public void swim() { System.out.println("会游泳啊"); } public void print() { System.out.println("宠物的自白"); System.out.println( "我的名字叫" + this.getName() + ",健康值是" + this.getHealth() + "和主人的亲密度是" + this.getLove() + ",性别是" + sex); } public void setSex(int sex) { if (sex == 1) { this.sex = "Q仔"; return; } this.sex = "Q妹"; } public void setSex(String sex) { this.sex = sex; } @Override public void eat() { // TODO Auto-generated method stub if (getHealth() == 100) { System.out.println("企鹅已经饱了,不需要吃东西了。"); } else { System.out.println("带企鹅去吃骨头......"); setHealth(getHealth() + 5); System.out.println("qie的健康值为:" + getHealth()); } } }
Master:

package Animal2; //主人与宠物玩 public class Master { public void play(Pet pet) { if (pet instanceof Dog) { Dog dog = (Dog) pet; dog.getFrise(); } else if (pet instanceof Penguin) { Penguin pen = (Penguin) pet; pen.swim(); } } // 喂食物 public void feed(Pet pet) { if (pet instanceof Dog) { Dog dog = (Dog) pet; dog.eat(); } else if (pet instanceof Penguin) { Penguin penguin = (Penguin) pet; penguin.eat(); } } }
Test:

package Animal2; import java.util.Scanner; public class Text { public static void main(String[] args) { Master master=new Master(); Pet dog=new Dog(); dog.setName("黑比"); dog.setLove(68); dog.setHealth(0); ((Dog) dog).setStrain(1);//儿子的调用强转 master.feed(dog); dog.print(); System.out.println("*********************"); Pet penguin=new Penguin(); penguin.setName("QQ"); penguin.setHealth(100); penguin.setLove(76); ((Penguin) penguin).setSex(1);//儿子的调用 penguin.print(); } }
B.使用多态实现汽车总租金
首先定义一个机动车抽象类,
Vehicle:

package Car; /** * 汽车抽象类 * * @author Administrator * */ public abstract class Vehicle { private String no; private String brand; // 有参构造 public Vehicle(String no, String brand) { this.brand = brand; this.no = no; } // 抽象方法,计算汽车租赁价格 public abstract int cale(int days); // 自动获取的方法 public String getNo() { return no; } public void setNo(String no) { this.no = no; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } }
Bus;

package Car; public class Bus extends Vehicle { private int seat;// 座位数 // 构造不要忘了 public Bus(String no, String brand, int seat) { super(no, brand);// 自动 this.seat = seat; // TODO Auto-generated constructor stub } @Override public int cale(int days) { if (seat < 16) return days * 800; else return days * 1500; } public int getSeat() { return seat; } public void setSeat(int seat) { this.seat = seat; } }
Car:

package Car; /** * 轿车类 * * @author Administrator * */ public class Car extends Vehicle { private String type;// 汽车型号 public Car(String no, String brand, String type) { super(no, brand); this.type = type; } @Override public int cale(int days) { if ("1".equals(type)) {// 代表550i return days * 500; } else if ("2".equals(type)) { return days * 600; } else return 300 * days; } public String getType() { return type; } public void setType(String type) { this.type = type; } }
Truck:

package Car; /** * 计算总的租价 * * @author Administrator * */ public final class Truck extends Vehicle { int ton;// 吨位 public Truck(String no, String brand, int ton) { super(no, brand); this.ton = ton; } @Override public int cale(int days) { // TODO Auto-generated method stub return days * ton; } }
Customer:

package Car; public class Customer { private String id; private String name; public Customer(String id,String name){ this.name=name; this.id=id; } public int calcTotalRent(Vehicle motos[],int days){ int sum=0; for(int i=0;i<motos.length;i++) sum+=motos[i].cale(days); return sum; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Test:

package Car; import java.util.Scanner; public class Test { public static void main(String[] args) { int days;// 租赁天数 int totalRent;// 总租赁费用 Vehicle motos[] = new Vehicle[5]; motos[0] = new Car("宝马x5", "豫DX56432", "1"); motos[1] = new Car("宝马x6", "豫DX51112", "2"); motos[2] = new Car("金龙", "豫DX99832", "3"); motos[3] = new Bus("别克林荫大道", "豫DX99832", 34); motos[4] = new Truck("比亚迪", "豫DX99832", 8); // 控制台输入 // 1、客户租赁的多辆汽车信息及租赁天数 Customer customer = new Customer("1", "万方"); // 2、计算总租赁费用 System.out.println("总租金为:" + customer.calcTotalRent(motos, 5)); } }
案例一:
Animal:

package text2; public class Animal { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void cry(){ System.out.println("不知道怎么叫"); } }
Cat:

package text2; public class Cat extends Animal{ public void cry(){ System.out.println("喵喵叫"); } }
Dog;

package text2; public class Dog extends Animal{ public void cry(){ System.out.println("汪汪叫"); } }
Test:

package text2; public class Tset { public static void main(String[] args){ Cat cat=new Cat(); cat.cry(); Dog dog=new Dog(); dog.cry(); Animal an=new Cat(); an.cry(); an=new Dog(); an.cry(); } }
案例二;
Animal:

package text2; public class Animal { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void cry(){ System.out.println("不知道怎么叫"); } public void eat(){ } }
Cat;

package text2; public class Cat extends Animal{ public void cry(){ System.out.println("喵喵叫"); } public void eat(){ System.out.println("猫喜欢吃鱼"); } }
Dog:

package text2; public class Dog extends Animal{ public void cry(){ System.out.println("汪汪叫"); } public void eat(){ System.out.println("狗喜欢吃骨头"); } }
Food;

package text2; public class Food { String name; public void showname(){ } }
Fish:
Bone;

package text2; public class Bone extends Food{ public void showname(){ System.out.println("我是骨头"); } }
MAster:

package text2; public class Master { //给动物喂食物 public void feed(Animal an,Food f)//灵活 { an.eat(); f.showname(); } }
Test;

package text2; public class Tset { public static void main(String[] args){ Master master=new Master(); master.feed(new Dog(), new Bone()); } }