Java中void方法深入讲解

1.1基本简介

void是java中的关键字,它代表的意思是什么也不返回,我们在开发过程中经常会用到,如一个方法不需要返回值时可以使用void关键字,在main方法中也是void关键字。

	public static void getName() {
		String name = "username";
		System.out.println(name);
	}
	public static void main(String[] args) {
		
	}
1.2 void是什么东东?

首先我们知道java是一种强类型的语言,从方法的声明语法可以看出每个方法必须要有返回值,需要确定方法的返回值类型,当定义方法使用void修饰的时候,也就是什么也不返回,由此可见void也应该算是一种数据类型;而我们知道java中常用的数据类型有8种基本数据类型和引用类型等;

那么void修饰符对应的应该是什么类型呢?其实void对应着一个Vod类:

package java.lang;

/**
 * The {@code Void} class is an uninstantiable placeholder class to hold a
 * reference to the {@code Class} object representing the Java keyword
 * void.
 *
 * @author  unascribed
 * @since   JDK1.1
 */
public final
class Void {

    /**
     * The {@code Class} object representing the pseudo-type corresponding to
     * the keyword {@code void}.
     */
    public static final Class<Void> TYPE = Class.getPrimitiveClass("void");

    /*
     * The Void class cannot be instantiated.
     */
    private Void() {}
}

Void类是用final修饰的,说明不可以扩展,另外构造方法是私有的,不可以实例化;

Void类是一个不可实例化的占位符类,用来保存一个引用代表了Java关键字void的Class对象。

1.3 如何终止void修饰的方法

如果想在方法中的任何地方终止执行,可以使用return后面不加任何返回值

	public void getName() {
		String name = "username";
		if(name != null)
			return;
		System.out.println(name);
	}
<think>好的,我现在需要为用户讲解Java中的方法调用多种情况。首先,我需要回顾一下Java方法调用的基本概念和不同型的情况。用户可能希望了解静态方法、实例方法方法重载、方法重写、构造方法调用,以及通过接口和父引用来调用方法等情况。我还需要确保按照用户提供的系统级指令来格式化数学表达式,不过这个问题主要涉及Java语法,可能数学公式较少。但如果有涉及到参数传递或运算的话,可能需要使用行内公式。 首先,我应该从基础开始,逐步展开不同的情况。结构要清晰,分点讲解,每个情况举例子说明。同时要注意中文回答,确保术语准确。比如,静态方法和实例方法的区别,方法重载与重写的不同,构造方法的调用链,还有多态中的动态绑定等。 接下来,我需要考虑用户可能的疑惑点。例如,何时使用静态方法,何时使用实例方法方法重载时参数列表如何变化?子重写父方法时@Overrride注解的作用?还有通过接口引用调用具体实现方法,这里涉及多态。 例子要简单明了,便于理解。比如静态方法可以用名直接调用,实例方法需要对象实例。方法重载的例子可以是同一个中有多个同名方法,参数不同。重写则是子覆盖父方法,使用相同的签名。 另外,构造方法的调用,包括this()和super()的使用,以及它们在构造方法中的位置限制。还有递归方法的调用,虽然属于方法调用的一种情况,但用户可能没有提到,不过作为全面的讲解可能需要包含。 同时,要注意可能存在的误区,比如静态方法中不能直接调用实例方法或实例变量,因为静态方法不依赖于对象实例。而实例方法可以访问静态成员。 接口中的默认方法和静态方法的调用方式,在Java 8之后的变化,可能需要提及。比如接口中的默认方法可以被实现直接调用或重写,而静态方法只能通过接口名调用。 还有可变参数方法的调用,参数传递的方式,值传递和引用传递的区别,虽然Java是值传递,但对象引用传递时会影响对象本身。 最后,总结各种方法调用的使用场景和注意事项,帮助用户形成系统化的理解。 现在需要组织这些内容,分点说明,每个情况给出定义、示例代码和解释。确保结构清晰,逐步引导用户理解不同的方法调用情况。同时检查是否符合格式要求,如使用正确的LaTeX格式,但看起来这个问题中数学公式较少,可能只需要注意代码块的格式,但用户没有特别要求代码格式,可能用文字描述即可,或者用中文引号标注方法名。 可能还需要注意术语的一致性,比如“方法”而不是“函数”,因为Java中称为方法。此外,访问修饰符对方法调用的影响,比如私有方法只能在内部调用,公有方法可以在其他调用,但用户的问题可能更关注调用方式而非访问权限,所以可能不需要深入讨论,除非相关。 现在开始组织内容: 1. 静态方法调用 - 使用名直接调用,无需实例 - 示例:Math.abs(-5) 2. 实例方法调用 - 需要对象实例 - 示例:String str = "hello"; str.length(); 3. 方法重载(Overload) - 同一中,同名方法参数不同 - 示例:System.out.println的不同参数型 4. 方法重写(Override) - 子覆盖父方法,相同签名 - 示例:子重写toString() 5. 构造方法调用 - 使用new关键字,可链式调用this()或super() 6. 多态中的方法调用 - 父引用指向子对象,调用重写方法 - 示例:Animal a = new Dog(); a.sound(); 7. 接口方法调用 - 实现对象调用接口方法 - 默认方法和静态方法的调用方式 8. 递归方法调用 - 方法自身调用自身 9. 可变参数方法调用 - 使用...声明参数,可传入多个值 在讲解每个部分时,需要给出具体的例子,并说明调用方式和注意事项。例如,在方法重载时,返回型不同但参数相同不算重载,会导致编译错误。而在方法重写时,子方法的访问权限不能比父更严格,比如父方法是public,子不能是private。 可能还需要提到super关键字在子中调用父方法的情况,比如super.methodName()。 另外,构造方法中,this()调用本其他构造方法必须放在第一行,super()调用父构造方法同样必须放在子构造方法的第一行,否则编译错误。 对于接口,Java 8允许默认方法,可以通过实例调用,而静态方法则通过接口名调用,例如Comparable.compareTo是实例方法,而Comparator.comparing是静态方法。 在递归调用时,需要有终止条件,否则导致栈溢出。 可变参数方法如public void printNumbers(int... nums),调用时可以传入多个int参数,或者数组。 可能还需要提到方法调用的绑定机制——静态绑定(编译时)用于重载、静态方法、私有方法、final方法等;动态绑定(运行时)用于重写的实例方法。 最后,总结各种调用的区别和应用场景,帮助用户根据需求选择合适的方法调用方式。</think>Java中的方法调用有多种情况,下面分步骤详细讲解: ### 1. 静态方法调用 **定义**:使用`static`修饰的方法,属于而非实例。 **调用方式**:通过**名.方法名()**直接调用。 **示例**: ```java public class MathUtils { public static int add(int a, int b) { return a + b; } } // 调用 int result = MathUtils.add(3, 5); // 输出8 ``` **注意**:静态方法中不能直接访问实例变量或实例方法。 --- ### 2. 实例方法调用 **定义**:未使用`static`修饰的方法,需通过对象实例调用。 **调用方式**:**对象名.方法名()**。 **示例**: ```java public class Calculator { public int multiply(int a, int b) { return a * b; } } // 调用 Calculator calc = new Calculator(); int result = calc.multiply(4, 5); // 输出20 ``` --- ### 3. 方法重载(Overload) **定义**:同一中定义多个同名方法,但**参数列表不同**(型、数量或顺序)。 **示例**: ```java public class Printer { public void print(int num) { System.out.println("整数:" + num); } public void print(String text) { // 重载方法 System.out.println("字符串:" + text); } } // 调用 Printer p = new Printer(); p.print(10); // 调用print(int) p.print("Hello"); // 调用print(String) ``` **注意**:仅返回值不同不构成重载,会编译报错。 --- ### 4. 方法重写(Override) **定义**:子重新定义父中已有的方法,需保持**方法签名相同**。 **调用方式**:通过子对象调用时,优先执行子重写的方法。 **示例**: ```java class Animal { public void sound() { System.out.println("动物发出声音"); } } class Dog extends Animal { @Override public void sound() { // 重写父方法 System.out.println("汪汪汪"); } } // 调用 Animal dog = new Dog(); dog.sound(); // 输出"汪汪汪"(动态绑定) ``` --- ### 5. 构造方法调用 **定义**:通过`new`关键字创建对象时自动调用,支持链式调用(`this()`或`super()`)。 **规则**: - `this()`调用本其他构造方法。 - `super()`调用父构造方法。 - 必须放在构造方法的第一行。 **示例**: ```java class Person { String name; public Person(String name) { this.name = name; } } class Student extends Person { int grade; public Student(String name, int grade) { super(name); // 先调用父构造方法 this.grade = grade; } } ``` --- ### 6. 多态中的方法调用 **定义**:父引用指向子对象时,调用方法会执行子重写后的版本。 **示例**: ```java interface Shape { void draw(); } class Circle implements Shape { @Override public void draw() { System.out.println("绘制圆形"); } } // 调用 Shape shape = new Circle(); shape.draw(); // 输出"绘制圆形" ``` --- ### 7. 接口方法调用 **默认方法**:Java 8+允许接口定义默认实现,通过实例调用。 **静态方法**:通过接口名直接调用。 **示例**: ```java interface Logger { default void log(String message) { // 默认方法 System.out.println("日志:" + message); } static void printVersion() { // 静态方法 System.out.println("版本1.0"); } } class AppLogger implements Logger {} // 调用 AppLogger logger = new AppLogger(); logger.log("程序启动"); // 调用默认方法 Logger.printVersion(); // 调用静态方法 ``` --- ### 8. 可变参数方法调用 **定义**:使用`型... 参数名`声明,可接受多个参数或数组。 **示例**: ```java public class SumCalculator { public static int sum(int... numbers) { int total = 0; for (int num : numbers) { total += num; } return total; } } // 调用 int total1 = SumCalculator.sum(1, 2, 3); // 6 int total2 = SumCalculator.sum(new int[]{4, 5}); // 9 ``` --- ### 总结表:方法调用型对比 | 型 | 调用方式 | 关键特点 | |------------------|---------------------------|-----------------------------------| | 静态方法 | `名.方法名()` | 无需实例,级别共享 | | 实例方法 | `对象.方法名()` | 依赖对象实例 | | 方法重载 | 同方法名,参数不同 | 编译时绑定(静态绑定) | | 方法重写 | 子覆盖父方法 | 运行时绑定(动态绑定) | | 构造方法 | `new 名()` | 初始化对象,支持`this()`/`super()`| | 接口默认方法 | `对象.方法名()` | Java 8+,提供默认实现 | | 接口静态方法 | `接口名.方法名()` | 通过接口直接调用 | 掌握这些方法调用场景,能够更灵活地设计Java程序的结构和行为。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值