多态的使用

这篇具有很好参考价值的文章主要介绍了多态的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、认识多态

  • 面向对象三大特征:封装、继承、多态   

什么是多态?

  • 同类型的对象,表现出不同的 形态 。(对象的多种形态。)
  • 同类型的对象,执行同一个行为,会表现出不同的行为 特征
  • 同一个对象,在不同时刻表现出来的不同形态

多态的表现形式?

父类类型      对象名称            =           子类对象;(父类类型    对象名称   =  new  子类构造器)
接口             对象名称            =   new    实现类构造器;

多态的前提?

  • 有  继承 / 实现  关系;
  • 有父类引用指向子类对象
  • 有方法重写

多态的好处?

  • 使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private String name;
    private int age;
    
    public void show() {
        System.out.println(name + "," + age);
    }
}
class Student extends Person {

    @Override
    public void show() {
        System.out.println("学生的信息位:" + getName() + ", " + getAge());
    }
}
class Teacher extends Person {

    @Override
    public void show() {
        System.out.println("老师的信息为:" + getName() + ", " + getAge());
    }
}
class Administrator extends Person {

    @Override
    public void show() {
        System.out.println("管理员的信息为:" + getName() + ", " + getAge());
    }
}

class Test {
    public static void main(String[] args) {
//      创建三个对象,并调用register方法
        Student s = new Student();
        s.setName("张三");
        s.setAge(18);

        Teacher t = new Teacher();
        t.setName("王建国");
        t.setAge(20);

        Administrator admin = new Administrator();
        admin.setName("管理员");
        admin.setAge(35);

        register(s);
        register(t);
        register(admin);
    }
//  这个方法既能接收老师,又能接收学生,还能接收管理员
//  只能把参数写成这三个类型的父类
    public static void register(Person p) {
        p.show();
    }
}
D:\Java\jdk-17\bin\java.exe
学生的信息位:张三, 18
老师的信息为:王建国, 20
管理员的信息为:管理员, 35

Process finished with exit code 0

2、多态调用成员的特点 

  • 变量调用:编译看左边,运行也看左边。

    编译看左边:javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。

    运行看左边:java运行代码的时候,实际获取的就是左边父类中成员变量的值

  • 方法调用:编译看左边,运行看右边。

    编译看左边:javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。

    运行看右边:java运行代码的时候,实际上运行的是子类中的方法

    Animal   a  =  new   Dog();

    现在用 a 去调用变量和方法的呀?是的

    而a是Animal类型的,所以默认都会从Animal这个类中去找

    //成员变量:在子类的对象中,会把父类的成员变量也继承下的的。父:name        子:name

    //成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的。             

  • 多态的使用,# 面向对象,java,开发语言,多态

3、为什么成员变量和成员方法的访问不一样呢? 

  • 因为成员方法有重写,而成员变量没有

4、多态调用成员的内存图解 

首先第一步测试类的字节码文件先加载到方法区当中,然后虚拟机会自动的去调用main方法,然后会先加载父类的字节码文件,然后会再加载子类的字节码文件。

多态的使用,# 面向对象,java,开发语言,多态

5、多态的优势和弊端

      多态的优势

  • 在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
  • 定义方法的时候,使用 父类型 作为参数,可以接收所有子类对象(该方法就可以接收这父类的一切子类对象),体现多态的扩展性与便利。

多态的使用,# 面向对象,java,开发语言,多态

      多态的劣势 

  • 多态下不能使用子类的独有功能

多态的使用,# 面向对象,java,开发语言,多态

6、引用数据类型的类型转换,有几种方式?

  • 自动类型转换、(从子到父):子类对象赋值给父类类型的变量指向。
  • 强制类型转换、(从父到子):
  1. 此时必须进行强制类型转换:子类     对象变量 = (子类)父类类型的变量
  2. 作用:可以解决多态下的劣势,可以实现调用子类独有的功能。
  3. 注意:如果 转型后的类型 和对象真实类型 不是同一种类型 ,那么在转换的时候就会出现 ClassCastException 。
  4. Java建议强制转换前使用instanceof判断当前对象的真实类型,再进行强制转换

7、强制类型转换能解决什么问题? 

  • 可以转换成真正的子类类型,从而调用 子类独有功能
  • 继承关系 / 实现 的2个类型就可以进行强制转换,编译无问题。
  • 转换类型与真实对象类型不一致会报错。(运行时,如果发现强制转换后的类型不是对象真实类型则报错。类型转换异常:ClassCastException)
  • 转换的时候用instanceof关键字进行判断

8、instanceof 在 jdk14,语言等级16中的新特性

多态的使用,# 面向对象,java,开发语言,多态文章来源地址https://www.toymoban.com/news/detail-627888.html

public class Test {
    public static void main(String[] args) {
        Animal a = new Dog();
        a.eat();
//        ((Dog) a).lookHome();
        /*if (a instanceof Dog) {
            Dog d = (Dog) a;
            d.lookHome();
        } else if (a instanceof Cat) {
            Cat c = (Cat) a;
            c.catchMouse();
        } else {
            System.out.println("没有这个类型,无法转换");
        }*/

        //jdk14新特性,语言等级16
        if (a instanceof Dog d) {
            d.lookHome();
        } else if (a instanceof Cat c) {
            c.catchMouse();
        } else {
            System.out.println("没有这个类型,无法转换");
        }

    }
}
class Animal {
    public void eat() {
        System.out.println("动物在吃东西");
    }
}
class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
    public void lookHome() {
        System.out.println("狗看家");
    }
}
class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃小鱼干");
    }
    public void catchMouse() {
        System.out.println("猫抓老鼠");
    }
}

9、多态的综合练习 

  • 不使用多态完成练习

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private String name;
    private int age;

    public void keepPet(Dog dog, String something) {
        System.out.println("年龄为" + age + "岁的" + name + "养了一只" + dog.getColor() + "颜色的" + dog.getAge() + "岁的狗");
        dog.eat(something);
    }

    public void keepPet(Cat cat, String something) {
        System.out.println("年龄为" + age + "岁的" + name + "养了一只" + cat.getColor() + "颜色的" + cat.getAge() + "岁的猫");
        cat.eat(something);
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Animal {
    private int age;
    private String color;
  
    public void eat(String something) {
        System.out.println("动物在吃" + something);
    }
}
class Dog extends Animal {
    int age;
    String color;
    public Dog() {
    }
    public Dog(int age, String color) {
        super(age, color);
    }

    @Override
    public void eat(String something) {
        System.out.println(getAge() + "岁的" + getColor() + "颜色的狗两只前腿死死的抱住" + something + "猛吃");
    }
    public void lookHome() {
        System.out.println("狗看家");
    }
}
class Cat extends Animal {
    public Cat() {
    }
    public Cat(int age, String color) {
        super(age, color);
    }
    @Override
    public void eat(String something) {
        System.out.println(getAge() + "岁的" + getColor() + "颜色的猫咪着眼睛侧着吃" + something);
    }
    public void catchMouse(String something) {
        System.out.println("猫抓老鼠");
    }
}
class Test {
    public static void main(String[] args) {
        Person person = new Person("老王", 30);
        Dog dog = new Dog(2, "黑");
        person.keepPet(dog, "骨头");

        Person person1 = new Person("老李",25);
        Cat cat = new Cat(3, "灰");
        person1.keepPet(cat,"鱼");
    }
}
D:\Java\jdk-17\bin\java.exe
年龄为30岁的老王养了一只黑颜色的2岁的狗
2岁的黑颜色的狗两只前腿死死的抱住骨头猛吃
年龄为25岁的老李养了一只灰颜色的3岁的猫
3岁的灰颜色的猫咪着眼睛侧着吃鱼

Process finished with exit code 0
  • 使用继承关系完成多态练习

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private String name;
    private int age;

    public void keepPet(Animal a, String something) {
        if (a instanceof Dog d) {
            System.out.println("年龄为" + age + "岁的" + name + "养了一只" + d.getColor() + "颜色的" + d.getAge() + "岁的狗");
            d.eat(something);
        } else if (a instanceof Cat c) {
            System.out.println("年龄为" + age + "岁的" + name + "养了一只" + c.getColor() + "颜色的" + c.getAge() + "岁的猫");
            c.eat(something);
        } else {
            System.out.println("没有这种动物");
        }
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Animal {
    private int age;
    private String color;
   
    public void eat(String something) {
        System.out.println("动物在吃" + something);
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Dog extends Animal {
    int age;
    String color;

    @Override
    public void eat(String something) {
        System.out.println(getAge() + "岁的" + getColor() + "颜色的狗两只前腿死死的抱住" + something + "猛吃");
    }
    public void lookHome() {
        System.out.println("狗看家");
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Cat extends Animal {
   
    @Override
    public void eat(String something) {
        System.out.println(getAge() + "岁的" + getColor() + "颜色的猫咪着眼睛侧着吃" + something);
    }

    public void catchMouse() {
        System.out.println("猫抓老鼠");
    }
}
class Test {
    public static void main(String[] args) {
        Person p = new Person("老王", 30);
        Person p2 = new Person("老王", 25);
        Dog d = new Dog(2, "黑");
        Cat c = new Cat(3, "灰");
        p.keepPet(d, "骨头");
        p2.keepPet(c, "鱼");
    }
}
D:\Java\jdk-17\bin\java.exe
年龄为30岁的老王养了一只黑颜色的2岁的狗
2岁的黑颜色的狗两只前腿死死的抱住骨头猛吃
年龄为25岁的老王养了一只灰颜色的3岁的猫
3岁的灰颜色的猫咪着眼睛侧着吃鱼

Process finished with exit code 0
  • 使用实现关系(接口)完成多态练习

public interface USB {
    void connect();
    void unconnect();
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Mouse implements USB {
    private String name;
   
    @Override
    public void connect() {
        System.out.println(name + "成功的接入了设备~~~");
    }
    @Override
    public void unconnect() {
        System.out.println(name + "成功的从设备弹出~~~");
    }
    public void click() {
        System.out.println(name + "双击点亮小红心~~~");
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class KeyBoard implements USB {
    private String name;
   
    @Override
    public void connect() {
        System.out.println(name + "成功的接入了设备~~~");
    }
    @Override
    public void unconnect() {
        System.out.println(name + "成功的从设备弹出~~~");

    }
    public void keyDown() {
        System.out.println(name + "写下了:老铁,6666,下次再来哦,老弟~~~~");
    }
}
class Computer {
    public void installUSB(USB u) {
        u.connect();
        if (u instanceof Mouse m) {
            m.click();
        } else if (u instanceof KeyBoard k) {
            k.keyDown();
        } else {
            System.out.println("不符合");
        }
        u.unconnect();
    }
}
class Test1 {
    public static void main(String[] args) {
        Computer c = new Computer();
        USB u = new Mouse("罗技鼠标");
        c.installUSB(u);
        USB k = new KeyBoard("双飞燕键盘");
        c.installUSB(k);
    }
}
D:\Java\jdk-17\bin\java.exe
罗技鼠标成功的接入了设备~~~
罗技鼠标双击点亮小红心~~~
罗技鼠标成功的从设备弹出~~~
双飞燕键盘成功的接入了设备~~~
双飞燕键盘写下了:老铁,6666,下次再来哦,老弟~~~~
双飞燕键盘成功的从设备弹出~~~

Process finished with exit code 0

到了这里,关于多态的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go后端开发 -- 面向对象特征:结构体 && 继承 && 多态 && interface

    type 用来声明数据类型 使用 type 定义结构体 对于结构体对象: 可以先定义后初始化; 也可以直接在{}中初始化 值传参 传递的是结构体的拷贝,原结构体不会发生改变 引用传递 传递的是结构体的指针,原结构体的值会改变 GetName 这个函数前面的 (this Hero) 表明这个函数是绑定

    2024年01月17日
    浏览(45)
  • Educoder/头歌JAVA——JAVA面向对象:封装、继承和多态的综合练习

    目录 第1关:封装、继承和多态进阶(一) 相关知识 面向对象思想 封装 继承 组合和继承 构造函数 super()和this() 编程要求 第2关:封装、继承和多态进阶(二) 相关知识 重写和重载 abstract(抽象类)和interface(接口) final static static的作用 多态 编程要求 第

    2024年02月04日
    浏览(55)
  • 【Java不看后悔系列】|面向对象编程|[继承、封装、多态全覆盖]

    🌈个人主页:  Aileen_0v0 🔥系列专栏: Java学习系列专栏 💫个人格言:\\\"没有罗马,那就自己创造罗马~\\\" (inheritance) 1.A child class inherits everything from its parent class. 2.A child class cannot inherit the constructors from its parent class . 子类 继承 的内容: 字段(成员变量): 子类会继承父类的字段

    2024年02月05日
    浏览(52)
  • 【 Python 全栈开发 ⑰ 】面向对象、继承、多态、类方法与类属性

    Python 面向对象编程 是一种编程范式,它将数据和操作数据的方法组合在一起,形成一个“对象”,并且该对象可以被复用。在 Python 中,每一个对象都拥有一些属性和方法,它们是该对象的特征和行为。 面向对象编程可以帮助我们更好地组织和管理代码,使得代码更加模块

    2024年02月08日
    浏览(45)
  • 【Java SE语法篇】8.面向对象三大特征——封装、继承和多态

    📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 面向对象三大特性:封装、继承和多态。 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部

    2024年02月01日
    浏览(59)
  • 【Java面向对象】多态的详细介绍,简单易懂,看这一篇就够了

    A: 方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承的基础之上的。简单来说,多态是具有表现多种形态的能力的特征。 消除类型之间的耦合关系 可替代性 可扩充性 接口性 灵活性 简化性 重载式多态在编译时已经确定好了。方法名相同而参数

    2024年01月20日
    浏览(70)
  • Java面向对象——多态、Object类、instanceof关键字以及final关键字

    总之,多态是面向对象编程中一个非常重要的概念,通过它可以实现统一的接口来操作不同的对象,提高代码的可读性和可维护性。在实际编程中,多态性的使用可以使代码更加灵活和扩展性更强。方法重写是实现多态的基础。 重写如下所示 关于hashCode方法的重写: 重写t

    2024年02月12日
    浏览(70)
  • 【Java基础教程】(十四)面向对象篇 · 第八讲:多态性详解——向上及向下转型、关键字 final与 instanceof的作用~

    掌握final 的主要作用及使用; 掌握对象多态性的概念以及对象转型的操作; 掌握instanceof 的主要作用及使用; 在Java 中 final称为终结器,在Java 里面可以使用 final定义类、方法和属性,用于表示不可变性 。 final 类:当一个类被声明为 final 时,意味着该类不能被

    2024年02月16日
    浏览(53)
  • 面向对象详解,面向对象的三大特征:封装、继承、多态

    一、面向对象与面向过程 面向对象编程 (Object-Oriented Programming,简称OOP)和 面向过程编程 (Procedural Programming,简称PP)是两种不同的 编程范式 。 面向对象编程强调把问题分解成对象,通过封装、继承和多态等机制,来处理对象之间的关系 。每个对象都可以独立地处理自

    2024年02月21日
    浏览(53)
  • 【JavaSE】面向对象之多态

    通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 必须要满足如下几个条件,缺一不可: 必须在 继承 体系下 子类必须要对父类中方法进行 重写 通过父类的引用调用重写的方法 定义测试类TestAnimal.java 编译器在编译代码时

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包