java-Java动态绑定,对象已经向上转型了,为何优先使用的方法依然是子类的方法。

问题描述

Java动态绑定,对象已经向上转型了,为何优先使用的方法依然是子类的方法。
情况如下,我写了个测试类。

son类

public class son extends father
{
public son()
{
fs=""new son"";
}
public void say()
{
System.out.println(""son say()"");
}

father类

public class father

{
String fs;

father(){    fs=""new father"";}public void say(){    System.out.println(""father say()"");}

}

执行:
father ff=new son();
ff.say(); //“son say()”

    执行的结果尽然是输出了“son say()”,也就是说执行了son里的say方法,这是怎么回事啊?    而且我将son类中的say()方法删掉后,ff.say()的结果为预期的“father say()”ff对象向上转型后为什么优先执行的方法是子类的方法啊。

解决方案

原来是我概念模糊了,向上转型后的确是只能使用父类才有的方法,但如果子类重写了这个方法,会调用重写的方法。

解决方案二:
JRE的版本是1.8,官网新下的。

解决方案三:
第一:你new了son 说明你这个对象是son,所以say调用的是son的say,而且你使用了继承方法,子类方法覆盖父类的方法的。

解决方案四:
那是继承啊
关键是我已经将ff指向的对象向上转型为father类了啊,对ff变量执行的方法应该是father类的啊

father ff=new son();
ff.say(); //“son say()”

解决方案五:
你没有理解多态呀;
ff是一个father类型又怎么样?它指向的,就是son类。在运行时动态绑定的,就是son的方法。

时间: 2024-08-24 00:17:51

java-Java动态绑定,对象已经向上转型了,为何优先使用的方法依然是子类的方法。的相关文章

java类的问题-关于java中的重写和向上转型问题

问题描述 关于java中的重写和向上转型问题 在讲成员方法重写时,变量调用的是子类重写后的方法还是父类的原方法,是由变量所指向的对象实例的类型决定,而不是由变量本身的类型决定.可是比如下图的程序,PrivOverride po=new Derived,这个po到底是父类类型还是子类类型呢?按照重写的规定,那么调用po.f()调用的应该是子类的f方法,那么这个po就应该是子类类型吧?可是按照向上转型的说法,这个po就是父类类型的,所以有点搞不清..而且父类的f方法是private的,子类不能继承(

解析Java程序中对象内存的分配和控制的基本方法_java

一.对象与内存控制的知识点 1.java变量的初始化过程,包括局部变量,成员变量(实例变量和类变量). 2.继承关系中,当使用的对象引用变量编译时类型和运行时类型不同时,访问该对象的属性和方法是有区别的. 3.final修饰符特性. 二.java变量的划分与初始化过程 java程序的变量大体可以分为成员变量和局部变量,成员变量可以分为实例变量(非静态变量)和类变量(静态变量),一般我们遇到的局部变量会在下列几种情况中出现: (1)形参:在方法签名中定义的局部变量,由调用方为其赋值,随着方法结束消

Java 向上转型和向下转型的详解

Java 向上转型和向下转型的详解 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象转换为父类类型称为向上转型.通俗地说就是是将子类对象转为父类对象.此处父类对象可以是接口 向下转型:父类引用的对象转换为子类类型称为向下转型. 前者是一个向上转型,Animal dog 引用指向new Dog();子类对象当成父类对象,只能调用父类的成员,如果子类

java类的问题-java向上转型创建的对象是哪个

问题描述 java向上转型创建的对象是哪个 Parallelogram p = new Rectangle 这个创建的对象是父类平行四边形类的对象,引用了子类矩形的方法:还是创建的是矩形类的对象,把他的变成父类的对象了?创建者的的这个新对象占用率的哪个内存? 解决方案 记着 new谁创建的就是谁,就是了 解决方案二: 创建的是Rectangle对象 解决方案三: 这个创建的对象是父类平行四边形类的对象,但是内存已经预留子类的内存空间.当强制转换Rectangle类型,则会引起动态编译. 给预留的

大家都来说说安卓java中什么是向上转型?请问安卓中的向上转型的用途是什么?

问题描述 大家都来说说安卓java中什么是向上转型?请问安卓中的向上转型的用途是什么? 大家都来说说安卓java中什么是向上转型?请问安卓中的向上转型的用途是什么? 解决方案 http://blog.csdn.net/shanghui815/article/details/6088588 解决方案二: 向上转型 就是子类对象指向父类引用:父类引用无法使用子类对象特有得方法 就需要转化成子类类型 这就是向下转型. 这个也是面向对象编程的里氏替换原则,开发中推荐面向抽象编程,即定义变量的基本类型是抽

访问者模式讨论篇:java的动态绑定与双分派

java的动态绑定         所谓的动态绑定就是指程执行期间(而不是在编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法.java继承体系中的覆盖就是动态绑定的,看一下如下的代码: class Father { public void method(){ System.out.println("This is Father's method"); } } class Son1 extends Father{ public void method(){ Syste

JAVA类和对象的使用技巧

刚在网上看到一篇关于Java性能调优的帖子,很是帮助,自己也用了十多年JAVA了,有些感同身受,这里 引用那帖子结合自己的感受来谈下 技巧1:尽量少用new来创建对象 因为用new来创建对象的实例时 ,构造函数链上的所有构造函数都会被依次调用,导致效率很低.其实我们可以用一些小技巧,比如复用已有 对象.比如说,一个类如果实现了Cloneable接口的话,可以调用这个类的对象的clone()方法来创建一个新 对象,这样的对象不会调用任何类的构造函数.所以,这样生成新对象的速度比调用任何类的构造函数

java中多态中向下转型的问题

问题描述 java中多态中向下转型的问题 public class Father { public void show (){ System.out.println("父类方法"); } public void show1(){ System.out.println("父类二方法"); } } public class Son extends Father { public void show(){ System.out.println("子类方法&quo

Java的动态绑定机制

Java的动态绑定又称为运行时绑定.意思就是说,程序会在运行的时候自动选择调用哪儿个方法. 一.动态绑定的过程 例子: public class Son extends Father   Son son = new Son();3 son.method(); 1.首先,编译器根据对象的声明类型和方法名,搜索相应类(Son)及其父类(Father)的"方法表",找出所有访问属性为public的method方法. 可能存在多个方法名为method的方法,只是参数类型或数量不同. 2.然后,