首页 > 其他分享 >方法相关

方法相关

时间:2024-07-31 09:50:43浏览次数:13  
标签:调用 Java obj 重载 相关 实参 方法

方法

1.方法的作用

Java中方法(或函数)的作用是多方面的,它们是实现面向对象编程(OOP)核心概念的重要工具。以下是Java中方法的一些主要作用:

  1. 代码重用
    方法允许你将代码组织成可重用的单元。一旦你定义了一个方法,你就可以在程序的多个地方调用它,而无需重复编写相同的代码。这不仅可以减少代码量,还可以提高代码的可维护性和可读性。
  2. 模块化
    通过将程序分解为独立的方法,你可以将复杂的任务分解成更小、更易于管理的部分。每个方法都负责完成一个特定的任务,这使得理解和修改程序变得更加容易。
  3. 封装
    封装是OOP的一个基本原则,它要求将数据和操作这些数据的方法组合在一起,形成一个类。方法作为类的成员,可以访问和操作类的私有数据,而外部代码则只能通过公共方法(接口)与类进行交互。这有助于隐藏类的内部实现细节,并保护数据不被随意修改。
  4. 提高可读性
    通过给方法命名,你可以清楚地表达该方法的功能。这使得其他开发者(或未来的你)在阅读代码时能够更容易地理解每个部分的作用。
  5. 实现多态性
    在Java中,你可以通过方法重写(Override)和方法重载(Overload)来实现多态性。方法重写允许子类提供一个特定于子类的实现,而方法重载则允许在同一个类中定义多个同名但参数列表不同的方法。多态性使得你可以编写更加灵活和可扩展的代码。
  6. 异常处理
    方法可以声明它可能抛出的异常,这使得调用者能够知道在调用该方法时可能需要处理哪些类型的错误。通过抛出异常,方法可以向调用者报告错误情况,并允许调用者采取适当的措施来解决问题。
  7. 促进代码的组织和结构化
    通过将代码组织成方法,你可以更好地控制程序的执行流程。你可以按照逻辑顺序调用不同的方法,以完成复杂的任务。此外,通过将相关的方法组织在同一个类中,你可以进一步促进代码的结构化和模块化。
  8. 实现递归
    递归是一种强大的编程技术,它允许方法调用自身来解决问题。递归方法特别适用于解决那些可以分解为更小相似问题的任务,如遍历树形结构、计算阶乘等。

2.方法的定义

在Java中,方法的定义是创建一个可执行的代码块,该代码块封装了实现特定功能所需的所有语句。方法(也称为函数)是Java程序的基本构建块之一,它们允许你将代码组织成可重用的单元,从而提高代码的可读性和可维护性。

一个完整的方法定义包括以下几个部分:

  1. 访问修饰符(Access Modifier):定义了方法的访问级别,即谁可以调用这个方法。Java中有四种访问修饰符:publicprotectedprivate(以及默认修饰符,即不显式指定访问修饰符的情况)。
  2. 返回类型(Return Type):方法执行完毕后返回的数据类型。如果方法不返回任何值,则返回类型应为void
  3. 方法名(Method Name):方法的唯一标识符,它遵循Java的命名约定(如驼峰命名法)。
  4. 参数列表(Parameter List):方法接收的输入值,它是一个用逗号分隔的参数声明列表。每个参数声明包括参数类型和参数名。如果方法不接受任何参数,则参数列表为空。
  5. 方法体(Method Body):包含实现方法功能的Java语句的集合。方法体用大括号{}包围。
  6. 返回语句(Return Statement,对于非void方法):可选的,用于结束方法的执行并将控制权返回给方法调用者。它还可以返回一个值给调用者。如果方法具有返回类型void,则不需要(也不允许)包含返回语句。

下面是一个Java中方法定义的简单示例:

public class Calculator {  
  
    // 定义一个计算两个整数和的方法  
    public int add(int num1, int num2) {  
        // 方法体  
        int sum = num1 + num2;  
        // 返回语句  
        return sum;  
    }  
  
    // 定义一个不返回任何值的方法  
    public void displayMessage() {  
        // 方法体  
        System.out.println("Hello, Java!");  
        // 对于void方法,不需要返回语句  
    }  
}

在这个例子中,Calculator类包含两个方法:adddisplayMessageadd方法接受两个整数作为参数,并返回它们的和。它使用了一个返回语句来返回计算结果。displayMessage方法不接受任何参数,也不返回任何值(其返回类型为void),它仅打印一条消息到控制台。

注意,在Java中,方法定义是类的一部分,所以你需要将它们放在类定义内部。此外,虽然上面的示例展示了在类内部定义静态方法之前的类定义,但你也可以在接口中定义抽象方法(这些方法没有方法体),并在实现接口的类中提供具体实现。

3.方法的实参和形参

在Java中,方法调用时涉及的两个关键概念是形参(形式参数)和实参(实际参数)。这两个概念在方法定义和方法调用时起着重要的作用,它们之间的关系是理解Java方法调用机制的基础。

3.1.形参(Formal Parameters)

形参是定义在方法签名中的变量,用于在方法体内接收调用者传递的数据。在方法被调用之前,形参不占用内存中的存储单元。形参只在方法被调用时才分配内存单元,其内存单元的大小和类型由调用时传入的实参决定。在方法执行结束后,形参所占用的内存单元会被释放。

形参的命名和作用域仅限于定义它的方法内部。在方法体内,你可以通过形参来访问调用者传递给方法的数据。

3.2.实参(Actual Parameters)

实参是在调用方法时传递给方法的实际值。实参可以是常量、变量、表达式或另一个方法的返回值。在方法调用时,实参的值被传递给对应的形参,以便在方法体内使用。

需要注意的是,实参在方法调用之前就已经被计算并确定了其值(对于表达式和另一个方法的返回值作为实参的情况),而形参的值是在方法调用时由实参赋予的。

3.3.形参与实参的传递

在Java中,无论是基本数据类型还是引用数据类型,方法调用时传递的都是值。但是,这里的“值”的含义对于基本数据类型和引用数据类型是不同的。

  • 对于基本数据类型(如int、float、char等),传递的是实参的值的一个副本。因此,在方法体内对形参的修改不会影响到实参本身。
  • 对于引用数据类型(如对象、数组等),传递的是实参(即对象的引用或数组名)的值的副本。这意味着方法体内和方法体外都指向同一个对象或数组,因此在方法体内对对象或数组所做的修改会影响到原始对象或数组。但是,如果方法体内改变了形参引用所指向的对象(即重新为形参分配了一个新的对象),那么这个改变不会影响到实参所引用的对象。

示例

public class Test {  
    public static void main(String[] args) {  
        int x = 10;  
        System.out.println("调用前x的值:" + x);  
        modify(x);  
        System.out.println("调用后x的值:" + x); // 输出10,因为x是基本数据类型,传递的是值的副本  
  
        MyClass obj = new MyClass();  
        obj.value = 100;  
        System.out.println("调用前obj.value的值:" + obj.value);  
        modifyObject(obj);  
        System.out.println("调用后obj.value的值:" + obj.value); // 输出101,因为obj是引用数据类型,传递的是引用的副本,但指向同一个对象  
    }  
  
    public static void modify(int num) {  
        num = 20; // 修改的是num(形参)的值,对x(实参)没有影响  
    }  
  
    public static void modifyObject(MyClass obj) {  
        obj.value = 101; // 修改的是obj(形参)所引用的对象的属性,对原始对象也有影响  
        // 如果这里写 obj = new MyClass(); 那么原始对象就不会被修改  
    }  
}  
  
class MyClass {  
    int value;  
}

4.JVM内存结构划分

JVM(Java虚拟机)的内存结构主要可以划分为以下几个部分:堆(Heap)、方法区(Method Area)、虚拟机栈(VM Stack)、程序计数器(Program Counter Register)以及本地方法栈(Native Method Stack)。以下是这些部分的详细划分和说明:

1. 堆(Heap)

  • 定义与特点:堆是JVM中最大的一块内存区域,用于存放对象实例和数组。堆被所有线程共享,是垃圾收集器管理的主要区域,因此也被称为“GC堆”。
  • 内存划分:堆通常被细分为新生代(Young Generation)和老年代(Old Generation)。新生代又被进一步划分为Eden区、From Survivor区(也称为S0区)和To Survivor区(也称为S1区),默认情况下这些区域的比例为8:1:1。
  • 垃圾收集:堆内存是垃圾收集的主要区域,采用分代收集算法,以提高垃圾回收的效率。

2. 方法区(Method Area)

  • 定义与特点:方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。它是线程共享的内存区域,在JDK 1.8之前被称为永久代(Permanent Generation),但在JDK 1.8及以后,永久代被移除,取而代之的是元空间(Meta Space),元空间位于本地内存中。
  • 内存回收:方法区内存回收的目标主要是常量池的回收和类型的卸载,但这部分回收相对较难实现。

3. 虚拟机栈(VM Stack)

  • 定义与特点:虚拟机栈是每个线程私有的内存区域,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法被调用时,都会创建一个栈帧(Stack Frame)来存储这些信息,方法执行完成后,对应的栈帧会被销毁。
  • 异常处理:如果线程请求的栈深度超过最大值,会抛出StackOverflowError异常;如果栈进行动态扩展时无法申请到足够内存,会抛出OutOfMemoryError异常。

4. 程序计数器(Program Counter Register)

  • 定义与特点:程序计数器是一块较小的内存空间,用于记录当前线程所执行的字节码的行号指示器。它是线程私有的,每条线程都有一个独立的程序计数器,用于指示下一条要执行的字节码指令。
  • 特殊性质:程序计数器是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

5. 本地方法栈(Native Method Stack)

  • 定义与特点:本地方法栈与虚拟机栈的作用非常相似,不过它主要为虚拟机使用到的Native方法服务。Native方法一般是用其他语言(如C、C++或汇编语言)编写的,并且被编译为基于本机硬件和操作系统的程序。
  • 异常处理:与虚拟机栈一样,本地方法栈也会抛出StackOverflowErrorOutOfMemoryError异常。

5.方法的重载

在Java中,方法的重载(Overloading)是一种允许在同一个类中定义多个同名方法但参数列表不同的特性。参数列表的不同可以体现在参数的个数、类型或顺序上。重载的方法可以有不同的返回类型,但返回类型不能作为区分方法重载的依据。

方法重载的规则

  1. 方法名必须相同:重载的方法必须具有相同的名称。
  2. 参数列表必须不同:这可以通过改变参数的类型、数量或者顺序来实现。
  3. 返回类型可以不同:虽然返回类型在重载方法中可以是不同的,但它不是区分重载方法的因素。重载的确定发生在编译时,而返回类型是在运行时才知道的。
  4. 访问修饰符可以不同:重载的方法可以有不同的访问修饰符(如public、protected、private)。
  5. 抛出的异常可以不同:重载的方法可以声明抛出不同的异常,但这也不是重载的主要决定因素。

示例

下面是一个简单的Java类,它展示了方法重载的概念:

public class OverloadExample {  
  
    // 方法1:打印一个整数  
    public void print(int i) {  
        System.out.println("Printing int: " + i);  
    }  
  
    // 方法2:打印一个双精度浮点数  
    public void print(double f) {  
        System.out.println("Printing double: " + f);  
    }  
  
    // 方法3:打印一个字符串  
    public void print(String s) {  
        System.out.println("Printing string: " + s);  
    }  
  
    // 方法4:打印两个整数  
    public void print(int i, int j) {  
        System.out.println("(" + i + ", " + j + ")");  
    }  
  
    public static void main(String[] args) {  
        OverloadExample obj = new OverloadExample();  
  
        obj.print(5);       // 调用 print(int)  
        obj.print(5.0);     // 调用 print(double)  
        obj.print("Hello"); // 调用 print(String)  
        obj.print(10, 20);  // 调用 print(int, int)  
    }  
}

在上面的例子中,print方法被重载了四次,每次的参数列表都不同。在main方法中,通过传递不同类型的参数,可以调用到不同版本的print方法。

注意事项

  • 仅仅返回类型不同,不足以成为方法重载的依据。
  • 仅仅访问修饰符或抛出的异常不同,也不是重载的依据。
  • 参数列表的不同是重载方法的主要区分点。

标签:调用,Java,obj,重载,相关,实参,方法
From: https://www.cnblogs.com/tubby233/p/18333912

相关文章

  • QSqlRelationalTableModel 附加相关列
    我有一个QSqlRelationalTableModel设置到另一个表,工作得很好。现在,我想在相关表上查找该行的其他列。我该如何实现这一点?QSqlRelation示例表:到目前为止我所拥有的:city('id','name','state_id')state('id','name','capital')这会给我一......
  • 如何检查具体方法是否遵守抽象方法的类型提示
    这是一个由两部分组成的问题,但第二部分依赖于第一部分。出于教育目的,我试图为组实现一个抽象基类和测试套件(概念来自抽象代数)。代数群定义的一部分相当于类型约束,我想在ABC上实现该类型约束,并且如果具体类上的方法不符合该约束,就会有一些抱怨。I对于逻辑......
  • File概述和File的构造方法
    File是什么    File对象表示路径,可以是文件,可以是文件夹,路径可以存在,可以不存在绝对路径vs相对路径    绝对路径:带盘符    相对路径:不带盘符,默认到当前项目下去找File的三种构造方法packagecom.chen.bao3;importjava.io.File;publi......
  • Go语言---sort 包中sort.Ints()、sort.Strings()、sort.Slice()、sort.SliceStable()、s
    在每一种编程语言中,都会涉及到排序操作。而在Go语言中,其中内置的sort包中提供了根据一些排序函数来对任何序列进行排序的功能。通过这个包中的一些方法,我们可以对一些基本的可以比较大小的类型的切片进行排序,也可以通过实现排序接口的几个特定方法实现自定义排序。sort.I......
  • 一种优化 01 可行背包的方法
    source:abc221g有\(n\)个物品,体积分别为\(a_{1,2,\dots,n}\),要求从中选出若干个物品使得体积和为\(V\)。令\(A=\maxa_i\),\(V\lenA\)。一般的01背包做法是\(O(n^2A)\)的,但存在一种相对简单的做法可以做到复杂度\(O(nA)\)。下面描述这个做法。首先任意排列这个物......
  • 线性代数中的降维方法
    ......
  • 最新基于多案例全流程防洪评价报告编制方法与水流数学模型建模实践技术应用
    随着社会经济的快速发展,我国河道周边土地开发利用率不断增大,临河建筑物与日俱增,部分河道侵占严重,导致防洪压力增大。加之部分河流沿岸临河建筑物设置混乱、布设不合理、阻水率增大、未经管理部门同意私设涉河建筑物等问题非常突出,已威胁到河道安全,使得河道防洪保障工作压力日益......
  • 数据集相关类代码回顾理解 | np.mean\transforms.Normalize\transforms.Compose\xx
    数据集相关类代码回顾理解|StratifiedShuffleSplit\transforms.ToTensor\Counter目录np.meantransforms.Normalizetransforms.Composexxx.transformnp.meanmeanRGB=[np.mean(x.numpy(),axis=(1,2))forx,_intrain_ds]计算每个样本的(RGB)均值  。NumPy库np.......
  • mybatis中映射和注解在数据库进行增删改查的方法
    此两种方法都是基于maven项目的基础上运行主要步骤如下:1、在mevan中的pom文件添加依赖文件: 2、在src目录下编写编写配置文件(mybatis-cfg.xml) 3、编写实体类(Student.java) 4、编写映射文件(StudentMapper.xml) 5、编写测试文件 6、调用JUnit5进行调试核心文件含义:......
  • 方法
    方法:语句定义格式:修饰符返回值类型方法名(参数类型1参数名1,参数类型2参数名,....){方法的实现逻辑return返回值;}名词解释:修饰符:目前记住一个固定写法publicstatic,后面会......