Java多态实现的必要条件

多态分两种:
(1) 编译时多态(设计时多态):其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数。

(2) 运行时多态:而运行时多态是动态的,它是通过动态绑定来实现的,JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。(我们平时说得多的是运行时多态,所以多态主要也是指运行时多态)

运行时多态的解释:

a.运行时多态是指程序中定义的引用变量所指向的具体类型和b.通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定.

1.程序序中定义的引用变量所指向的具体类型不确定(即一个引用变量倒底会指向哪个类的实例对象) 。

2.通过该引用变量发出的方法调用在编程时并不确定(该引用变量发出的方法调用到底是哪个类中实现的方法) 。

在 java 面向对象中,Java 主要采用运行时多态,实现的必要条件为(AC)
A.要有继承
B.要有重载
C.要有父类引用指向子类对象(向上转型)
D.要有包

重载与重写是 Java 多态性的不同表现。
  重写是父类与子类之间多态性的表现,在运行时起作用(动态多态性,譬如实现动态绑定)
  而重载是一个类中多态性的表现,在编译时起作用(静态多态性,譬如实现静态绑定)。

多态的要点:

1.多态是方法的多态,不是属性的多态(多态与属性无关)

2.多态存在要有3个必要条件:继承、方法重写、父类引用指向子类对象。

3.父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。

例如 :Object cat = new Cat();

三个必要条件:

继承:在多态中必须存在有继承关系的子类和父类。其中继承包括了接口的实现implements

重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

关于使用使用父类引用指向子类对象:https://zhangvalue.blog.csdn.net/article/details/106269444

public class TestAnimal {
    public static void main(String[] args) {
        Animal a = new Animal();
        animalCry(a);

        Dog d = new Dog();
        animalCry(d);

        Cat t = new Cat();
        animalCry(t);
    }

    //多态的关键,通过父类的引用调用子类重写的方法。
    static void animalCry(Animal a) {
        a.shout();
    }
}
class Animal{
    public void shout() {
        System.out.println("animal 叫了一声");
    }
}

class Dog extends Animal{
    public void shout() {
        System.out.println("dog 汪汪汪!");
    }
}

class Cat extends Animal{
    public void shout() {
        System.out.println("cat 喵喵喵!");
    }
}

### 面向对象编程中多态的定义 在面向对象编程中,多态指的是允许同一操作作用于不同类型的对象上能够产生不同的执行效果。这种特性使得软件更加灵活和易于扩展[^1]。 具体来说,在代码层面体现为父类定义了一个方法而不去实现它,而是由各个子类根据自身的特性和需求提供具体的实现版本。当这些子类的对象被当作父类类型处理时,调用该方法将会表现出各自独特的行为模式[^3]。 例如: ```typescript class Animal { name: string; constructor(name: string){ this.name = name; } eat(){} } class Dog extends Animal{ eat(){ console.log(`${this.name} 吃狗粮`); } } class Wolf extends Animal{ eat(){ console.log(`${this.name} 吃肉`); } } ``` 在这个例子中,`Animal` 类作为基类提供了 `eat()` 方法但未给出具体实现;而其两个派生类 `Dog` 和 `Wolf` 则分别实现了这个方法以适应各自的进食习惯。这正是多态性的典型应用案例之一。 ### 实现多态的关键要素 要成功实现多态机制,需满足以下几个前提条件: - **存在继承关系**:即必须有一个或多个类是从另一个共同的超类派生出来的。只有在这种情况下才能利用父类引用指向实际创建的不同子类实例,并借此触发相应的方法重写逻辑。 - **具有虚函数/抽象方法支持**:对于 C++ 或 Java 这样的强类型语言而言,通常会在基类里声明带有特定修饰符(如 virtual 关键字)的方法以便后续能够在子类内对其进行覆盖替换。而在 TypeScript 中,则可通过定义接口或者使用 abstract 关键词达到相似的效果[^4]。 综上所述,多态不仅增强了程序结构上的灵活性与可维护性,同时也促进了组件间的解耦合度提升,从而降低了修改一处功能可能带来的连锁反应风险[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangvalue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值