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#中,如果你想实现类似的行为,需要:
- 在父类方法上使用
virtual
关键字 - 在子类方法上使用
override
关键字 - 如果子类想要调用父类的方法实现,可以使用
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#**:必须显式使用
virtual
和override
关键字来实现方法重写,否则子类的方法会被视为新方法(隐藏父类方法,使用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#更简单:
- 没有vo关键字,有类似base的super
- 继承接口用implements
- 接口中可以声明变量,但是是静态常量
- 不存在显示实现接口(多个接口存在同名方法,实现一次即可)
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