6.3 方法
1、理论基础
方法的定义:方法是解决一类问题的步骤的有序组合,其包含于类或对象中,它在程序中被创建,在其他地方被引用。
方法的优点:使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。
方法的命名规则:方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。下划线可能出现在 JUnit 测试方法名称中,用以分隔名称的逻辑组件。一个典型的模式是:test<MethodUnderTest>_<state>
。例如testPop_emptyStack
。
2、定义类的方法
类中除了定义成员变量,还可以定义方法,用于描述对象的行为,封装对象的功能。
定义类中的方法:
class 类名{
修饰词 返回值类型 方法名称([参数列表]){
方法体………… //方法写法不变
} //如果有其余代码的话下方写入其余代码
}
方法的所有部分:
修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
返回值类型:方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
方法体:方法体包含具体的语句,定义该方法的功能。
代码实例:
public static int age(int birthday){
...
}
代码实例:
public static int max(int num1, int num2) { //返回两个整型变量数据的较大值
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result; //有返回值方法中必须要写的。即return
} //此处只能返回int型
3、方法调用代码实例
public class TestMax {
public static void main(String[] args) { //主方法
int i = 5;
int j = 2;
int k = max(i, j); //调用
System.out.println( i + " 和 " + j + " 比较,最大值是:" + k);
} //输出结果:5和2比较,最大的是:5
public static int max(int num1, int num2) { //返回两个整数变量较大的值
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
//创建一个有相同名字但参数不同的方法。
//当传入int型参数时int型的max方法就会被调用,
//当传入double型参数时double型的max方法就会被调用。
//这就叫做方法重载。
//该代码段中的double,如果仅有此处不同,则不算是重载
public static double max(double num1, double num2) {
if (num1 > num2)
return num1;
else
return num2;
return result;
}
}
4、方法签名(方法重载)
方法的签名包含如下两个方面:方法名和参数列表
一个类中,不可以有两个方法的签名完全相同,即一个类中不可以有两个方法的方法名和参数列表都
完全相同。而如果一个类的两个方法只是方法名相同而参数列表不同,是可以的。
签名=方法名+参数列表(包括参数个数以及参数类型)
编译错误代码实例:
public class Cashier{
//完全一样,编译错误
public boolean pay(double money){
……
}
public boolean pay(double money){
……
}
}
编译正确代码实例:
public class Cashier{
//方法名相同参数列表不同,编译正确
public boolean pay(double money){
……
}
//方法名称相同,参数列表不同,称之为方法的重载
public boolean pay(String cardId,String cardPwd){
……
}
}
编译器在编译时会根据签名来绑定调用不同的方法,可以把重载的方法看成是完全不同的方法,只不过恰好方法名相同而已。
Aoo o = new Aoo(); //创建对象
o.say(); //调用第一个方法
o.say("wkj"); //调用第二个方法
o.say("wkj",36); //调用第三个方法
o.say(18,"wkj"); //调用第四个方法
class Aoo{ //方法重载调用自动匹配
void say(){} //第一个方法
void say(String name){} //第二个方法
void say(String name,int age){} //第三个方法
void say(int age,String name){} //第四个方法
//int say(){return 5;} //编译错误,和第一个方法相同
//void say(String name1){} //编译错误,和第二个方法相同
}
5、构造方法
主要功能是为类中的属性初始化。
一个对象被创建时,使用构造方法初始化该对象。构造方法和它所在类的名字相同,但没有返回值。通常使用构造方法给一个类的实例变量赋初值,或者执行其它必要的步骤来创建一个完整的对象。如果没有自定义构造方法,Java将提供一个默认构造方法,它把所有成员初始化为0。
构造方法是在类中定义的方法,不同于其他的方法,构造方法的定义有两点规则:
1、构造方法的名称必须与类名相同。
2、构造方法没有返回值,也不能写void。构造方法也可以重载。
[访问修饰符] 类名(){
构造方法体;
}
代码实例:
class MyClass { //一个简单的构造函数,少了返回值类型
int x;
MyClass(int i) { //以下是构造函数,方法名和类名相同
x = i;
}
}
6、this关键字
this关键字在方法体中,用于指向调用该方法的当前对象。即哪个对象调用方法,this指的就是哪个对象。严格来讲在方法中需要通过this关键字指明当前对象。
使用场景:
1、表示当前对象。
2、调用本类中的构造方法。
3、表示类中的属性和构造方法。
构造方法常用于实现对象成员变量的初始化:
class Cell{
int row;
int col;
public Cell (int row,int col){ //两个参数
this.row = row; //通过this关键字来区分成员变量和参数
this.col = col; //将col赋给当前类的
}
}
class TestCell{
public static void main(String args[]){
Cell c1 = new Cell(15,6); //传入参数
printCell(c1); //c1.row=15并c1.col=6
}
}
7、参数传递
参数传递一般有两种,一种是传值
,另一种是传地址
。传值是指在调用方法时,把参数的值直接传递给方法,传地址则是给方法提供参数的地址。
代码实例:基本数据类型的参数传递
public class ParamTransfer{
public int money;
void amethod(int i){
//注意对比形参i和money的值的变化
System.out.println("方法得到的i的值为:"+i); //输出:100
i = i * 5;
System.out.println("方法执行语句i=i*5后i的值为:"+i); //输出:500
System.out.println("money的值为:"+this.money); //输出:100
}
public static void main(String[] args){
ParamTransfer pt=new ParamTransfer();
pt.money=100;
pt.amethod(pt.money); //把money作为参数传递给方法
}
}
6.4 Java时间和日期
1、使用printf格式化日期
printf方法可以很轻松地格式化时间和日期。使用两个字母格式。它以%t
开头并且以下面表格中的一个字母结尾。
转换符 | 说明 | 示例 |
---|---|---|
c | 包括全部日期和时间信息 | 星期六 十月 27 14:21:20 CST 2007 |
F | “年-月-日” 格式 | 2007-10-27 |
D | “月/日/年” 格式 | 10/27/07 |
r | “HH:MM:SS PM” 格式(12时制) | 02:25:51 下午 |
T | “HH:MM:SS” 格式(24时制) | 14:28:16 |
R | “HH:MM” 格式(24时制) | 14:28 |
代码实例:
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
//初始化Date对象
Date date = new Date();
// c的使用。输出结果:全部日期和时间信息:星期一 九月 10 10:43:36 CST 2012
System.out.printf("全部日期和时间信息:%tc%n",date);
// f的使用。输出结果:年-月-日格式:2012-09-10
System.out.printf("年-月-日格式:%tF%n",date);
// d的使用。输出结果:月/日/年格式:09/10/12
System.out.printf("月/日/年格式:%tD%n",date);
// r的使用。输出结果:HH:MM:SS PM格式(12时制):10:43:36 上午
System.out.printf("HH:MM:SS PM格式(12时制):%tr%n",date);
// t的使用。输出结果:HH:MM:SS格式(24时制):10:43:36
System.out.printf("HH:MM:SS格式(24时制):%tT%n",date);
// R的使用。输出结果:HH:MM格式(24时制):10:43
System.out.printf("HH:MM格式(24时制):%tR",date);
}
}
2、Java休眠:sleep
sleep()使当前线程进入停滞状态,让出CPU的使用。
代码实例:
try {
System.out.println(new Date( ) + "\n");
Thread.sleep(1000*3); //休眠3秒
System.out.println(new Date( ) + "\n");
} catch (Exception e) {
System.out.println("Got an exception!");
}