java上转型和下转型(对象的多态性)

/*上转型和下转型(对象的多态性) *上转型:是子类对象由父类引用,格式:parent p=new son *也就是说,想要上转型的前提必须是有继承关系的两个类。 *在调用方法的时候,上转型对象只能调用父类中有的方法,如果调用子类的方法则会报错 *下转型:是父类向下强制转换到子类对象 *前提是该父类对象必须是经过上转型的对象。 * *代码示例:*/

 1 abstract class Parent{
 2     abstract void grow();
 3 }
 4 class Son extends Parent{
 5     void grow(){
 6         System.out.println("我比父亲成长条件好");
 7     }
 8     void dance(){
 9         System.out.println("我会踢球");
10     }
11 }
12 public class test {
13     public static void main(String[] args) {
14         //上转型,用父类的引用子类的对象
15         Parent p=new Son();
16         //调用父类中有的方法
17         p.grow();
18         //p.dance();这里会报错,因为父类中没有dance()方法
19         
20         //对进行过上转型的对象,进行强制下转型
21         Son s=(Son)p;
22         //调用子类中的方法
23         s.dance();
24     }
25 }

/* * 在我们写程序中,很少会把代码写死,比如说还会有daughter类 * 然后在封装函数来调用对象,说不定会用到子类的方法,这里我们来讲解一下这一方面的知识*/

 1 abstract class Parent{
 2     abstract void grow();
 3 }
 4 class Son extends Parent{
 5     void grow(){
 6         System.out.println("我比父亲成长条件好一点:son");
 7     }
 8     void play(){
 9         System.out.println("我会踢球");
10     }
11 }
12 class Daughter extends Parent{
13     void grow(){
14         System.out.println("我比父亲成长条件好很多:daughter");
15     }
16     void dance(){
17         System.out.println("我会跳舞");
18     }
19 }
20 public class test {
21     public static void main(String[] args) {
22         Parent p=new Son();
23         show(p);
24         Parent p2=new Daughter();
25         show(p2);
26     }
27     public static void show(Parent p){
28             //现将父类中有的方法输出
29             p.grow();
30             //对进行过上转型的对象进行类型判断,然后进行相应的强制下转型
31             if(p instanceof Son){
32                 //判断是哪个类的上转型对象,然后进行下转型
33                 Son s=(Son)p;
34                 //调用子类中的方法
35                 s.play();
36             }else if(p instanceof Daughter){
37                 Daughter d=(Daughter)p;
38                 d.dance();
39             }
40             
41     }
42 }

/* * 在上转型中,编译程序的时候,看父类中有没有对象调用的方法,没有的话,就报错 * 例如:Parent p=new Son(); * p.play(); * play()方法在父类中没有,所以会报错 * 在运行的时候,看子类中是否有调用的方法,有的话,运行子类的方法(重写父类的方法) * * */

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java达人

如何在Java中避免equals方法的隐藏陷阱(一)

常见的等价方法陷阱 java.lang.Object 类定义了equals这个方法,它的子类可以通过重载来覆盖它。不幸的是,在面向对象中写出正确的equals方...

24480
来自专栏LanceToBigData

JavaSE(五)JAVA对象向上转型和向下转型

今天做了一个测试的题目,发现自己还是很多问题没有静下心来做。很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了。所以这个要自己应以为鉴!  ...

22360
来自专栏青玉伏案

窥探Swift之别样的枚举类型

  想必写过程序的童鞋对枚举类型并不陌生吧,使用枚举类型的好处是多多的,在这儿就不做过多的赘述了。Fundation框架和UIKit中的枚举更是数不胜数,枚举可...

20970
来自专栏Java进阶之路

java中hashCode和equals的使用

15900
来自专栏技术小站

(转) Java 静态代码块和非静态代码块

Java中的静态代码块是在虚拟机加载类的时候,就执行的,而且只执行一次。如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码...

20810
来自专栏ios 技术积累

Java 重写(Override)与重载(Overload)总结

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根...

13320
来自专栏java一日一条

JAVA8之lambda表达式详解

Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)

37640
来自专栏desperate633

深入理解javascript中的继承机制 之 12种继承模式总结原型链法仅从原型继承临时构造器原型属性拷贝所有属性拷贝(浅拷贝)深拷贝原型继承法扩展与增强模式多重继承法寄生式继承借用构造函数:构造器于

之前我们介绍了多种javascript中的继承方式,最后我们开始总结概括这些继承方式,先将javascript中的继承分类,根据不同的条件,可以分成不同的类别。...

10520
来自专栏黑泽君的专栏

java基础学习_面向对象(下)02_day09总结

============================================================================= ==...

9520
来自专栏Java帮帮-微信公众号-技术文章全总结

09(01)总结final,多态,抽象类,接口

1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量。 (2)特点: A:它修饰的类,不能被继承。 B:它修饰的方法,不能被重写。 ...

30650

扫码关注云+社区

领取腾讯云代金券