网站首页 > java教程 正文
在初学习JAVA时很多同学对向上转型很迷茫,不知道它是如何调用的,感觉很神奇。小编讲一讲!
Java中的向上转型,说得简单点就是把基类看成是父类。这样说应该不难理解。例如,在经典的Shape类中,Circle和Square均继承自Shape。我们可以说,一个Circle是一个Shape,一个Square也是一个Shape。这就是is-a关系。Shape能做的事情,Circle和Square也能做。先看下面的这段代码:
publicclass A {
publicstaticvoid main(String[] args) {
Circle1 c = new Circle1();//可替换为Shape1 c = new Circle1();
Square1 s = new Square1();//可替换为Shape1 s = new Square1();
doStuff(c);
doStuff(s);
}
publicstaticvoid doStuff(Shape1 shape) {
shape.move();
shape.stop();
}
}
class Shape1 {
void move() {
}
void stop() {
}
}
class Circle1 extends Shape1 {
void move() {
System.out.println("Circle moves");
}
void stop() {
System.out.println("Circle stops");
}
}
class Square1 extends Shape1 {
void move() {
System.out.println("Square moves");
}
void stop() {
System.out.println("Square stops");
}
}
我们先定义一个Shape1类,里面有两个方法,一个是move(), 一个是stop()。这两个方法什么也不做(抽象类和接口里会有类似的什么也不做的方法,不过这里不是重点)。然后定义两个继承自Shape1的类,Circle1和Square1。它们覆盖了Shape1中的move和stop方法,彼此不相同。这里,我只是简单的输出一些消息,以表示两个子类的方法内容并不相同而已。
然后需要注意的就是public static void doStuff方法了。注意它的参数,是一个Shape1类型的对象。在定义这个方法的时候,我们让它执行shape的move和stop方法,但是并没有说明到底是Circle1类还是Square1类。但是执行后在结果中会看到c执行了Circle1的方法,s执行了Square1的方法。这是如何做到的?其中涉及一个“动态绑定”的概念。“动态绑定”就是说在运行时刻才知道对象具体是哪一个类的,并不是在你写代码的时候就确定参数对象是哪一个类的。这是Java的一个特点,也是OOP的一个特点。
这里我们用到了向上转型,即将Shape1这个父类的一个对象提供给doStuff方法作为参数,而不是具体的Circle1或者Square1对象作为参数。这样,我们只需要创建Circle1和Square1对象,并将它们作为参数传给doStuff方法就可以了。因为Circle1和Square1继承自Shape1,所以,它们也可以被看成是Shape1类型的,doStuff就不会提示你参数类型不正确的信息,并且能够在运行时刻自动找到合适的方法来执行。这样,代码很明显简洁,不会出现繁琐冗长的样子。这就是向上转型的好处,当然还有动态绑定的作用在里面。
感谢你长得那么美还来看小编的文章,喜欢就点关注吧!
猜你喜欢
- 2024-10-11 SpringBoot整合Nacos配置中心加载原理二
- 2024-10-11 Java核心修饰符——abstract修饰符与抽象类、抽象方法
- 2024-10-11 绝对的JAVA面试干货(java juc 面试)
- 2024-10-11 Java面试集合(三)-1(基础篇java集合面试专用)
- 2024-10-11 Java之路-10 API、Scanner类、Random类、Math类
- 2024-10-11 JAVA面试基础知识点(java面试必背)
- 2024-10-11 java面试题及答案2022,java2022最新面试题及答案
- 2024-10-11 java向上转型和向下转型(java向上转型调用的是子类还是父类属性)
- 2024-10-11 「Java基础11」常用API(java基础知识点整理汇总)
- 2024-10-11 java基础总结(java基础总结心得)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)