精华内容
下载资源
问答
  • 上转型对象 上转型对象调用的是父类的变量,子类的继承的方法。注:只有父类引用指向子类对象以后,才能下转型,否则会抛出异常。示例代码:show()方法是动态多态的体现,参数为父类对象,instanof运算符判断某对象...

    上转型对象

    d663c308596db4db19e3d5b7478ac6a1.png

    上转型对象调用的是父类的变量,子类的继承的方法。

    注:只有父类引用指向子类对象以后,才能下转型,否则会抛出异常。

    示例代码:

    show()方法是动态多态的体现,参数为父类对象,instanof运算符判断某对象是否是类的实例,然后转换为下转型对象调用子类新增的方法。

    public class TestAnimalDemo {

    public static void main(String[] args) {

    show(new Cat()); // 以 Cat 对象调用 show 方法

    show(new Dog()); // 以 Dog 对象调用 show 方法

    Animal a = new Cat(); // 向上转型

    a.eat(); // 调用的是 Cat 的 eat

    Cat c = (Cat) a; // 向下转型

    c.work(); // 调用的是 Cat 的 work

    }

    public static void show(Animal a) {

    a.eat();

    // 类型判断

    if (a instanceof Cat) { // 猫做的事情

    Cat c = (Cat) a;

    c.work();

    } else if (a instanceof Dog) { // 狗做的事情

    Dog c = (Dog) a;

    c.work();

    }

    }

    }

    abstract class Animal {

    abstract void eat();

    }

    class Cat extends Animal {

    public void eat() {

    System.out.println("吃鱼");

    }

    public void work() {

    System.out.println("抓老鼠");

    }

    }

    class Dog extends Animal {

    public void eat() {

    System.out.println("吃骨头");

    }

    public void work() {

    System.out.println("看家");

    }

    }

    展开全文
  • 上转型对象上转型对象调用的是父类的变量,子类的继承的方法。注:只有父类引用指向子类对象以后,才能下转型,否则会抛出异常。示例代码:show()方法是动态多态的体现,参数为父类对象,instanof运算符判断某对象...

    上转型对象

    cd830e4a6928

    上转型对象调用的是父类的变量,子类的继承的方法。

    注:只有父类引用指向子类对象以后,才能下转型,否则会抛出异常。

    示例代码:

    show()方法是动态多态的体现,参数为父类对象,instanof运算符判断某对象是否是类的实例,然后转换为下转型对象调用子类新增的方法。

    public class TestAnimalDemo {

    public static void main(String[] args) {

    show(new Cat()); // 以 Cat 对象调用 show 方法

    show(new Dog()); // 以 Dog 对象调用 show 方法

    Animal a = new Cat(); // 向上转型

    a.eat(); // 调用的是 Cat 的 eat

    Cat c = (Cat) a; // 向下转型

    c.work(); // 调用的是 Cat 的 work

    }

    public static void show(Animal a) {

    a.eat();

    // 类型判断

    if (a instanceof Cat) { // 猫做的事情

    Cat c = (Cat) a;

    c.work();

    } else if (a instanceof Dog) { // 狗做的事情

    Dog c = (Dog) a;

    c.work();

    }

    }

    }

    abstract class Animal {

    abstract void eat();

    }

    class Cat extends Animal {

    public void eat() {

    System.out.println("吃鱼");

    }

    public void work() {

    System.out.println("抓老鼠");

    }

    }

    class Dog extends Animal {

    public void eat() {

    System.out.println("吃骨头");

    }

    public void work() {

    System.out.println("看家");

    }

    }

    展开全文
  • 在学习方法重载时想到如果声明了一个上转型对象,那么当超类与子类作为方法参数重载时会如何调用呢? 于是编写了一个玩具代码来验证了一下,发现编译器会调用声明时的参数为父类的方法。 代码如下: public class ...

    在学习方法重载时想到如果声明了一个上转型对象,那么当超类与子类作为方法参数重载时会如何调用呢?

    于是编写了一个玩具代码来验证了一下,发现编译器会调用声明时的参数为父类的方法。

    代码如下:
    public class ChongzaiYihuo {
        static class Father {
    
        }
        static class Son extends Father{
    
        }
        static class Do{
            public void family(Father father){
                System.out.println("调用了father方法");
            }
            public void family(Son son){
                System.out.println("调用了son方法");
            }
        }
        public static void main(String[] args) {
            Father father = new Father();
            Son son = new Son();
            Father fs = new Son();
            Do dodo = new  Do();
            //传入父类对象
            dodo.family(father);
            //传入子类对象
            dodo.family(son);
            //传入上转型对象
            dodo.family(fs);
    
        }
    }
    
    
    结果:

    在这里插入图片描述

    展开全文
  • JAVA中上转型对象的详细解释首先是方法的参数父类对象,传入子类对象是否可行然后引出Parentp=newChildren();这句代码不是很理解,google过程中引出向上转型要理解向上转型又引出了动态绑定从动态绑定又引出了...

    JAVA中上转型对象的详细解释

    首先是方法的参数是父类对象,传入子类对象是否可行

    然后引出Parent p = new Children();

    这句代码不是很理解,google的过程中引出向上转型

    要理解向上转型又引出了动态绑定

    从动态绑定又引出了静态绑定

    程序绑定的概念:

    绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定

    静态绑定:

    在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。

    针对java简单的可以理解为程序编译期的绑定;这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定

    动态绑定:

    后期绑定:在运行时根据具体对象的类型进行绑定。

    若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象中安插某些特殊类型的信息。

    动态绑定的过程:

    虚拟机提取对象的实际类型的方法表;

    虚拟机搜索方法签名;

    调用方法。

    关于绑定相关的总结:

    在了解了三者的概念之后,很明显我们发现java属于后期绑定。在java中,几乎所有的方法都是后期绑定的,在运行时动态绑定方法属于子类还是基类。但是也有特殊,针对static方法和final方法由于不能被继承,因此在编译时就可以确定他们的值,他们是属于前期绑定的。特别说明的一点是,private声明的方法和成员变量不能被子类继承,所有的private方法都被隐式的指定为final的(由此我们也可以知道:将方法声明为final类型的一是为了防止方法被覆盖,二是为了有效的关闭java中的动态绑定)。java中的后期绑定是有JVM来实现的,我们不用去显式的声明它,而C++则不同,必须明确的声明某个方法具备后期绑定。

    java当中的向上转型或者说多态是借助于动态绑定实现的,所以理解了动态绑定,也就搞定了向上转型和多态。

    前面已经说了对于java当中的方法而言,除了final,static,private和构造方法是前期绑定外,其他的方法全部为动态绑定。而动态绑定的典型发生在父类和子类的转换声明之下:

    比如:Parent p = new Children();

    其具体过程细节如下:

    1:编译器检查对象的声明类型和方法名。假设我们调用x.f(args)方法,并且x已经被声明为C类的对象,那么编译器会列举出C类中所有的名称为f的方法和从C类的超类继承过来的f方法

    2:接下来编译器检查方法调用中提供的参数类型。如果在所有名称为f 的方法中有一个参数类型和调用提供的参数类型最为匹配,那么就调用这个方法,这个过程叫做“重载解析”

    3:当程序运行并且使用动态绑定调用方法时,虚拟机必须调用同x所指向的对象的实际类型相匹配的方法版本。假设实际类型为D(C的子类),如果D类定义了f(String)那么该方法被调用,否则就在D的超类中搜寻方法f(String),依次类推

    上面是理论,下面看几个示例(示例来自网络):

    Java代码

    view plaincopy to clipboardprint?

    public class Father {

    public void method() {

    System.out.println("父类方法,对象类型:" + this.getClass());

    }

    }

    public class Son extends Father {

    public static void main(String[] args) {

    Father sample = new Son();//向上转型

    sample.method();

    }

    }

    声明的是父类的引用,但是执行的过程中调用的是子类的对象,程序首先寻找子类对象的method方法,但是没有找到,于是向上转型去父类寻找

    Java代码

    public class Son extends Father {

    public void method() {

    System.out.println("子类方法,对象类型:" + this.getClass());

    }

    public static void main(String[] args) {

    Father sample = new Son();//向上转型

    sample.method();

    }

    }

    由于子类重写了父类的method方法,根据上面的理论知道会去调用子类的method方法去执行,因为子类对象有method方法而没有向上转型去寻找

    前面的理论当中已经提到了java的绑定规则,由此可知,在处理java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以找到子类,而对象的属性还是父类的属性。

    代码如下:

    Java代码

    public class Father {

    protected String name="父亲属性";

    public void method() {

    System.out.println("父类方法,对象类型:" + this.getClass());

    }

    }

    public class Son extends Father {

    protected String name="儿子属性";

    public void method() {

    System.out.println("子类方法,对象类型:" + this.getClass());

    }

    public static void main(String[] args) {

    Father sample = new Son();//向上转型

    System.out.println("调用的成员:"+sample.name);

    }

    }

    结论,调用的成员为父亲的属性。

    这个结果表明,子类的对象(由父类的引用handle)调用到的是父类的成员变量。所以必须明确,运行时(动态)绑定针对的范畴只是对象的方法。

    现在试图调用子类的成员变量name,该怎么做?最简单的办法是将该成员变量封装成方法getter形式。

    代码如下:

    Java代码

    public class Father {

    protected String name = "父亲属性";

    public String getName() {

    return name;

    }

    public void method() {

    System.out.println("父类方法,对象类型:" + this.getClass());

    }

    }

    public class Son extends Father {

    protected String name="儿子属性";

    public String getName() {

    return name;

    }

    public void method() {

    System.out.println("子类方法,对象类型:" + this.getClass());

    }

    public static void main(String[] args) {

    Father sample = new Son();//向上转型

    System.out.println("调用的成员:"+sample.getName());

    }

    }

    结果:调用的是儿子的属性

    展开全文
  • JAVA中上转型对象的详细解释首先是方法的参数父类对象,传入子类对象是否可行 然后引出Parentp=newChildren(); 这句代码不是很理解,google过程中引出向上转型 要理解向上转型又引出了动态绑定 从动态绑定又引出...
  • Java中上转型对象的详细解释 首先是方法的参数父类对象,传入子类对象是否可行 然后引出Parent p = new Children(); 这句代码不是很理解,google过程中引出向上转型 要理解向上转型又引出了动态绑定 ...
  • Java中上转型对象的详细解释

    千次阅读 2017-04-27 16:05:15
    Java中上转型对象的详细解释 首先是方法的参数父类对象,传入子类对象是否可行 然后引出Parent p = new Children(); 这句代码不是很理解,google过程中引出向上转型 要理解向上转型又引出了动态绑定 从动态...
  • Java上转型对象

    2018-06-26 22:53:55
    JAVA中上转型对象的详细解释首先是方法的参数父类对象,传入子类对象是否可行然后引出Parent p = new Children();这句代码不是很理解,google过程中引出向上转型要理解向上转型又引出了动态绑定从动态绑定又...
  • 在head first 设计模式中 用到了很多很多接口对象 首先澄清一个问题,就是接口不仅可以声明对象,...实际,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口方法 直接代码 using System; usin
  • 首先是方法的参数父类对象,传入子类对象是否可行然后引出Parentp=newChildren();这句代码不是很理解,google过程中引出向上转型要理解向上转型又引出了动态绑定从动态绑定又引出了静态绑定程序绑定概念:绑定...
  • 【04-面向对象()】

    2018-07-03 21:41:30
    •通过关键字super 来调用父类的方法或属性。 super调用父类的构造器 •子类构造器总会调用父类构造器。 •如果子类构造器没有显式使用super调用父类构造器;子类构造器默认会调用父类无参数的构造器。 ...
  • 类和对象

    2021-03-08 20:05:58
    方法多态性 某个对象,在父类执行调用某个方法,是从下到查找该方法,子类找不到父类 向上转型父类引用指向子类对象 向下转型:强制转换 ...(3)某个对象的实例方法,方法参数是另一个对象 ...
  • 方法的重载:同一个方法名称,可以根据参数的类型及个数的不同调用不同的方法体; 方法的覆写:同一个父类方法,可能根据实例化子类的不同也有不同的实现; 对象的多态性(前提:方法覆写): (自动、常用)对象...
  • Person p=new Student();//父类对象在子类实例化在赋值运算符“=”左侧,定义了父类person对象p,而在赋值运算符“=”右侧,用new Student()...(即通过传递不同的参数来令同一方法接口实现不同功能)向上转型和 向...
  • 继承和向上转型

    2019-09-28 22:05:26
    继承和向上转型 ...继承概念不多说,向上转型:当一个子类对象作为参数传到以它父类作为参数的方法中,并且父类会识别到这个子类,并调用该子类的方法。 1.创建父类 //这是一个基类 父类 几...
  • Person p=new Student();//父类对象在子类实例化在赋值运算符“=”左侧,定义了父类person对象p,而在赋值运算符“=”右侧,用new Student()...(即通过传递不同的参数来令同一方法接口实现不同功能)向上转型和 向...
  • 面向对象三大特征-多态 概念 ...方法参数多态性好处:提高代码扩展性 ​ 上下转型 向上转型 向上转型的作用是:提高程序扩展性. 向下转型 向下转型的作用是:为了使用子类中特有方法. f
  • 1,方法重写 子类通过重写可以隐藏已继承的方法(隐藏:子类声明的成员变量与从父类继承的同名,就会隐藏所继承的成员变量) 要求:方法的名字、参数个数、参数的类型和父类方法...4,对象的上转型对象 用子类创建一
  • 第5章课后答案

    2018-07-09 08:44:30
    5.子类重写的方法类型和父类的方法的类型一致或者是父类的方法的类型的子类型,重写的方法的名字、参数个数、参数的类型和父类的方法完全相同。重写方法的目的是隐藏继承的方法,子类通过方法的重写可以把父类的...
  • 多态

    2020-05-04 23:35:49
    向上转型后 通过父类的引用 只能访问父类自己的方法或属性 父类引用 只能访问自己特有的 重写:override(覆盖/覆写) 1.方法名相同 2.返回值相同 3.参数列表相同 不同的类-》继承关系 调用时用的是 子类的重写...
  • Java匿名内部类

    2020-04-11 10:39:38
    匿名内部类创建 1、匿名内部类顾名思义,就是没有名字类 2、创建匿名内部类需要同时创建对象 语法格式: new 父类或者接口(参数列表){ 类体 } ...非上转型对象可以调用子类新增属性和...
  •   ... ...默认构造器创建对象:无参数构造器默认会调用父类(如果存在)无参数构造(super()默认执行); 向上转型:继承中出现,Super s = new Sub(); s对象就是SUb子类向上转型;疏忽点:...
  • 多态体现方式

    2019-05-10 15:01:00
     方法的重载是指同一个方法名称,根据其传入的参数类型、个数和顺序的不同,所调用的方法体也不同,即同一个方法名称在一个类中有不同的功能实现;  方法的覆写(重写)是指父类之中的一个方法名称,在不同的子类...
  • 形参和实参: 形参 : 定义方法参数列表的变量 实参 : 调用方法时传进去的值 ...父类的引用指向子类的对象 调用 调用关系 成员变量 成员方法 静态变量 静态方法 父类独有 子类独有 向上转型 Anim
  • 浅谈多态

    2021-04-23 10:34:25
    多态 一.重载(方法的多态) **1.所谓方法重载,**是指一个类中...那么当把子类创建的对象的引用放到一个父亲的对象中时,我们就得到了某个子类的上转型对象,由于不同子类重写的方法不同,所对应的上转型对象调用
  • 多态和泛型 多态 Java多态主要分为三方面: ...重载只能在方法中,要求每个方法的参数列表不同,不同的参数列表实际上调用的是不同的方法体。实际一个方法还是只能使用一个类型(基本类型或自定义类型)的参...
  • 2020-08-08

    2020-08-10 16:34:35
    第二个问题,错误的理解了继承中上转型对象不能调用子类定义的方法这个问题,不能调用的是父类中未被定义的方法,比如新建一个方法名,而像已经定义的方法,子类重写,父类是可以调用的,不然接口就没作用了。...

空空如也

空空如也

1 2
收藏数 32
精华内容 12
关键字:

上转型对象调用父类的方法参数