写一些代码来实现下多态,帮助理解
//造血干细胞
public class HSCs {
public String name = "HSCs";
public String color = "none";
public boolean hasNucleus = true;
public void copyOfSelf(){
System.out.println("I can replicate myself"); //自我复制
}
public void work() {
System.out.println("differentiate into others"); //分化为其他细胞
}
}
//红细胞
class RBCs extends HSCs {
public String name = "RBCs";
public String color = "red";
public boolean hasFe = true;
public boolean hasNucleus = false;
public void CaptureOxygen() {
System.out.println("Capture Oxygen"); // 捕获氧气
}
public void work() {
System.out.println("Carry oxygen"); // 携带氧气
}
public void work(int amount) {
System.out.println("Carry " + amount + " molecules of oxygen"); // 携带一定数量的氧气
}
}
//白细胞
class Leukocyte extends HSCs {
public String color = "white";
public boolean hasNucleus = true;
public void work(String asd) {
System.out.println("I can eat rubbish" + asd);
}
public void work() {
System.out.println("I can eat rubbish");
}
}
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//父类引用指向子类对象
HSCs hscs = new RBCs();
// 查看父类和子类共有的成员变量
System.out.println(hscs.hasNucleus); // 输出结果为:true,是父类中的属性
System.out.println(hscs.color); // 输出结果为:none,是父类中的属性
// 查看子类特有的成员变量
// System.out.println(hscs.hasFe); //无法通过编译
// 调用被重写的方法
hscs.work(); // 输出结果为:“Carry oxygen”,是子类中的方法
// 调用子类中与父类同名但参数不同的方法(此方法应该被视为子类特有的方法)
// hscs.work(12); //无法通过编译
// 调用父类特有的方法
hscs.copyOfSelf(); // 输出结果为:“I can replicate myself”,是父类中的方法
// 调用子类特有的方法
// hscs.CaptureOxygen(); //无法通过编译
}
}
//测试下转换为子类后的对象
public class Test02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 转换类型之后
HSCs hscs = new RBCs();
RBCs rbCs = (RBCs) hscs; // 转换为红细胞
//Leukocyte leukocyte = (Leukocyte)hscs; 父类已经转换为子类,不可再次被转换
// 查看父类和子类共有的属性
System.out.println(rbCs.hasNucleus); // 输出结果为:false,是子类中的属性
System.out.println(rbCs.color); // 输出结果为:red,是子类中的属性
// 查看子类特有的属性
System.out.println(rbCs.hasFe); // 输出结果为:true,是子类中的属性
// 调用被重写的方法
rbCs.work(); // 输出结果为:“Carry oxygen”,是子类中的方法
// 调用子类中与父类同名但参数不同的方法(此方法应该被视为子类特有的方法)
rbCs.work(4); // 输出结果为:“Carry 4 molecules of oxygen”,是子类中的方法
// 调用父类特有的方法
rbCs.copyOfSelf(); // 输出结果为:“I can replicate myself”,是父类中的方法
// 调用子类特有的方法
rbCs.CaptureOxygen(); // 输出结果为:“Capture Oxygen”,是父类中的方法
}
}
简单总结
父类引用指向子类对象,可以使用父类中的属性以及方法,若方法被子类重写则会调用子类的方法,子类的其他方法则不可被使用;
强转后属性均变为子类中的,也可以调用子类中的其他方法。