多态性使得Java语言有很强的灵活性
很多设计模式都是基于多态的特点发展出来的
多态
父类(抽象的)引用指向子类(具体的)对象
Animal a = new Person();
编译时,编译器检查左边(Animal a)
a.getAge(); //编译通过,Animal中有getAge()
a.speakLanguage(); //编译失败,Animal中没有子类的特有方法speakLanguage()
多态编译是否通过,就看父类中是否存在被调用的方法
多态性使得Java语言有很强的灵活性
很多设计模式都是基于多态的特点发展出来的
多态
父类(抽象的)引用指向子类(具体的)对象
Animal a = new Person();
编译时,编译器检查左边(Animal a)
a.getAge(); //编译通过,Animal中有getAge()
a.speakLanguage(); //编译失败,Animal中没有子类的特有方法speakLanguage()
多态编译是否通过,就看父类中是否存在被调用的方法
a.getAge(); //运行时,如果子类有覆盖,则调用子类的getAge(),否则调用父类的getAge()
a.speakLanguage(); //无法运行,编译没通过;只能通过对象向下转型才能调用特有方法
多态的好处
1.可以提高代码的扩展性,父类引用可以接收多种子类对象
向上转型--->限定功能使用,提高扩展性,实现统一操作
Animal a = new Person();
getAnimalAge(a); //凡是Animal对象都可以使用getAnimalAge()方法,实现统一操作
多态的弊端
1.由于子类对象类型的向上提升,导致父类引用只能调用父类中定义好的方法/规则,会丢失对子类特有方法的调用;
调用子类对象特有方法的解决方案:
向下转型--->使用对象的特有方法
Person person = (Person)Amimal;
person.speakLanguage();
风险:类型转换异常
通过类型判断: A instanceof AType ?
多态使用的前提
1.必须有继承或者实现关系--->父类通过引用来接收子类对象
2.要想在运行时父类引用调用到子类的方法,这些方法必须是覆盖父类的方法,子类特有方法在多态下无法调用!
多态中的成员变量
编译和运行都参考左边的父类;
成员变量没有覆盖的功能,子类与父类可以存在相同类型相同名称的变量;
记住:多态时,类型发生了提升,所有调用都要看父类中的定义,
对于成员变量而言,是不存在覆盖的,所以始终都是使用的父类的成员变量,但是子类可以 改变这个变量值!
对于方法而言,如果子类有覆盖,则调用子类的,否则调用父类的;
示例1
public class Animal { int num; public Animal() { num = 1; } private void say() { System.out.println("Animal.say()"); } public void hello() { say(); System.out.println("Animal.hello():"+num); } }
public class Person extends Animal{ //子类可以定义与父类完全相同的成员变量,这样,子类与父类各自持有自己的一份成员变量 //注意:成员变量没有覆盖的功能 //int num; public Person() { //如果子类自己也定义了与父类相同的成员变量,则这里就是对子类的成员变量进行赋值 //否则,就是对继承自父类的成员变量进行赋值; num = 3; } }
public class Test { public static void main(String[] args) { Animal p = new Person(); p.hello(); } }
运行结果说明:
Animal.say()
Animal.hello():3
子类没有覆盖父类中的方法,将调用父类的hello(),所以父类中的私有方法也被调用到,但是,子类改变了父类的成员变量,所以num从1变为了3。
示例2
子类定义了与父类完全相同的成员变量
public class Animal { int num; public Animal() { num = 1; } private void say() { System.out.println("Animal.say()"); } public void hello() { say(); System.out.println("Animal.hello():"+num); } }
public class Person extends Animal{ //子类定义了一个与父类相同的成员变量num int num; public Person() { //子类中有成员变量num,则这里就是对子类自己的成员变量num进行赋值 num = 3; } }
public class Test { public static void main(String[] args) { Animal p = new Person(); p.hello(); } }
运行结果:
Animal.say()
Animal.hello():1
子类没有覆盖父类的hello(),所以,调用父类的hello();
由于子类定义了一个与父类完全相同的成员变量num,并在构造函数中初始化,但是这是对子类自己的num成员变量进行赋值,并不会修改父类的成员变量num,所以,执行结果中的num=1;
示例3
子类定义了与父类完全相同的成员变量,并覆盖父类的方法
public class Animal { int num; public Animal() { num = 1; } private void say() { System.out.println("Animal.say()"); } public void hello() { say(); System.out.println("Animal.hello():"+num); } }
public class Person extends Animal{ //子类定义了一个与父类相同的成员变量num int num; public Person() { //子类中有成员变量num,则这里就是对子类自己的成员变量num进行赋值 num = 3; } public void hello() { System.out.println("Person.hello():"+num); } }
public class Test { public static void main(String[] args) { Animal p = new Person(); p.hello(); } }
运行结果:
Person.hello():3
子类定义了与父类完全相同的成员变量,则子类构造函数中赋值操作是针对子类自己的成员变量num进行的;
子类对父类方法进行了覆盖,调用时,将执行子类的方法;
由于执行的是子类的方法,方法中使用的变量就是子类中定义的变量
所以,num=3。
多态中的成员函数---成员函数绑定到对象上执行
非静态方法的执行都是绑定到对象上进行的
如果子类有覆盖父类的方法,则子类对象直接调用自己的这个覆盖方法;
如果子类没有覆盖父类的方法,则子类会通过super调用父类的方法;
Animal a = new Person();
a.getType();//子类没有覆盖,就调用父类的;有覆盖,就调用子类重写的;
相关推荐
Java 多态是 Java 编程语言中的一种基本概念,它允许开发者定义一个接口,并且可以通过不同的类来实现该接口。多态性是 Java 面向对象编程的核心机制之一,它使得程序更加灵活、可维护和可扩展。 多态的体现 多态...
在Java中,一个类只能单继承一个父类,但可以实现多个接口,这就是多态的基础。继承的多态性体现在父类引用指向子类对象时,调用的方法可以是子类重写过的,这样就表现出不同的行为。 2. 抽象类与接口:抽象类是不...
Java基础多态PPT教学课件.pptx
在Java中,只有引用类型变量才能实现多态,基本类型变量无法实现。例如: ```java Animal myAnimal1 = new Animal(); Animal myAnimal2 = new Dog(); myAnimal1.sound(); // 输出 "Animal makes a sound" myAnimal...
Java基础之多态课程PPT适用于基础学习者使用,很好的课程资源
本资源摘要信息将对 Java 基础知识点进行总结,涵盖继承、封装、多态等概念,并对面向对象的设计、数据库设计模式等进行讲解。 继承 继承是 Java 中的一种机制,允许一个类继承另一个类的属性和方法。继承的语法是...
### Java多态经典讲解 #### 一、理解Java多态 多态,作为面向对象编程的三大特性之一,是继抽象和继承之后的关键概念。它允许我们以统一的接口处理不同类型的对象,增强了代码的灵活性和可扩展性。在Java中,多态...
Java多态是面向对象编程中的一个核心概念,它允许我们以一种统一的方式处理不同类型的对象。在Java中,多态性主要体现在方法的重写(Override)和重载(Overload)。通过多态,我们可以编写出更加灵活、可扩展的代码...
Java中的多态是面向对象编程的关键特性之一,它允许一个接口或者抽象方法被多个不同的类实现,从而使得代码更加灵活且可扩展。多态的概念基于一个接口可以有多种不同的实现方式,增强了程序的多样性和适应性。 在...
在Java中,多态的基础是继承。子类继承父类,从而获取了父类的属性和方法。这样,子类不仅拥有自己的特性,还能共享父类的功能,增加了代码的复用性。 2. **重写**: 子类可以重写父类中的方法,这意味着子类可以...
在Java中,多态的实现机制主要包括以下几点: 1. **方法的覆盖(Override)**:派生类可以重写基类中的非final、非静态方法,以实现不同的功能。这使得通过基类引用调用方法时,实际执行的是派生类中的方法。 2. *...
//练习: ...可以统计数组中教师实际人数。 //d.可以根据教师编号查找教师。 //e.更新某个id的教师信息。 //f.可以根据id删除某个教师。 //g.求最高和最低工资教师。 //h.对教师按总工资进行排序。
- **继承或实现**:多态的基础是类的继承或接口的实现。只有当子类继承了父类或者实现了父接口,才能覆盖父类的方法。 - **方法重写**:子类必须重写父类中至少一个方法,使得调用同一方法时,根据子类的实现产生...
6. ** finalize 方法**:虽然不是直接与多态相关的,但值得注意的是,Java中每个对象都有一个finalize()方法,这是垃圾收集器在回收对象前调用的,子类可以重写这个方法进行资源清理,但这并不保证一定会被调用,...
【Java基础多态】在Java编程中,多态性(Polymorphism)是面向对象三大特性之一,它允许我们使用一个引用类型来调用不同的实现,使得代码更加灵活且易于扩展。多态能够提高代码的复用性,降低耦合度,是软件设计中的...
这使得不同类可以实现相同的接口,提供了多态的基础。 例如,我们可以创建一个名为`Animal`的接口,其中定义了`sound()`方法: ```java public interface Animal { void sound(); } ``` 然后,我们有两个类`Dog`...
Java中的多态是面向对象编程的一个核心特性,它允许我们以一种统一的方式处理不同类型的对象。在本PPT教案中,通过宠物喂食的例子来解释多态的概念和用途。 首先,例子展示了宠物(如狗狗和企鹅)有不同的饮食需求...
Java多态实现是面向对象编程中的一个核心概念,它允许我们使用父类的引用变量来指向子类的对象,从而在运行时决定所调用的方法。这一特性极大地增强了代码的灵活性和扩展性,使得代码能够更好地应对未来的需求变化。...
### Java多态详解 #### 什么是多态? 多态(Polymorphism)是面向对象编程的一个核心特性,指的是一个接口可以被多个类所实现或一个类可以被多个类所继承,进而表现出不同的行为。在Java中,多态主要体现在两个...
Java多态是面向对象编程中的一个核心特性,它允许我们以一种统一的方式处理不同类型的对象。在Java中,多态性主要通过继承、接口和方法重写(Override)来实现。这里我们将深入探讨从虚拟机(JVM)的角度来看,Java...