12.面向对象多态

12.面向对象-多态


12.1 知识点

Java中的vob

Java多态示例

Java中没有vo关键字,也就是virtual(虚函数)和override(重写)
我们如果要重写基类的方法,直接在子类中实现同名方法即可
它会直接覆盖父类方法!!
Java中有类似 base 的关键字 super

注意:重写是Java会自动补全一个@Override,它类似于注释,可有可无,主要是用来帮助我们阅读代码。在 Java 中,即使没有使用@Override注解,子类的方法也会自动覆盖(override)父类的方法

public abstract class Lesson12_AnimalAbstract
{
    public int age;

    public abstract void Eat();
}

public class Lesson12_AnimalFather extends Lesson12_AnimalAbstract
{
    @Override
    public void Eat()
    {
        System.out.println("父亲吃东西");
    }
}

public class Lesson12_AnimalSon extends Lesson12_AnimalFather implements Lesson12_IFly, Lesson12_IBird
{
    @Override
    public void Eat() {
        super.Eat();
        System.out.println("儿子吃东西");
    }

    @Override
    public void Fly() {
        System.out.println("飞翔");
    }
}
Lesson12_AniamlFather s = new Lesson12_AnimalSon();
s.Eat(); // 父亲吃东西 儿子吃东西 在C#如果没有使用vob的话只会打印父类的 但是Java自动处理了

Java和C#的多态对比

在C#中,如果你想实现类似的行为,需要:

  1. 在父类方法上使用virtual关键字
  2. 在子类方法上使用override关键字
  3. 如果子类想要调用父类的方法实现,可以使用base.方法名()

C#的代码示例:

public abstract class AnimalAbstract
{
    public int Age;
    public abstract void Eat();
}

public class AnimalFather : AnimalAbstract
{
    public override void Eat()
    {
        Console.WriteLine("父亲吃东西");
    }
}

public class AnimalSon : AnimalFather, IFly, IBird
{
    public override void Eat()
    {
        base.Eat(); // 调用父类实现
        Console.WriteLine("儿子吃东西");
    }

    public void Fly()
    {
        Console.WriteLine("飞翔");
    }
}

调用代码:

AnimalFather s = new AnimalSon();
s.Eat(); // 输出:父亲吃东西 儿子吃东西

如果C#没有使用vob,用父类装子类的话,那么只会输出父亲的方法

AnimalFather s = new AnimalSon();
s.Eat(); // 输出:父亲吃东西 

关键区别

  • Java:默认方法是非final的,可以被重写,除非明确声明为final。使用@Override注解是可选的,但强烈推荐,它可以帮助编译器检查你是否正确重写了方法。
  • **C#**:必须显式使用virtualoverride关键字来实现方法重写,否则子类的方法会被视为新方法(隐藏父类方法,使用new关键字)。

抽象类和抽象方法

Java中的抽象类和抽象方法使用和C#中基本一致
关键字:abstract
抽象类不能被实例化
抽象方法在抽象类中声明,必须被实现

接口

Java中接口中方法默认(只能)为public
Java中接口可以声明字段,但是默认(只能)是static和final的,也就是静态常量
Java中继承接口的关键字是implements,一般写在继承类之后
继承多个接口用逗号分隔
Java中不存在显示实现接口,重写不同接口的同名方式时,”两个接口共享”

public interface Lesson12_IBird
{
    void Fly();
}

public interface Lesson12_IFly
{
    // 默认并且只能是 静态常量
    int speed = 10;
    void Fly();
}
System.out.println(Lesson12_IFly.speed); // 10
Lesson12_IFly s2 = new Lesson12_AnimalSon();
s2.Fly(); // 飞翔
Lesson12_IBird s3 = (Lesson12_IBird) s2;
s3.Fly(); // 飞翔

总结

Java中多态相关知识点,和C#中基本一致,相对C#更简单:

  1. 没有vo关键字,有类似base的super
  2. 继承接口用implements
  3. 接口中可以声明变量,但是是静态常量
  4. 不存在显示实现接口(多个接口存在同名方法,实现一次即可)

12.2 知识点代码

Lesson12_AnimalAbstract

public abstract class Lesson12_AnimalAbstract
{
    public int age;

    public abstract void Eat();
}

Lesson12_AnimalFather

public class Lesson12_AnimalFather extends Lesson12_AnimalAbstract
{
    @Override
    public void Eat()
    {
        System.out.println("父亲吃东西");
    }
}

Lesson12_AnimalSon

public class Lesson12_AnimalSon extends Lesson12_AnimalFather implements Lesson12_IFly, Lesson12_IBird
{
    @Override
    public void Eat() {
        super.Eat();
        System.out.println("儿子吃东西");
    }

    @Override
    public void Fly() {
        System.out.println("飞翔");
    }
}

Lesson12_IBird

public interface Lesson12_IBird
{
    void Fly();
}

Lesson12_IFly

public interface Lesson12_IFly
{
    //默认并且只能是 静态常量
    int speed = 10;
    void Fly();
}

Lesson12_面向对象_多态

public class Lesson12_面向对象_多态
{
    public static void main(String[] args)
    {
        //知识点1: Java中的vob
        //Java中没有vo关键字,也就是virtual(虚函数)和override(重写)
        //我们如果要重写基类的方法,直接在子类中实现同名方法即可
        //它会直接覆盖父类方法!!
        //Java中有类似 base 的关键字 super

        //注意:重写是Java会自动补全一个@Override
        //它类似于注释,可有可无,主要是用来帮助我们阅读代码
        Lesson12_AnimalAbstract s = new Lesson12_AnimalSon();
        s.Eat();//父亲吃东西 儿子吃东西 在C#只会打印父类的 但是Java自动处理了



        //知识点2:抽象类和抽象方法
        //Java中的抽象类和抽象方法使用和C#中基本一致
        //关键字:abstract
        //抽象类不能被实例化
        //抽象方法在抽象类中声明,必须被实现


        //知识点3:接口
        //1.Java中接口中方法默认(只能)为public
        //2.Java中接口可以声明字段,但是默认(只能)是static和final的,也就是静态常量
        //3.Java中继承接口的关键字是implements,一般写在继承类之后
        //4.继承多个接口用逗号分隔
        //5.Java中不存在显示实现接口,重写不同接口的同名方式时,"两个接口共享"
        System.out.println(Lesson12_IFly.speed);//10
        Lesson12_IFly s2 = new Lesson12_AnimalSon();
        s2.Fly();//飞翔
        Lesson12_IBird s3 = (Lesson12_IBird) s2;
        s3.Fly();//飞翔


        //总结
        //Java中多态相关知识点
        //和C#中基本一致,相对C#更简单
        //1.没有vo关键字,有类似b的super
        //2.继承接口用implements
        //3.接口中可以声明变量,但是是静态常量
        //4.不存在显示实现接口(多个接口存在同名方法,实现一次即可)
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏