Java 方法
不知各位看官老爷想过没有 在我们编写System.out.println()
时,各个部分都代表什么意思,那么我们在这里以这个为实例先细细探究一下.
- println()是一个方法
- System 是系统类
- out 是标准的输出对象
那么这句代码的含义就是系统类System中的标准输出对象out中的println()方法
那么什么是方法呢?
Java方法是语句的集合,他们在一起执行一个功能.
- 方法是解决一类问题的步骤的有序组合
- 方法包含在类和对象中间
- 方法在程序中被创建,在其他地方引用
方法的优点
- 使得程序变得简洁而简短
- 有利于程序的保护
- 可以提高程序开发的效率
- 提高了代码的重用性
方法的命名规则
- 方法的第一单词应该以小写字母作为开头,后面的单词用大写字母开头写,不用使用连接符,例如
strDate
- 下划线可能出现在Junit测试方法中以分隔名称的组件,一个典型的模式是:
testPop_emptyStack
.
方法的定义
对于一般的方法而言:其语法格式如下
修饰符 返回值类型 方法名(参数类型 参数名称) {
...
方法体
...
return 返回值;
}
方法包含一个方法头和方法体,下面是一个方法的所有部分:
- **修饰符:**修饰符,这是可选的,告诉编译器如何调用该方法,定义了 该方法的访问类型
- **返回值类型:**方法可能会有返回值.
returnValueType
是方法返回值的数据类型.有一些方法有必须执行的操作,但是没有返回值,在这种情况下面,returnValueType
是关键字void
- **方法名:**是方法的实际名称,方法名称和参数表共同构成方法签名
- **参数类型:**参数像是一个占位符,当方法被调用时,传递值给参数,这个值被称为实参或者变量,参数列表是指方法的参数类型,顺序和参数的个数,参数是可选的,方法可以不包含任何参数
- **方法体:**方法体包含具体的语句,定义该方法的功能
实例
@Test
public static int main21(int num1, int num2) {
/*定义返回接口*/
int result;
/*判断逻辑*/
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
三元运算符
@Test
public static int main22(int num3, int num4) {
/*如果num3>num4 那么返回结果为num3 否则返回num4*/
return num3 > num4 ? num3 : num4;
}
方法调用
Java 支持俩种调用方法的方式,根据方法是否返回值来判断.
当程序调用一个方法时候,控制权交给了被调用返回语句执行或者运行到方法体结尾的时候将控制权还给程序.
当方法返回值是void,方法调用一定是一条语句,例如,方法println返回void.
void关键字
实例
@Test
public void main18() throws ParseException {
/*设置格式*/
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
/*定义时间字符串*/
String time = "2021-11-11";
/*设置时间字符串*/
String input = time.length() == 0 ? "null" : time;
Date date;
/*使用parse方法将字符串*/
date = simpleDateFormat.parse(input);
System.out.println(date);
}
通过值传递参数
调用一个方法的时候需要提供参数,你必须按照参数指定的顺序提供
public static String dateStr(Date date, String pattern) {
if (null == date) {
return "";
}
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
return sdf.format(date);
}
在创建一个用例
@Test
public static int main23() {
int num1 = 1;
int num2 = 2;
System.out.println("交换前 num1 的值为:" + num1 + " , num2的值为: " + num2);
/*调用exchange方法*/
exchange(num1, num2);
System.out.println("交换后 num1 的值为:" + num1 + " , num2的值为: " + num2);
return 0;
}
/*交换方法*/
private static int exchange(int n, int m) {
System.out.println("\t 进入exchange 方法");
System.out.println("\t\t交换前 num1 的值为:" + n + " , num2的值为: " + m);
/*交换 n 和 m 的值*/
int temp = n;
n = m;
m = temp;
System.out.println("\t\t交换后 num1 的值为:" + n + " , num2的值为: " + m);
return exchange(n, m);
}
方法的重载
上面使用的 exchange
方法仅仅适用于 int 类型的 但如果在开发过程中我想要得到俩个浮点类型的最大数据捏?
那么在解决这个最好,最快速的方法就是将函数赋值一遍,将参数列表的参数类型修改一下
- 如果你调用的是
exchange
方法传递的是int类型参数,那么相应的这个方法就会被调用 - 如果传递的是double型参数,则double类型的max方法体会被调用,这叫做方法重载;
- 就是说一个类的俩个方法拥有相同的名字,但是有不同的参数列表,
- Java编译器根据方法签名判断那个方法应该被调用
- 方法重载可以让程序更加清晰易读
- 重载方法必须拥有不同的参数列表,你不能仅仅依据修饰符或者返回类型的不同来重载方法
变量作用域
- 变量的范围是程序中该变量可以被引用的部分.
- 方法内定义的变量称为局部变量
- 局部变量的作用范围是从声明开始,知道包含他的块结束
- 局部变量必须使用说明才可以使用
- 方法的参数范围涵盖 整个方法,参数实际上是一个局部变量
- for循环的初始化部分申明的变量,其作用域在整个循环
构造方法
- 当一个对象被创建的时候,构造方法用来初始化该对象,构造方法和他所在类的名字相同,但是构造方法没有返回值
- 通常会使用构造方法给一个类的变量实例赋初始值,或者执行其他必要步骤来创建一个完整的对象
- 不管你是否自定义构造方法,所有类都有构造方法,因为Java自动提供了一个默认构造方法,默认构造方法的访问修饰符和类的访问修饰符相同
- 一旦自己定义了自己的构造方法,默认的构造方法就会失效
实例
public class constructionMethod {
int x;
/*构造函数*/
constructionMethod(){
x = 10;
}
}
可变参数
JDK1,5开始,Java支持传递同类型可变参数给一个方法
可变参数的声明如下所示
typeName... parameterName
在方法声明种,在指定参数类型后面加一个省略号
一个方法中,只能指定一个可变参数,他必须是方法的最后一个参数,任何普通参数都必须在他之前声明
实例
package com.jdx.method;
/**
* Created by JDX on 2021/12/3 14:09
*/
public class varargs {
public static void main(String[] args) {
/*调用可变参数*/
printMax(34.12, 15, 16);
printMax(new double[]{1, 2, 3});
}
/*定义可变参数*/
public static void printMax(double... numbers) {
if (numbers.length == 0) {
System.out.println("没有参数通过");
}
double result = numbers[0];
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] > result) {
result = numbers[i];
}
}
System.out.println("最大参数为:" + result);
}
}
运行结果为:
最大参数为:34.12
最大参数为:3.0
finalize() 方法
java允许定义这样的方法,他在对象被垃圾收集器(回收)之前调用,这个方法叫做finalize();它用来清除回收对象
在 finalize() 的方法中,你必须指定在对象销毁的时候要执行的操作
finaliza() 方法的格式如下:
protected void finalize()
{
// 在这里终结代码
}
关键字 protected
,他确保 finalize() 方法不会被该类以外的代码调用
当然,java的内存回收可以由JVM来自动完成,如果你手动使用,那么就调用上面的方法
实例
package com.jdx.method;
/**
* Created by JDX on 2021/12/3 15:19
*/
public class Finalization {
public static void main(String[] args) {
Cake cake1 = new Cake(1);
Cake cake2 = new Cake(2);
Cake cake3 = new Cake(2);
cake1 = cake2 = null;
System.gc();
}
static class Cake extends Object {
private int id;
public Cake(int id) {
System.out.println("Cake" + id + " is create");
}
@Override
protected void finalize() throws java.lang.Throwable {
super.finalize();
System.out.println("Cake" + id + " is disposed");
}
}
}
输出结果如下:
Cake1 is create
Cake2 is create
Cake2 is create
Cake0 is disposed
Cake0 is disposed
这节内容较多,但是也要注意联系总结!!!