Java方法重载与重写(静态分派与动态分派)

Java面向对象3个基本特征:继承、封装和多态;多态主要体现在重载和重写;

1、静态分派

静态分派与重载有关,虚拟机在重载时是通过参数的静态类型,而不是运行时的实际类型作为判定依据的;静态类型在编译期是可知的;

1)基本类型

以char为例,按照char>int>long>double>float>double>Character>Serializable>Object>...(变长参数,将其视为一个数组元素)

变长参数的重载优先级最低

(注意char到byte或short之间的转换时不安全的)

2)引用类型:则需要根据继承关系进行匹配,注意只跟其编译时类型即静态类型相关

2、动态分派

动态分派与重写(Override)相关

3、示例

1)静态分派

class A
{

}

class B extends A
{

}

class C extends A
{

}

class D extends B implements E,
F {

}

interface E
{

}

interface F
{

}

public class Main1 extends A
{

public void test(A a)
{

System.out.println("A");

}

public void test(B b)
{

System.out.println("B");

}

public void test(C c)
{

System.out.println("C");

}

// 填上下面的方法,D转化为父类进行匹配,转化为B,E,F等效,无法找到最优匹配,故会编译报错

//
public void test(E e)

//
{

//
System.out.println("E");

//
}

public static void main(String[] args)
{

A aa = new A();

A ab = new B();

A ac = new C();

B b = new B();

B bd = new D();

D d = new D();

//
C ca = (C) new A();//此编译时会发生错误

C ca = new C();

/* 根据静态分配,重载只与其静态类型相关,若无对应类型,则执行隐式转换进行匹配 */

Main1 main1 = new Main1();

main1.test(aa);// 输出A

main1.test(ab);// 输出A

main1.test(ac);// 输出A

main1.test(b); // 输出B

main1.test(bd);// 输出B

main1.test(ca);// 输出C

main1.test(d); // 输出B

}

}

javap解析结果:

2)动态分派:与动态类型相关

class A
{

    public void test()
{

        System.out.println("A");

    }

}

 

class B extends A
{

    public void test()
{

        System.out.println("B");

    }

}

 

class C extends A
{

    public void test()
{

        System.out.println("C");

    }

}

 

public class Main1 extends A
{

 

    public static void main(String[] args)
{

        A aa = new A();

        A ab = new B();

        A ac = new C();

        B b  = new B();

        C ca = new C();

        //输出:A,B,C,B,C

        aa.test();

        ab.test();

        ac.test();

        b.test();

        ca.test();

    }

 

}

对应javap为:

invokevirtual(调用实例方法)指令执行的第一步就是在运行期确定接收者的实际类型,根据实际类型进行方法调用;

4、单分派与多分派:Java是一门静态多分派,动态单分派的语言;



时间: 2024-10-06 08:31:10

Java方法重载与重写(静态分派与动态分派)的相关文章

学习日记(九)java方法重载和重写

方法的重载:在一个类中的两个或两个以上的方法,他们方法名相同但是参数列表不同,这种方式称为方法的重载,方法的重载是实现多态性的方式之一. 参数列表不同指的是参数的个数不同或相同的个数但顺序不同或者类型不同,方法重载时返回值类型可以不同,但是仅仅是返回值类型不同的话不可以. java在调用方法的时候,如果精确匹配没有对应的方法,会自动转换匹配相应的方法,例如,如果没有int类型的参数,但是有一个double类型的参数的同名方法,在调用该方法时如果传入int类型的参数,则不会报错,而是把int自动转

java 方法重载与重写的归纳

方法重载:Java的方法重载,就是在类中可以创建多个方法,它们可以有相同的名字,但必须具有不同的参数,即或者是参数的个数不同,或者是参数的类型不同.调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法 示例代码: public class Test { //无返回值有有int形的参数 void receive(int i) {System.out.println("i="+i);} //无返回值,有float形的参数 void receive(float f) {Sys

java基础疑难点总结之成员变量的继承,方法重载与重写的区别,多态与动态绑定

1.成员变量的继承 1.1要点 子类用extends关键字继承父类.子类中可以提供新的方法覆盖父类中的方法.子类中的方法不能直接访问父类中的私有域,子类可以用super关键字调用父类中的方法.在子类中可以增加域,增加方法或者覆盖超类的方法,然而绝对不能删除继承的任何域和方法. 在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性

java中重载与重写浅析

java中重载与重写浅析 Overloading (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性. (3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以

java中重载和重写的区别(首先需要了解一下 多态)

多态:通俗来说,总的来说,同一种形式,不同的表现. 太长不看系列: 所谓多态,是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定.因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体

java方法——重载2

什么是Java方法重载 方法重载的定义 1 对于同一个类,如果这个类里面有两个或者多个重名的方法,但是方法的参数个数.类型.顺序至少有一个不一样,这时候局构成方法重载. END 方法重载示例 1 public class Test{ public void a( ){ }; public void a( int i){ }; } 说明:在Test类中有两个方法,名字都相同,都是a.在调用方法a时,如果不传参数,则系统会自动调用第一个方法a,如果传入一个 int 类型的参数,则系统调用第二个方法a

(三十)分派调用:静态分派和动态分派

分派调用 其实分派分为两种,即动态分派和静态分派.我们在了解分派的时候,通常把它们与重写和重载结合到一起. 重载(overload)与静态分派 我们先看一个题: public class Main { static abstract class Father { } static class Son extends Father { } static class Daughter extends Father { } public void getSex(Daughter daughter) {

Java 方法重载,方法重写(覆盖),继承等细节注意

1.方法重载(method overload)的具体规范 如果有两个方法的方法名相同,但参数不一致,那么可以说一个方法是另一个方法的重载. 一.方法名一定要相同. 二.方法的参数表必须不同,包括参数的类型或个数,以此区分不同的方法体. 1.如果参数个数不同,就不管它的参数类型了! 2.如果参数个数相同,那么参数的类型或者参数的顺序必须不同. 三.方法的返回类型.修饰符可以相同,也可不同. 四.main方法也可以被重载 方法重载的作用:可以一个相同的方法传入不同的参数以达到想要的结果 2.方法继承

java方法重载(overload)、重写(override);this、super关键简介

一.方法重载: 条件:必须在一个类中,方法名称相同,参数列表不同(包括:数据类型.顺序.个数),典型案例构 造方重载.  注意:与返回值无关 二.方法重写: 条件: (1)继承某个类或实现某接口 (2)返回值类型相同.方法签名相同(方法名称+参数列表) 注意:(1)重写的方法不能比被重写方法有更严格的访问权限 (2)父类中的私有方法不能被重写 三.static关键字(静态的) 1.用来修饰成员变量.成员方法.还有 static代码块(局部变量不能用static来修饰) 2.修饰的成员变量.成员方