java 父类引用指向子类对象---动态绑定
知识点:
1、java 中父类引用指向子类对象时动态绑定针对的只是子类重写的成员方法;
2、父类引用指向子类对象时,子类如果重写了父类的可重写方法(非private、非 final 方法),那么这个对象调用该方法时默认调用的时子类重写的方法,而不是父类的方法;
3、对于java当中的方法而言,除了final,static,private 修饰的方法和构造方法是前期绑定外,其他的方法全部为动态绑定;(编译看左边,运行看右边)
本质:java当中的向上转型或者说多态是借助于动态绑定实现的,所以理解了动态绑定,也就搞定了向上转型和多态。
package test;
public class test{
public static void main(String[] args) {
System.out.println("--------父类引用指向子类对象-----------");
Father instance = new Son();
instance.printValue(); //this is Son's printValue() method.---Son
instance.printValue2(); //this is father's printValue2() method.---father
System.out.println(instance.name); //father
instance.printValue3(); //this is father's static printValue3() method.
System.out.println("----------创建子类对象------------");
Son son = new Son();
son.printValue(); //this is Son's printValue() method.---Son
son.printValue2(); //this is father's printValue2() method.---father
System.out.println(son.name); //Son
son.printValue3(); //this is Son's static printValue3() method.
System.out.println("---------创建父类对象-----------");
Father father = new Father();
father.printValue(); //this is father's printValue() method.---father
father.printValue2(); //this is father's printValue2() method.---father
System.out.println(father.name); //father
father.printValue3(); //this is father's static printValue3() method.
}
}
class Father {
public String name = "father";
public void printValue() {
System.out.println("this is father's printValue() method.---"+this.name);
}
public void printValue2(){
System.out.println("this is father's printValue2() method.---"+this.name);
}
public static void printValue3(){
System.out.println("this is father's static printValue3() method.");
}
}
class Son extends Father {
public String name = "Son";
public void printValue() {
System.out.println("this is Son's printValue() method.---"+this.name);
}
public static void printValue3(){
System.out.println("this is Son's static printValue3() method.");
}
}
分析:
1、父类引用指向子类对象,对象调用的方法如果已经被子类重写过了则调用的是子类中重写的方法,而不是父类中的方法;
2、父类引用指向子类对象,如果想要调用子类中和父类同名的成员变量,则必须通过getter方法或者setter方法;
3、父类引用指向子类对象,如果想调用子类中和父类同名的静态方法,直接子类“类名点” 操作获取,不要通过对象获取;
4、父类引用指向子类对象的两种写法:(第二种得了解,面试中可能用到)
// 1、第一种常规写法
Father instance = new Son();
// 2、第二种变形写法;
Son son = new Son();
Father mson = (Father) son;
java 父类引用指向子类对象---动态绑定的更多相关文章
- Java多态-如何理解父类引用指向子类对象
java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new ...
- java多态性,父类引用指向子类对象
父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...
- Java多态 父类引用指向子类对象
Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 输出结果为: 给出结论:Father c = new Child() 在c的 ...
- java-多态中成员访问特点-父类引用指向子类对象
多态前提: - 要有继承关系. - 要有方法重写. - 要有父类引用指向子类对象. 1.成员变量:编译看左边(父类),运行看左边(父类) 2.成员方法:编译看左边(父类),运行看右边(子类),动态绑定 ...
- 向上转型---父类引用指向子类对象 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 = " ...
- 28 面向对象编程 instanceof 代码 小结 父类引用指向子类对象
instanceof 代码 // main // Object > Person >Student Object object = new Student(); // 提取公式:XY之间是 ...
- JAVA基础复习与总结<一>(2) 父类引用指向子类对象(向上转型、动态链接)
先来看看下列代码 public class Animal { public static void main(String[] args){ Animal animal = new Cat(); // ...
- C++析构函数的自动调用(用于父类指针指向子类对象,内存泄漏问题)
class A {public:A() { printf("A \n"); }~A() { printf(" ~A \n"); } // 这里不管写不写virt ...
随机推荐
- Apollo分布式配置中心部署以及使用
一.简介Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场 ...
- Springboot配置使用ssl,使用https
SSL(Secure Sockets Layer 安全套接层)是为网络通信提供安全及数据完整性的一种安全协议,SSL在网络传输层对网络连接进行加密,SSL协议位于TCP/IP协议与各种应用层协议之间, ...
- 开发框架-Web-Java:JeePlus
ylbtech-开发框架-Web-Java:JeePlus 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 0. http://www.jeeplus.org/ ...
- Uc的个人中心很奇葩
Uc的个人中心很奇葩,未登录前点击头像是图2选择性别,点击云同步才是图3登录,登录之后,想退出,要点击图1的头像进入图4编辑资料,然后右上角退出登录…摸索了好久,差点抓狂…把你们的产品经理叫出来一下… ...
- js读取iframe里的元素
父层 <div id="SubStepNav" class="SubStepNav"> <iframe src="aaa.html& ...
- Java 12 - Java StringBuffer和StringBuilder类
Java StringBuffer和StringBuilder类 当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类. 和String类不同的是,StringBu ...
- CSS 随笔
1.动态修改div的大小 Html: <div> Hello </div> css: div { resize:both; overflow:auto; } 2. box-si ...
- python项目入门之 安装、创建
3年前接触python,那时候还是文本格式进行学习,但是由于一直没有项目实践,所以就搁浅了 今天,python如火如荼,适用于人工智能等多领域,已经成为了语言界的翘楚 python有非常多的优点,开源 ...
- web前端全栈学习之路
web前端全栈学习之路 --- 陆续更新中 一.HTML相关 1.HTML常用标签:http://www.cnblogs.com/wyb666/p/8733699.html 2.HTML5基础: 3. ...
- ES6学习笔记<一> let const class extends super
学习参考地址1 学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...