JAVA中多态以及向上转型向下转型、重写的讲解

article/2025/10/3 7:07:14

重写

重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 注意!!!返回值和形参都不能改变。

重写的好处在于子类可以根据需要,定义特定 于自己的行为。 也就是说子类能够根据需要实现父类的方法。

重写的用法:

class Animal{public String name;public int age;public void eat(){System.out.println("动物正在吃饭");}public Animal(String name, int age) {this.name = name;this.age = age;}
}class Cat extends Animal{public Cat(String name, int age) {super(name, age);}@Overridepublic void eat(){System.out.println(name+"正在吃猫粮");}
}public class chongxie {public static void main(String[] args) {Animal cat = new Cat("猫",2);cat.eat();}
}

最终输出:

 如上:cat可以使用专属于其类型的方法,从而打印出其相对应的“吃猫粮”。


多态

多态定义

多态实现条件:

1. 必须在继承体系下

2. 子类必须要对父类中方法进行重写

3.通过父类的引用调用重写的方法

多态的使用场景(个人理解):在有多个类型之后,若有一个方法在很多个子类中被重写,而我们在创建一个子类变量的时候,若一时间不记得此变量具体为什么类型的时候,就可以利用多态,直接输出该变量的重写方法。

多态的使用

package practice3.chongxie;
class Animal1{String name;int age;public Animal1(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println(name+"正在吃饭");}
}class Dog extends Animal1{public Dog(String name,int age){super(name,age);}@Overridepublic void eat(){System.out.println(name+"正在吃狗粮");}
}class Cat1 extends Animal1{public Cat1(String name,int age){super(name,age);}@Overridepublic void eat(){System.out.println(name+"正在吃猫粮");}
}
public class duotai {public static void eat(Animal1 animal){//记得写static!!!!!!!!!!animal.eat();}public static void main(String[] args) {Dog dog = new Dog("修勾",2);Cat1 cat = new Cat1("修猫",1);eat(dog);eat(cat);}
}

最终输出结果:


向上转型

向上转型:创建一个子类对象,将其当成父类对象来使用。 

向上转型的格式::父类类型 对象名 = new 子类类型()

Animal animal = new Cat("猫",2);//向上转型

向上转型的使用场景:

1.函数传参

如之前多态里的代码一样,在我们未确定我们创建的类型是什么的时候,要使用一个方法,可以先写一个函数,其形参可以设为一个父类类型,然后我们将子类传参进去,此时是不会报错的,这样子可以让我们写的代码思路更加清晰且可读性更强。

(之前多态的例子):

package practice3.chongxie;
class Animal1{String name;int age;public Animal1(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println(name+"正在吃饭");}
}class Dog extends Animal1{public Dog(String name,int age){super(name,age);}@Overridepublic void eat(){System.out.println(name+"正在吃狗粮");}
}class Cat1 extends Animal1{public Cat1(String name,int age){super(name,age);}@Overridepublic void eat(){System.out.println(name+"正在吃猫粮");}
}
public class duotai {public static void eat(Animal1 animal){//记得写static!!!!!!!!!!animal.eat();}public static void main(String[] args) {Dog dog = new Dog("修勾",2);Cat1 cat = new Cat1("修猫",1);eat(dog);eat(cat);}
}

2.方法返回

场景模拟:有两个选择,买修猫或者买修勾,我们能通过输入 “狗”/“猫” 来选择我们想买的动物,那么就要创建一个变量,来装下修勾类或者修猫类,那么在我们定义变量的时候,是使用Dog类函数Cat类来定义嘞?这时候我们就可以定义一个函数,先判定要买的是猫还是狗狗,然后用Animal这个父类创建变量来接收。

package practice3.chongxie;
class Animal1{String name;int age;public Animal1(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println(name+"正在吃饭");}
}class Dog extends Animal1{public Dog(String name,int age){super(name,age);}@Overridepublic void eat(){System.out.println(name+"正在吃狗粮");}
}class Cat1 extends Animal1{public Cat1(String name,int age){super(name,age);}@Overridepublic void eat(){System.out.println(name+"正在吃猫粮");}
}
public class duotai {public static void eat(Animal1 animal){animal.eat();}public static Animal1 buyAnimal(String animal){//此时函数的返回值为父类,就所有其子类都可以返回if(animal=="猫"){return new Cat1("修猫咪",2);}else if(animal=="狗"){return new Dog("修勾勾",2);}else {return null;}}public static void main(String[] args) {Animal1 ani1 = buyAnimal("狗");ani1.eat();Animal1 ani2 = buyAnimal("猫");ani2.eat();}
}

最终输出:

向上转型缺点:

我们在将子类装到父类变量中时,由于其类型还是父类,使用子类若没有重写的方法,那么子类的方法我们是无法使用的,若要使用,我们则需要向下转型。


向下转型

将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的 方法,此时:将父类引用再还原为子类对象即可,即向下转换。

向下转型使用方法:强制类型转换。

但向下转型有风险:当我们强制转为其子类的时候,若转错子类类型,那么此时就会报错,这时我们就需要先了解一个关键字:instanceof 

instanceof

instanceof的使用:(变量名) instanceof  (子类类名),若前面的变量为其子类类型,那么会返回true,反之则返回false。若我们用这个关键字先来判定为哪种类型,那么就能保证其安全性,不会报错。

向下转型的使用

package practice4.XiangXiaZhuanXing;
class Animal{public String name;public int age;public Animal(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println("test正在吃饭");}
}class Bird extends Animal{public Bird(String name,int age){super(name,age);}public void eat(){System.out.println(name+"吃鸟粮");}public void said(){System.out.println("我是鸟");}
}public class practice4 {public static void main(String[] args) {Animal animal = new Bird("鸟",2);animal.eat();//这上面能都用到鸟的方法,针对鸟而不是针对动物这个大类,是因为重写了方法,所以输入向上转型,不能使用鸟中的方法,但是//此时eat算是animal的方法,因为animal中爷又这个方法,但是由于被重写,使用此时针对鸟,但如果我们将没有重写的方法调//出来,即把只在鸟这个类中的方法使用,此时还是会报错,如下://animal.said();//此时报错,因为animal中没有这个方法//以及向上转型了,那么要怎么样向下转型呢?if(animal instanceof Bird){Bird bird = (Bird)animal;bird.said();}}
}

又是收获满满的一天~ 


http://chatgpt.dhexx.cn/article/UscFWJ98.shtml

相关文章

JAVA中的向上转型和向下转型

一、向上转型和向下转型 向上转型和向下转型是在JAVA继承操作中用到的东西,在讲到转型之前我们需要认识到继承过程中的对象类型转换,这种转换有两个特点: 1.这是继承过程中发生的操作 2.新类是现有类的一种类型。这种说法主要是因为现有类的方…

java转型 内存_Java向上转型及内存分析

学习设计模式的时候,发现很多模式都用到了向上转型(eg. 工厂方法)。而我对向上转型(upcasting)的机制并不十分熟悉。这篇文章将深入分析向上转型的机制、内存分析。 概念 先从几个基本概念开始: 1. Java中的引用类型(reference type) Java中的数据类型分…

java向上转型_Java向上转型和向下转型

一、向上转型 简单的说向.上转型就是:将-一个子类类型的对象赋值给- -个父类类型的变量, 基本的实现语法: 父类类型变量new 子 类类型(); DEMO:向上转型 发现了可以使用父类类型的变量调用子类覆写了父类的方法,但是为什么不调用Worker的say()方法呢?原…

C++ 向上转型

在 C 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换…

java 对象向上转型_JAVA对象向上转型和向下转型

今天做了一个测试的题目,发现自己还是很多问题没有静下心来做。很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了。所以这个要自己应以为鉴! 对象的转型问题其实并不复杂,我们记住一句话:“父类…

java 向上转型_Java 转型问题(向上转型和向下转型)

Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。 什么叫父类引用指向子类对象? 从 2 个名词开始说起:向上转型(upcasting) 、向下转型(downcasting)。 举个例子:有2个类,Father 是父类&a…

java向上转型_Java向上转型

向上类型转换: 1.可以通过父类引用变量调用的方法是子类覆盖或继承父类的方法。 2.父类引用变量无法调用子类新增成员变量和新增成员方法。 举个例子 public classAnimal { public voidsleep() { System.out.println("Animal sleep"); } public voidjump(…

向上转型与向下转型(超详细)

本文利用代码例子解释向上转型与向下转型,文末有举例整合原代码。 首先,我们要知道:转型发生在继承后,也就是父类子类存在的前提下。其次,我们要清楚:向下转型的前提是已经发生了向上转型,向下转…

java向上转型

我们知道按照现有类的类型来创建新类的方式为继承。 换句话说 “新类是现有类的一种类型” 因为继承可以确保父类中所有的方法在子类中也同样有效,所以能够向父类发送的所有信息也同样可以向子类发送。 这儿有一个例子: public class Test {public sta…

类中的向上转型与向下转型详解

我们的类与类之间会存在继承关系,子类继承父类,一个父类可以有多个子类,例如Animal类就可以有Cat子类,Dog子类,等等。那么我们在运用的时候根据不同的场景会出现向上转型和向下转型的情况。 一、向上转型 1、Animal a…

【基础知识】向上转型和向下转型

向上转型和向下转型的利弊 一、向上转型 好处:隐藏了子类型,提高了代码的扩展性。 坏处:只能使用父类的功能,不能使用子类特有功能,功能被限定。 使用场景:不需要面对子类型,通过提高扩展性&am…

Java向上转型的作用(有详细代码介绍)

今天看到一道Java的练习题,题目如下 当时对于主函数中 Car car (Car) new Benz(); 不是很理解,也并不知道有什么意义,因为如果仅仅写Car car new Benz(); 程序运行结果是一样的。 在经过阅读书籍和查看别的博主写的关于向上向下转型的…

MATLAB三维数组转为二维数组(时间序列分析中很有用)

在MATLAB中三维数组转二维的方法 一、写该程序的初衷 在处理时间序列遥感数据的时候,我之前的做法是: 将时间序列数据读取为三维矩阵;将该数据保存为BIP格式;在每个像元上进行循环,取出其第三维(比如有46…

Matlab一维数组及其应用

目录 1.一维数组 2.与一维数组相关的函数 3.一维数组在二维绘图中的应用 4.在已存在的图形上添加新图形 5.在一个图形窗口中绘制多个子图 6.一维数组在一元多项式运算中的应用 1.一维数组 数值数组(简称为数组)是Matlab中最重要的一种内建数据类型。数组运算是Matlab软件…

matlab 二维数组声明,Matlab字符串函数及二维数组

Matlab字符串函数及二维数组 发布时间:2017年07月28日 评论数:抢沙发 阅读数:833 strcmp(Str1,Str2),finder(S,s),strcat(S1,S2),disp(str)>> str1 str1 I am a man >> str2 str2 Iamaboy >> strcmp(str1,str2) %比较str1和str2 相同…

MATLAB 二维数组的行列操作

首先定义一个3*3的二维数组 data [1,2,3;4,5,6;7,8,9];第一列 data(:,1)第一行 data(1,:)第一列前两个数 data(1:2,1)按列展开 data(:)从第五个数到最后 data(5:end)对ADC的数据IQ分开,对应一列数据,行数据根据逗号交换 IDATAadc_data_mux(1:2:en…

复习matlab 基础知识

1、 2、a.*b就是说两个矩阵的对应元素一次相乘。 [a,b,c,d] 将数组显示。 3、for k 1:lebgth(S) 语句体 end 4、 4、while循环 while Boolean 语句体 end 5、 6、 7、break and continue break:跳出循环体,结束整个循环。 continue&#xff1a…

【Matlab编程】新手入门第三天

第三章 数组 前言1.数组的创建1.1创建多维数组 2.数组的属性2.1数组结构2.2数组大小2.3数组的维度2.4数组数据类型 3.数组操作3.1数组索引和寻址3.2数组的查找3.3数组的排序 4.关系运算和逻辑运算总结 前言 MATLAB中的数组无处不在,任何变量在MATLAB中都是以数组的…

matlab二维数组的创建及其变换

很基础的问题,但很容易忘记。。 1、MATLAB中,一般使用方括号([]),逗号(,),分号(;)与空格来创建二维数组。空数组是一种非常特殊的数组…

strptime() 函数

查看更多 https://www.yuque.com/docs/share/54ad7ca7-b9cb-4d8b-a25f-c6e3ca349648