java多态简单测试

写一些代码来实现下多态,帮助理解

//造血干细胞
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”,是父类中的方法

    }

}

简单总结
父类引用指向子类对象,可以使用父类中的属性以及方法,若方法被子类重写则会调用子类的方法,子类的其他方法则不可被使用;
强转后属性均变为子类中的,也可以调用子类中的其他方法。

### ### Java多态简单举例和解释 Java中的多态是一种面向对象编程的核心特性,它允许子类以不同的方式实现父类的方法,并且通过父类引用调用这些方法。多态的实现需要满足三个必要条件:继承或实现、方法的重写以及基类引用指向派生类对象[^2]。 以下是一个简单的示例来展示多态的具体应用: ```java // 定义一个父类 Shape abstract class Shape { public abstract void draw(); } // 子类 Cycle 实现了 Shape 的 draw 方法 class Cycle extends Shape { @Override public void draw() { System.out.println("Drawing a cycle"); } } // 子类 Rect 实现了 Shape 的 draw 方法 class Rect extends Shape { @Override public void draw() { System.out.println("Drawing a rectangle"); } } // 子类 Flower 实现了 Shape 的 draw 方法 class Flower extends Shape { @Override public void draw() { System.out.println("Drawing a flower"); } } // 测试类 public class TestShapes { public static void main(String[] args) { // 父类引用变量指向不同的子类对象 Shape[] shapes = {new Cycle(), new Rect(), new Cycle(), new Flower()}; // 通过统一的接口调用不同子类的实现 for (Shape shape : shapes) { shape.draw(); // 调用子类中重写的 draw 方法 } } } ``` 在上述代码中,`Shape` 是一个抽象类,定义了一个抽象方法 `draw()`。`Cycle`、`Rect` 和 `Flower` 是 `Shape` 的子类,它们各自实现了 `draw()` 方法[^1]。主类 `TestShapes` 中使用了多态,通过 `Shape` 类型的引用数组来访问不同的子类实例,并调用它们的 `draw()` 方法。尽管 `shapes` 数组中的每个元素都是 `Shape` 类型,但实际运行时会根据对象的具体类型执行相应的 `draw()` 方法。 这种行为体现了多态的一个关键特点:**编译时看左边(父类),运行时看右边(子类)**。也就是说,在编译阶段,`shape.draw()` 被认为是调用 `Shape` 类的 `draw()` 方法;而在运行时,JVM 根据实际的对象类型决定调用哪个具体的 `draw()` 实现[^2]。 多态的应用使得程序更加灵活和可扩展。例如,如果需要添加新的图形类型,只需继承 `Shape` 并重写 `draw()` 方法即可,而无需修改已有的代码逻辑。此外,多态还支持接口级别的编程,进一步解耦了系统组件之间的依赖关系[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值