首页 > 编程语言 >Java入门5(多态)

Java入门5(多态)

时间:2023-04-10 15:44:11浏览次数:44  
标签:Java 入门 子类 void 多态 System println public out

多态

编译时的多态:方法重载

运行时的多态:动态绑定

多态的三大前提

  1. 类之间要有继承关系
  2. 要出现方法重写
  3. 父类的引用指向了子类的对象

测试样例

// 定义Person类
public class Person {
    public String name;
    public String sex;
    public int age;
    public Person(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    public void eat(){
        System.out.println("Person => eat()");
    }
}
// 定义Student类,继承Person类
public class Student extends Person{
    public int stuNum;
    public int score;
    public Student(String name, String sex, int age) {
        super(name, sex, age);
    }
    public void study(){
        System.out.println("Student => study()");
    }
	// 重写父类方法
    @Override
    public void eat() {
        System.out.println("Student => eat()");
    }
}
// 测试类(Application)
public class Application {
    public static void main(String[] args) {
        Person robot01 = new Student("robot01","female",18);
        Person robot02 = new Person("robot02","male",18);
        robot01.eat(); // Student => eat()
        robot02.eat(); // Person => eat()
        // robot01.study(),爆红
    }
}

多态的转型

为什么需要转型

​ 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误,也就是说,不能调用子类拥有 而父类没有的方法,编译都错误,更别说运行了,所以,想要调用子类特有的方法,必须做向下转型

向上转型(父类类型 变量名 = 子类对象

​ 多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的,当父类引用指向一个子类对象时,便是向上转型

向下转型(子类类型 变量名 = (子类类型) 父类变量名

​ 父类类型向子类类型向下转换的过程,这个过程是强制的,一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。

// 定义父类Draw
public class Draw {
    public void drawPicture(){
        System.out.println("Draw => draw()");
    }
}
// 定义子类Circle
public class Circle extends Draw{
    // 重写父类方法
    @Override
    public void drawPicture() {
        System.out.println("Circle => DrawCircle()");
    }
    // 子类独有的方法
    public void roll(){
        System.out.println("Circle => roll()");
    }
}
// 测试类
public class Application {
    public static void main(String[] args) {
        // 向上转型
        Draw picture = new Circle();
        // 只能使用被重写的方法
        picture.drawPicture(); // Circle => DrawCircle()
        
        // 向下转型
        Circle circlePic = (Circle)picture;
        // 可以使用子类自己的方法
        picture.drawPicture(); // Circle => DrawCircle()
        circlePic.roll(); // Circle => roll()
    }
}

instance of 运算符

作用:判断左面的对象是否是右面的类的实例,返回值为bool类型

// 定义父类Father
public class Father {
    public void say(){
        System.out.println("I'm father!");
    }
}
// 定义接口Eat
public interface Eat {
    public void eat();
}
// 定义子类Son1,继承父类Father以及接口Eat
public class Son1 extends Father implements Eat{
    // 重写父类方法
    @Override
    public void say() {
        System.out.println("I'm son1!");
    }
	// 实现接口方法
    @Override
    public void eat() {
        System.out.println("Son1 => eat()");
    }
}
// 测试类(Application)
public class Application {
    public static void main(String[] args) {
        Father robot01 = new Son1();
        Eat robot02 = new Son1();
        robot01.say(); // I'm son1!
        robot02.eat(); // Son1 => eat()
        System.out.println(robot01 instanceof Father); // true
        System.out.println(robot01 instanceof Son1); // true
        System.out.println(robot02 instanceof Father); // true
        System.out.println(robot02 instanceof Son1); // true
    }
}

多态的好处

  1. 限制类的使用者只能使用父类定义的方法,无法使用子类新定义的方法
  2. 可以扩展数据存储的范围
  3. 可以拓展方法的参数类型和返回值类型

标签:Java,入门,子类,void,多态,System,println,public,out
From: https://www.cnblogs.com/te9uila/p/17303127.html

相关文章

  • Java代理之jdk动态代理+应用场景实战
    本文将先介绍jdk动态代理的基本用法,并对其原理和注意事项予以说明。之后将以两个最常见的应用场景为例,进行代码实操。这两个应用场景分别是拦截器和声明性接口,它们在许多开发框架中广泛使用。比如在spring和mybatis中均使用了拦截器模式,在mybatis中还利用动态代理来实现声明性接口......
  • 快速入门
    MPP数据库是指“大规模并行处理”(MassivelyParallelProcessing)数据库,是一种用于处理大规模数据的数据库系统。它可以处理非常大的数据集并提供快速的数据访问和处理能力。核心思想是将大型数据集分解成小的数据块,并在多个计算节点上并行处理这些块。使用共享存储架构,其中多个......
  • java将集合里面的元素拼接为一条String字符串
    java将集合里面的元素拼接为一条String字符串1️⃣随便创建一个list集合,往里面塞入元素  2️⃣第一种方式:通过foreach循环实现  但是通过这种方式只能将list集合里面的元素取出来变成一天string类型的字符串,不能根据自己的想法拼接  2️⃣第二种方式【推荐】:通过st......
  • javaEE进阶小结与回顾(四)
    不可变集合概念不可变集合,就是不可被修改的集合集合的数据项在创建的时候提供,并且在整个生命周期中都不可改变,否则报错特点定义完成后不可以修改,或添加删除不需要考虑变化,节省时间和空间,比他们的可变形式有更好的内存利用率当集合被不可信的库调用时,不可变形式是......
  • ST入门笔记3
    ST自动控制灯模式//之前是手动的[要求]自动模式切换5s自动[配件]m1减模式不用了只需m0m2开始停止[讲解]添加定时器(条件D0=1,tc0,50)TS定时器当前值**时间继电器一定要放在if或case语句外侧,否则就会每跑一次被清零[代码](*M0启动*)IFLDP(1,M0)THEN D0:=D0+1;END_IF;(*M2stop......
  • Java高并发专题之31、等待线程完成的方式你知道几种?
    在一个线程中需要获取其他线程的执行结果,能想到几种方式?各有什么优缺点?结合这个需求,我们使用6种方式,来对之前学过的知识点做一个回顾,加深记忆。方式1:Thread的join()方法实现代码:packagecom.itsoku.chat31;importjava.sql.Time;importjava.util.concurrent.*;/***跟......
  • JavaScript怎么实现web端上传超大文件
    ​ PHP用超级全局变量数组$_FILES来记录文件上传相关信息的。1.file_uploads=on/off 是否允许通过http方式上传文件2.max_execution_time=30 允许脚本最大执行时间,超过这个时间就会报错3.memory_limit=50M 设置脚本可以分配的最大内存量,防止失控脚本占用过多内存,此......
  • Java中interface接口使用方法详解
    前言在我们之前的文章里有说过,Java的类是单继承的,也就是说,一个类只能有一个“亲爹”。但是Java的类到底能不能实现多继承呢?间接实现多继承行不行?其实这是可以的!我们可以利用Java里的interface接口,来让Java的类间接地实现多继承,相当于是给一个类安排了“干爹”,而且还可以有多个“干......
  • JavaSE04流程控制语句
    第一章流程控制语句在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。所以,我们必须清楚每条语句的执行流程。而且,很多时候要通过控制语句的执行顺序来实现我们想要的功能。1.1流程控制语句分类​ 顺序结构​ 判断和选择结构(if,switch)​ 循环结构(f......
  • 【ACM博弈论】SG函数入门(1):从巴什博奕到尼姆游戏
    在我小时候以前做题的时候,遇到博弈题往往都是漫无目的地打表找规律,或者找一些特殊情况但是没有很好的分析方法。其实博弈题是有比较套路的解题方法的,那就是利用SG函数,第一节不会讲到SG函数的具体用法,我们先来博弈入个门,学习一下最基本的博弈类型:Nim游戏。......