Java方法详解
方法简介
在前面几个章节中我们经常使用到 System.out.println(),那么它是什么呢?
- println() 是一个方法;
- System 是系统类;
- out 是标准输出对象;
这句话的用法是调用系统类 System 中的标准输出对象 out 中的方法 println()。
什么是方法
Java方法是语句的集合,它们在一起执行一个功能;
- 方法是解决一类问题的步骤的有序组合;
- 方法包含于类或对象中;
- 方法在程序中被创建,在其他地方被引用。
方法的优点
- 使程序变得更简短而清晰;
- 有利于程序维护;
- 可以提高程序开发的效率;
- 提高了代码的重用性。
方法的命名规则
- 方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。
- 下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。一个典型的模式是:test_,例如 testPop_emptyStack。
设计原则
方法的本意是功能块,就是实现某个功能的语句块的集合,设计方法时候要保持方法的原子性:一个方法只完成一个功能。
方法的定义
基本语法
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
方法包含一个方法头和一个方法体,下面是一个方法的所有部分:
-
**修饰符:**修饰符,这是可选的,告诉编译器如何调用该方法,定义了该方法的访问类型;
-
返回值类型 :方法可能会返回值,返回值类型 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,返回值类型是关键字void;
-
**方法名:**是方法的实际名称。方法名和参数表共同构成方法签名;
-
**参数类型:**参数像是一个占位符,当方法被调用时,传递值给参数,这个值被称为实参或变量;
-
**参数列表:**方法的参数类型、顺序和参数的个数,参数是可选的,方法可以不包含任何参数;
-
**方法体:**方法体包含具体的语句,定义该方法的功能。
注意: 在一些其它语言中方法指过程和函数。一个返回非void类型返回值的方法称为函数;一个返回void类型返回值的方法叫做过程。
方法调用
当程序调用一个方法时,程序的控制权交给了被调用的方法。==当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序。==Java 支持两种调用方法的方式,根据方法是否返回值来选择,Java是值传递,拷贝的方式。
- 当方法返回一个值的时候,方法调用通常被当做一个值;
- 如果方法返回值是void,方法调用一定是一条语句;
方法的重载
- 重载该就是方法名相同,但是参数值不同;
- Java编译器根据方法签名判断哪个方法应该被调用;
- 方法重载可以让程序更清晰易读,执行密切相关任务的方法应该使用相同的名字;
- 重载的方法必须拥有不同的参数列表,不能仅仅依据修饰符或者返回类型的不同来重载方法;
重载规则
- 方法名相同
- 参数列表不同,可以是类型,个数,顺序不同
- 返回值不作要求,但是仅仅返回值不同不足以构成重载
命令行传参
有时候希望运行一个程序时候再传递给它消息,这要靠传递命令行参数给main()函数实现,命令行参数是在执行程序时候紧跟在程序名字后面的信息,在命令行中执行时,需要把完整的包名写出来:
package com.lmc.method;
public class CommandLine {
public static void main(String[] args) {
for (int i=0;i< args.length;i++){
System.out.println("args{"+i+"]:"+args[i]);
}
}
}
可变参数
JDK 1.5 开始,Java支持传递同类型的可变参数给一个方法,方法的可变参数的声明如下所示:
typeName... parameterName
在方法声明中,在指定参数类型后加一个省略号(…) ,一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
不确定又多少个参数的时候使用,但是参数类型要相同
递归
方法自己调用自己,利用递归可以用简单的程序解决复杂问题,将一个大问题层层转化为一个与原问题相思的规模较小的问题来解决,只需用少量的程序就可以描述出解题过程所需要的多次计算,减少代码量,递归能够用有限的语句定义对象的无限集合。递归需要包含以下两个部分:
**递归头:**什么时候不调用自身方法;
**递归体:**什么时候需要调用自身方法;
例子:
package com.lmc.method;
public class Demo06 {
public static void main(String[] args) {
System.out.println(f(5));
}
public static int f(int n){
if (n==1){
return 1;
}else{
return n*f(n-1);
}
}
}
一般计算量比较小的功能可以使用递归,太大的功能,比如阶乘的数据过大,就不适合用递归,因为内存不够用。
finalize() 方法
Java 允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做 finalize( ),它用来清除回收对象。例如,可以使用 finalize() 来确保一个对象打开的文件被关闭了。在 finalize() 方法里,必须指定在对象销毁时候要执行的操作。
finalize() 一般格式是:
protected void finalize() {
// 在这里终结代码
}
关键字 protected 是一个限定符,它确保 finalize() 方法不会被该类以外的代码调用。当然,Java 的内存回收可以由 JVM 来自动完成,如果手动使用,则可以使用上面的方法。
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");
}
}