Java方法
在前面我们经常使用到System.out.println(),那么它是什么呢?
- println()是一个方法。
- System是系统类。
- out是标准输出对象。
这句话的用法是调用系统类System中的标准输出对象out中的方法println()。
那么什么是方法呢?
java方法是语句的集合,他们在一起执行一个功能。
- 方法是解决一类问题的步骤的有序组合。
- 方法包含于类或者对象中。
- 方法在程序中被创建,在其他地方被引用。
方法的优点
- 程序变得简短清晰。
- 有利于程序维护。
- 可以提高程序开发的效率。
- 提高了代码的重用性。
方法的命名规则
- 方法的名字的第一个单词应该以小写字母开始,后面的单词则用大写字母开头写,不使用连接符。
- 下划线可能出现在JUnit测试方法名称中用以分隔名称的逻辑组件。一个典型的模式是:test<MethodUnderTest>_<state>,例如testPop_emptyStack。
方法的定义
修饰符 返回值类型 方法名(参数类型 参数名){ 。。。 方法体 。。。 return 返回值; }
- 修饰符是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
- 方法可能会返回值。有些方法执行所需的操作,但没有返回值,这种情况下returnValueType是关键字void。
- 参数像是一个占位符。当方法被调用时,传递值给参数。这个值称为实参或者变量。参数是可选的,参数可以有多个,方法可以不包含任何参数。
方法调用
Java支持两种调用方法的方式,根据方法是否返回值来选择。
当程序调用一个方法时,程序的控制权交给了被调用的方法。当被调用方法的返回语句执行或者到达方法体闭括号时候交换控制权给程序。
当方法返回一个值的时候,方法调用通常被当作一个值。例如:
int larger=max(30,40);
如果方法返回值是void(可以有参数),方法调用一定是一条语句。例如,方法println()返回void。下面的调用是个语句:
public void ending(){ System.out.println("Thanking for view!") }
无法从静态上下文中引用非静态方法。
package pkg2020华南虎; /** * * @author yl */ public class TestMax { public static void main(String[] args) { int i = 20; int j = 23; int k = max(i, j); System.out.println("Max number is "+k+"."); } public static int max(int a, int b) { int result; if (a > b) { result = a; } else { result = b; } return result; } }
main方法是被JVM调用 的,除此之外,main方法和其他方法没什么区别。String【】表明参数是字符串数组。
void关键字
package pkg2020华南虎; /** * * @author yl */ public class TestVoidMethod { public static void main(String[] args) { printGrade(78.5); } static void printGrade(double score) { if (score > 90) { System.out.println(score + " is perfect."); } else if (score > 60) { System.out.println(score + " is OK."); } else { System.out.println(score + " is Flunk."); } } }
这里printGrade方法是一个void类型方法,它不返回值。
一个void方法的调用一定是一个语句。
通过值传递参数
调用一个方法的时候需要提供参数,你必须按照参数列表指定的顺序提供。
例如,下面的方法n次打印一个消息。
public static void nPrintln(String message,int n){ for(int i<0;i<n;i++){ System.out.println(message); } }
下面的例子演示按值传递的效果。
该程序创建一个方法,该方法用于交换两个变量。
package pkg2020华南虎; /** * * @author yl */ public class SwapValue { public static void main(String[] args) { int num1 = 1; int num2 = 5; swap(num1, num2); System.out.println("num1,num2:" + num1 + "," + num2); } static void swap(int a, int b) { int temp; temp = a; a = b; b = temp; } }
传递两个参数调用swap方法。但是,方法被调用后,实参的值并没有改变。
方法的重载
上面使用的max方法仅仅适用于int类型的数据,但是如果你想要的到两个浮点型数据的最大值呢?
解决方法是创建另一个有相同名字但是参数不同的方法,如下代码所示:
public static double max(double num1,double num2){ int result; if(num1>num2) result=num1; else result=num2; return result; }
如果你调用max方法时传递的是int型参数,则int型参数的max方法会被调用。
如果传递的是double型参数,则double类型的max方法体会被调用,这称为方法重载。
即一个类的两个方法拥有相同的名字,但是有不同的参数列表。Java编译器根据方法签名判断哪个方法应该被调用。方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。
变量作用域
命令行参数的使用
package pkg2020华南虎; /** * * @author yl */ public class CommandLine { public static void main(String[] args) { for(int i=0;i<args.length;i++){ System.out.println("args["+i+"]"+args[i]); } } }
构造方法
当一个对象被创建的时候,构造方法用来初始化该对象。构造方法和它所在类的名字相同,但构造方法没有返回值。
通常会使用构造方法给一个类的实例变量赋初值,或者执行其他必要的步骤来创建一个完整的对象。
不管你是否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个默认构造方法,默认构造方法的访问修改符和类的访问修改符相同(类为public,构造函数也为public;类改为protected,构造函数也改为protected)。一旦你定义了自己的构造方法,默认构造方法就会失效。
实例
class MyClass{ int x; MyClass(){//构造函数 x=10; } }
也可以像下面这样调用构造方法来初始化一个对象:
public class ConsDemo{ public static void main(String[]args){ MyClass t1=new MyClass(); MyClass t2=new MyClass(); System.out.println(t1.x+" "+t2.x); } }
大多时候需要一个有参数的构造方法。
实例
class MyClass{ int x; MyClass(int i){//构造函数 x=i; } }
public class ConsDemo{ public static void main(String args[]){ MyClass t1=new MyClass(10); MyClass t2=new MyClass(20); System.out.println(t1.x+" "+t2.x); } }
可变参数
JDK1.5开始,Java支持传递同类型的可变参数给一个方法。
实例
finalize()方法
Java允许定义这样的方法,它在对象被垃圾收集器(回收)之前调用,这个方法叫做finalize(),它用来清除回收对象。例如,你可以使用finalize()来确保一个对象打开的文件被关闭了。
在finalize()方法里,你必须指定在对象销毁时候要执行的操作。
finalize()一般格式是:
protected void finalize(){ //终结代码 }
protected限定符不可被继承,确保finalize()方法不会被该类以外的代码调用;void返回语句。
当然,Java的内存回收可以由JVM来自动完成。如果你手动使用,则可以使用上面的方法。