iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在Java中调用方法
  • 560
分享到

怎么在Java中调用方法

2023-06-15 08:06:00 560人浏览 八月长安
摘要

这期内容当中小编将会给大家带来有关怎么在Java中调用方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、方法调用方法调用的唯一目的:确定要调用哪一个方法方法调用分为解析调用和分派调用二、非虚方法与虚方

这期内容当中小编将会给大家带来有关怎么在Java中调用方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

一、方法调用

方法调用的唯一目的:确定要调用哪一个方法

方法调用分为解析调用和分派调用

二、非虚方法与虚方法

非虚方法: 静态方法,私有方法,父类中的方法,被final修饰的方法,实例构造器

与之对应不是非虚方法的就是虚方法了

它们都没有重写出其他版本的方法,非常适合在类加载阶段就进行解析(符号引用->直接引用)

三、调用指令

普通调用指令

  • invokestatic:调用静态方法

  • invokespecial:调用私有方法,父类中的方法,实例构造器方法,final方法

  • invokeinterface:调用接口方法

  • invokevirtual: 调用虚方法

使用invokestaticinvokespecial指令的一定是非虚方法

使用invokeinterface指令一定是虚方法(因为接口方法需要具体的实现类去实现)

使用invokevirtual指令的是虚方法

动态调用指令

invokedynamic: 动态解析出需要调用的方法再执行

jdk 7 出现invokedynamic,支持动态语言

测试虚方法代码

父类

public class Father {    public static void staticMethod(){        System.out.println("father static method");    }    public final void finalMethod(){        System.out.println("father final method");    }    public Father() {        System.out.println("father init method");    }    public void overrideMethod(){        System.out.println("father override method");    }}

接口

public interface TestInterfaceMethod {    void testInterfaceMethod();}

子类

public class Son extends Father{    public Son() {        //invokespecial 调用父类init 非虚方法        super();        //invokestatic 调用父类静态方法 非虚方法        staticMethod();        //invokespecial 调用子类私有方法 特殊的非虚方法        privateMethod();        //invokevirtual 调用子类的重写方法 虚方法        overrideMethod();        //invokespecial 调用父类方法 非虚方法        super.overrideMethod();        //invokespecial 调用父类final方法 非虚方法        super.finalMethod();        //invokedynamic 动态生成接口的实现类 动态调用        TestInterfaceMethod test = ()->{            System.out.println("testInterfaceMethod");        };        //invokeinterface 调用接口方法 虚方法        test.testInterfaceMethod();    }    @Override    public void overrideMethod(){        System.out.println("son override method");    }    private void privateMethod(){        System.out.println("son private method");    }    public static void main(String[] args) {        new Son();    }}

怎么在Java中调用方法

注意: 接口中的默认方法也是invokeinterface,接口中的静态方法是invokestatic

四、解析调用

在编译就确定了要调用哪个方法,运行时不可以改变

解析调用 调用的是 非虚方法

五、分派调用

分派又分为静态分派与动态分配

怎么在Java中调用方法

早期绑定:解析调用和静态分派这种编译期间可以确定调用哪个方法

晚期绑定: 动态分派这种编译期无法确定,要到运行时才能确定调用哪个方法

六、静态分派

//  静态类型       实际类型List list = new ArrayList();

静态分派: 根据静态类型决定方法执行的版本的分派

发生在编译期,特殊的解析调用

典型的表现就是方法的重载

public class StaticDispatch {    public void test(List list){        System.out.println("list");    }    public void test(ArrayList arrayList){        System.out.println("arrayList");    }    public static void main(String[] args) {        ArrayList arrayList = new ArrayList();        List list = new ArrayList();        StaticDispatch staticDispatch = new StaticDispatch();        staticDispatch.test(list);        staticDispatch.test(arrayList);    }}

方法的版本并不是唯一的,往往只能确定一个最适合的版本

七、动态分派

动态分派:动态期根据实际类型确定方法执行版本的分派

动态分派与重写有着紧密的联系

public class DynamicDispatch {    public static void main(String[] args) {        Father father = new Father();        Father son = new Son();        father.hello();        son.hello();    }    static class Father{        public void hello(){            System.out.println("Father hello");        }    }    static class Son extends Father{        @Override        public void hello() {            System.out.println("Son hello");        }    }}

怎么在Java中调用方法

虽然常量池中的符号引用相同,invokevirtual指令最终指向的方法却不一样

分析invokevirtual指令搞懂它是如何确定调用的方法

invokevirtual找到栈顶元素的实际类型

如果在这个实际类型中找到与常量池中描述符与简单名称相符的方法,并通过访问权限的验证就返回这个方法的引用(未通过权限验证返回IllegalAccessException非法访问异常)

如果在实际类型中未找到,就去实际类型的父类中寻找(没找到抛出AbstractMethodError异常)

因此,子类重写父类方法时,根据invokevirtual指令规则,先找实际类型,所以才存在重写的多态

频繁的动态分派会重新查找栈顶元素实际类型,会影响执行效率

为提高性能,JVM在该类方法区建立虚方法表使用索引表来代替查找

字段不存在多态

当子类出现与父类相同的字段,子类会覆盖父类的字段

public class DynamicDispatch {    public static void main(String[] args) {        Father son = new Son();    }    static class Father{        int num = 1;        public Father() {            hello();        }        public void hello(){            System.out.println("Father hello " + num);        }    }    static class Son extends Father{        int num = 2;        public Son() {            hello();        }        @Override        public void hello() {            System.out.println("Son hello "+ num);        }    }}

先对父类进行初始化,所以会先执行父类中的构造方法,而构造方法去执行了hello()方法,此时的实际类型是Son于是会去执行Son的hello方法,此时子类还未初始化成员变量,只是有个默认值,所以输出Son hello 0

八、单分派与多分派

public class DynamicDispatch {    public static void main(String[] args) {        Father son = new Son();        Father father = new Father();        son.hello(new Nod());        father.hello(new Wave());    }    static class Father{        public void hello(Nod nod){            System.out.println("Father nod hello " );        }        public void hello(Wave wave){            System.out.println("Father wave hello " );        }    }    static class Son extends Father{        @Override        public void hello(Nod nod) {            System.out.println("Son nod hello");        }        @Override        public void hello(Wave wave) {            System.out.println("Son wave hello");        }    }    //招手    static class Wave{}    //点头    static class Nod{}}

宗量: 方法参数与方法调用者

分派还可以分为单,多分派

单分派:根据一个宗量选择方法

多分派:根据多个宗量选择方法

在编译时,不仅要关心静态类型是Father还是Son,还要关心参数是Nod还是Wave,所以静态分派是多分派(根据两个宗量对方法进行选择)

在执行son.hello(new Nod())时只需要关心实际类型是Son还是Father,所以动态分派是单分派(根据一个宗量对方法进行选择)

上述就是小编为大家分享的怎么在Java中调用方法了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么在Java中调用方法

本文链接: https://www.lsjlt.com/news/278917.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Java中调用方法
    这期内容当中小编将会给大家带来有关怎么在Java中调用方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、方法调用方法调用的唯一目的:确定要调用哪一个方法方法调用分为解析调用和分派调用二、非虚方法与虚方...
    99+
    2023-06-15
  • 怎么在java中使用反射调用方法
    这篇文章将为大家详细讲解有关怎么在java中使用反射调用方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发...
    99+
    2023-06-14
  • 如何在Java中调用jython方法
    如何在Java中调用jython方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1 什么是jython? 他其实是一门语言,并非是Java 或者Python的解释器.用它...
    99+
    2023-05-31
    jython java ava
  • 怎么在html中调用php方法
    对于web开发者来说,HTML和PHP是两种非常重要的编程语言。HTML是用于呈现内容的标记语言,而PHP是用于在网站中实现动态功能的服务器端编程语言。当你需要在网站中实现一些动态功能时,你需要使用PHP来完成。在许多情况下,你需要在HTM...
    99+
    2023-05-14
    php
  • 怎么在html中调用js方法
    这篇文章给大家介绍怎么在html中调用js方法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。html有什么特点1、简易性:超级文本标记语言版本升级采用超集方式,从而更加灵活方便,适合初学前端开发者使用。2、可扩展性:超...
    99+
    2023-06-14
  • Java Collections.shuffle方法怎么调用
    Java中的Collections类提供了shuffle方法来打乱集合中的元素顺序。要调用shuffle方法,需要按照以下步骤进行操...
    99+
    2023-09-12
    Java
  • linux怎么调用java方法
    在Linux系统中,可以通过以下步骤调用Java方法:1. 安装Java开发环境:在Linux系统上安装Java Developme...
    99+
    2023-10-11
    java linux
  • java concat方法怎么调用
    在Java中,可以使用+运算符或String的concat()方法来拼接字符串。 使用+运算符拼接字符串时,可以直接将字符...
    99+
    2023-10-26
    java
  • c#怎么调用java方法
    在 c# 中调用 java 方法可以通过以下两种机制:使用 java native interface (jni):提供了在不同编程语言之间调用本地方法的接口。需手动加载 jvm、查找类...
    99+
    2024-05-12
    access c#
  • 怎么在PHP中调用对象方法
    本篇内容介绍了“怎么在PHP中调用对象方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对象方法的基本语法在PHP中,我们可以使用“->...
    99+
    2023-07-05
  • 怎么在java中调用super
    怎么在java中调用super?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发...
    99+
    2023-06-14
  • Java怎么调用其他类中的方法
    在Java中,要调用其他类中的方法,首先需要创建一个该类的对象,然后通过对象来调用方法。以下是一个示例代码:```javapubli...
    99+
    2023-08-15
    Java
  • java中方法的调用
    1.静态方法调用静态方法: 用静态方法时通过(类名.方法名)的方法进行调用,当调用方法和被调用的方法在同一类中时,类名可省略,直接通过方法名进行调用; 同时也可以通过对象进行调用,但较为繁琐,一般不使...
    99+
    2023-09-22
    java
  • 在Java中实现远程方法调用(转)
    在Java中实现远程方法调用(转)[@more@]一、Java中的远程方法调用 远程方法调用(Remote Method Invocation, RMI)是Java1.1引入的分布式对象软件包,它的出现简化了在多台机器上的Java应用之间的...
    99+
    2023-06-03
  • 如何在java中使用反射调用方法
    这篇文章将为大家详细讲解有关如何在java中使用反射调用方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的...
    99+
    2023-06-14
  • Arrays.toString()方法怎么在java中使用
    Arrays.toString()方法怎么在java中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在实际项目中,如果想要把数组中的内容打印出来,直接使用toStrin...
    99+
    2023-06-06
  • Exchanger方法怎么在Java中使用
    这期内容当中小编将会给大家带来有关Exchanger方法怎么在Java中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Exchanger的使用方法介绍exchange(V x):阻塞当前线程,直到另外...
    99+
    2023-06-14
  • 怎么在Java中使用 List方法
    怎么在Java中使用 List方法 ?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java L...
    99+
    2023-05-31
    java list ava
  • 怎么在java中使用park方法
    这期内容当中小编将会给大家带来有关怎么在java中使用park方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. ...
    99+
    2023-06-14
  • instanceof方法怎么在java 中使用
    这篇文章给大家介绍instanceof方法怎么在java 中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的...
    99+
    2023-05-30
    java instanceof
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作