JAVA基础复习与总结<一>(2) 父类引用指向子类对象(向上转型、动态链接)
先来看看下列代码
public class Animal {
public static void main(String[] args){
Animal animal = new Cat(); //声明的是父类,指向的却是子类
animal.voice();
drinkWater(animal); //调用静态方法,传入的是父类引用的子类对象
}
String str;
public void voice(){
System.out.println("普通动物叫声!");
}
public static void drinkWater(Animal animal){ //静态方法,传入的是animal父类对象
System.out.println(animal.getClass().getName() +" drink water!");
}
}
class Cat extends Animal {
public void voice(){
System.out.println("喵喵喵");
}
public void catchMouse(){
System.out.println("抓老鼠");
}
在上述代码里面声明的是父类,实际上指向的却是子类,主要思想是:多态、动态链接、向上转型。
向上转型:
定义了子类对象Cat,Cat对象继承了Animal类,Animal是Cat的父类。当我们使用Aniaml cat = new Cat();的时候,Animal类型的引用是可以指向Cat类型的对象的。
子类是对父类的扩充,一般在子类中具有父类没有的属性和方法。当我们使用向上转型之后,定义的一个父类类型的引用指向一个子类的对象既可以使用子类对象的强大功能,又直接实现父类的共性。
这样做的好处是当我们在处理大型工程时会遇到一个父类中继承出多个子类。而且不可避免的会使用到相当多的static方法,而static方法的参数最好传入一个父类对象。
当我们需要重新添加一种子类的时候,使用向上转型,就可以直接将这个子类对象丢进static方法了,而不用担心不兼容。否则不使用向上转型的话,每出现一个新的子类,我们要调用已经存在的方法,都要将方法再重写一遍,加上新的参数类,这样得不偿失,重用性差,代码长度过长。
我们也不能把static方法丢进父类里面去,虽然这样做会使得子类可以直接继承父类方法而不考虑向上转型的问题,但是这样会造成父类过于臃肿,是设计模式的问题。
动态链接:
当父类的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态链接。
JAVA基础复习与总结<一>(2) 父类引用指向子类对象(向上转型、动态链接)的更多相关文章
- java多态性,父类引用指向子类对象
父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...
- java 父类引用指向子类对象---动态绑定
知识点: 1.java 中父类引用指向子类对象时动态绑定针对的只是子类重写的成员方法: 2.父类引用指向子类对象时,子类如果重写了父类的可重写方法(非private.非 final 方法),那么这个对 ...
- Java多态-如何理解父类引用指向子类对象
java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new ...
- Java多态 父类引用指向子类对象
Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 输出结果为: 给出结论:Father c = new Child() 在c的 ...
- 向上转型---父类引用指向子类对象 A a = New B()的使用
一.向上转型 向上转型是JAVA中的一种调用方式,是多态的一种表现.向上转型并非是将B自动向上转型为A的对象,相反它是从另一种角度去理解向上两字的:它是对A的对象的方法的扩充,即A的对象可访问B从A中 ...
- C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序
关于父类引用指向子类对象 例如: 有以下2个类 public class Father { public int age = 70; public static string name = " ...
- java-多态中成员访问特点-父类引用指向子类对象
多态前提: - 要有继承关系. - 要有方法重写. - 要有父类引用指向子类对象. 1.成员变量:编译看左边(父类),运行看左边(父类) 2.成员方法:编译看左边(父类),运行看右边(子类),动态绑定 ...
- 28 面向对象编程 instanceof 代码 小结 父类引用指向子类对象
instanceof 代码 // main // Object > Person >Student Object object = new Student(); // 提取公式:XY之间是 ...
- C++析构函数的自动调用(用于父类指针指向子类对象,内存泄漏问题)
class A {public:A() { printf("A \n"); }~A() { printf(" ~A \n"); } // 这里不管写不写virt ...
随机推荐
- OO期末总结
$0 写在前面 善始善终,临近期末,为一学期的收获和努力画一个圆满的句号. $1 测试与正确性论证的比较 $1-0 什么是测试? 测试是使用人工操作或者程序自动运行的方式来检验它是否满足规定的需求或弄 ...
- redis的主从模式搭建及注意事项
前言:本文先分享下如何搭建redis的主从模式配置,以及主从模式配置的注意事项.后续会继续分享如何实现一个高可用的redis服务,redis的Sentinel 哨兵模式及集群搭建. 安装: 1,yum ...
- Git服务器Gogs简易安装-Windows环境
1.下载git for windows https://github.com/git-for-windows/git/releases/download/v2.15.0.windows.1/Git-2 ...
- 前向分步算法 && AdaBoost算法 && 提升树(GBDT)算法 && XGBoost算法
1. 提升方法 提升(boosting)方法是一种常用的统计学方法,在分类问题中,它通过逐轮不断改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能 0x1: 提升方法的基本 ...
- [物理学与PDEs]第5章习题6 各向同性材料时强椭圆性条件的等价条件
在线性弹性时, 证明各向同性材料, 强椭圆性条件 (5. 6) 等价于 Lam\'e 常数满足 $$\bex \mu>0,\quad \lm+2\mu>0. \eex$$ 证明: (1) ...
- Java(6)for循环
一.for循环的使用场合 1.1.while循环——先判断,再循环 while(1.条件表达式){ //2.循环操作 //3.更改循环条件表达式 } 1.2.do…while——先 ...
- js中escape对应的C#解码函数 UrlDecode
js中escape对应的C#解码函数 System.Web.HttpUtility.UrlDecode(s),使用过程中有以下几点需要注意 js中escape对应的C#解码函数 System.We ...
- Leetcode#557. Reverse Words in a String III(反转字符串中的单词 III)
题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" 输 ...
- 在c:forEach与s:iterator里面使用if标签判断当前位置是否为2的倍数
在c:forEach与s:iterator里面使用if标签判断当前位置是否为2的倍数 c:forEach: <c:forEach var="workflow" items=& ...
- android stuido搭配git常用命令
查看本地分支:git branch 查看远程分支:git branch -a 推送本地分支到远程:git push origin local_branch:remote_branch 推送远程访问 g ...