一、方法的定义
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
- 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
- 返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
- 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
- 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
- 方法体:方法体包含具体的语句,定义该方法的功能。
举例:
public static int max(int num1, int num2) {
return num1 > num2 ? num1 : num2;
}
//含有形参,且是int方法返回值,必有return
二、方法的分类
public class Demo{
//1. 最简单的无参方法
void sum1(){
System.out.println("加法操作");
}
//2. 拥有修饰符的无参方法
public static void sum2(){
System.out.println("加法操作");
}
//3. 有参数,无返回值
public static void sum3(int a,int b){
System.out.println("两数相加结果"+a+b);
}
//4.有参,有返回值
public static int sum4(int a,int b){
return a+b;
}
//5.无参数,有返回值
public static int sum5(){
int x=20;
int y=28;
int z=x+y;
return z;
}
}
2.1 void——无返回值的调用(1)
public class Demo{
public static void main(String[] args) {
//实参
int a = 10;
int b = 20;
swap(a,b);
System.out.println("main函数中的a=" + a);//10
System.out.println("main函数中的b=" + b);//20
}
//分析:需要参数(两个参数)
// 不需要返回值
// 形参:没有携带值的变量,多个变量之间使用逗号分隔
public static void swap(int a,int b){
int temp = 0;
temp = a;
a = b ;
b = temp ;
System.out.println("swap函数中的a=" + a); //20
System.out.println("swap函数中的b=" + b); //10
}
}
/*
swap函数中的a=20
swap函数中的b=10
main函数中的a=10
main函数中的b=20
*/
2.2 void——有返回值的调用(2)
public class Demo {
public static void main(String[] args) {
show();
}
/*1,在void的函数中使用return,类似于break或者continue,直接结束整个方法,一般情况可以
不用return */
public static void show() {
System.out.println("Hello World!");
int x = 10;
if (x > 5) {
return;//结束方法 }
}
// 不能执行
System.out.println("no");
}
}
2.3 非void——有返回值的调用(1)
public class Demo {
public static void main(String[] args) {
int result = add(10,20);
System.out.println(result);
}
/*2在一个有返回值的函数中必须有return,return后面必须跟一个具体的数值,而且数值
的类型和返回值类型必须保持一致,最后结束整个方法,并且将返回值携带给调用者 */
public static int add(int a ,int b) {
System.out.println("Hello World!");
int c = a+b;
return c;
}
}
2.4 非void——有返回值的调用(2)
public class Demo {
public static void main(String[] args) {
int result = compare(34,67);
System.out.println(result);
}
/*3,如果一个自定义的函数有返回值,并且在方法中遇到了分支结构,在每
一个分支后面都需要出现一个return,相当于Switch里面的break语句 */
public static int compare(int a,int b) {
if(a>b){
return a;
}
else if(a<b){
return b;
}
else{
return 0;
}
}
}
三、自动类型转换
左侧的数据类型可以提升为右侧的任何数据类型:
byte → short → int → long
short → int → long
int → long → float → double
float → double
long → float → double
//1.函数返回值小转大—>自动类型转换
//2.函数实参小转大—>自动类型转换
public class A {
public static void main(String[] args){
double x = sum(1, 2);//double是大容量。int是小容量。自动类型转换。int--->double
byte a = 1, b = 1;
int m = sum(a, b); // (b1,b2)是实参。自动类型转换。byte--->int
System.out.println(x);
}
public static int sum(int a, int b){
int y = a + b;
return y;
}
}
//3.函数必须具有返回值(除void类型)
public static int m(){
boolean flag = true; //编译器不负责运行程序,编译器只讲道理。
// 对于编译器来说,编译器只知道flag变量是boolean类型
// 编译器会认为flag有可能是false,有可能是true
if(flag){
// 编译器觉得:以下这行代码可能会执行,当然也可能不会执行
// 编译器为了确保程序不出现任何异常,所以编译器说:缺少返回语句
return 1;
}
}
//修改正确:
public static int m(){
boolean flag = true;
if(flag){
return 1;
}else{
return 0;
}
}
四、方法重载
- 同一个类中,方法名字相同,参数列表不同,则是方法重载。
- 参数列表的不同包括,参数个数不同,参数数据类型不同,参数顺序不同
- 方法的重载与方法的修饰符和返回值没有任何关系
//1、参数数量
add(int, int)
add(int, int, int)
//2、参数的数据类型
add(int, int)
add(int, float)
//3、参数的数据类型顺序
add(int, float)
add(float, int)
//4、像这种就不是重载,方法的返回类型不同将引发编译错误
double max(double num1, double num2)
int max(int num1, int num2)
五、 finalize() 方法
Java 允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做 finalize( ),它用来清除回收对象。
例如,你可以使用 finalize() 来确保一个对象打开的文件被关闭了。
在 finalize() 方法里,你必须指定在对象销毁时候要执行的操作。
public class FinalizationDemo {
public static void main(String[] args) {
Cake c1 = new Cake(1);
Cake c2 = new Cake(2);
Cake c3 = new Cake(3);
c2 = c3 = null;
System.gc(); //调用Java垃圾收集器
}
}
class Cake extends Object {
private int id;
public Cake(int id) {
this.id = id;
System.out.println("Cake Object " + id + "is created");
}
protected void finalize() throws java.lang.Throwable {
super.finalize();
System.out.println("Cake Object " + id + "is disposed");
}
}
/*
$ javac FinalizationDemo.java
$ java FinalizationDemo
Cake Object 1is created
Cake Object 2is created
Cake Object 3is created
Cake Object 3is disposed
Cake Object 2is disposed
*/
参考资料:菜鸟教程 - 学的不仅是技术,更是梦想! (runoob.com)
参考文献1:详解:Java的重载方法与示例_java重载,实现以下功能计算两个双精度数之和 要求通过实参调用这种方法,并输出求-CSDN博客