小白学JAVA之六——方法与封装
一. 构造方法
- 构造方法名与类名完全相同并且没有返回值类型,连void都不许有。
- 默认构造方法:
- 构造方法名与类名完全相同并且没有返回值类型,连void都不许有。
- 若类中出现了构造方法,则编译器不再提供任何形式的构造方法。
- 使用new关键字创建对象时会自动调用构造方法实现成员变量初始化工作。
二. 方法重载
- 方法重载的主要形式体现在:参数的个数不同、参数的类型不同、参数的顺序不同,与返回值类型和形参变量名无关,但建议返回值类型最好相同。
- 方法重载的实际意义在于调用者只需要记住一个方法名就可以调用各种不同的版本,来实现各种不同的功能。如:java.io.PrintStream类中的println方法。
三. this关键字
- 若在构造方法中出现了this关键字,则代表当前正在构造的对象。
- 若在成员方法中出现了this关键字,则代表当前正在调用的对象。
- this关键字本质上就是当前类类型的引用变量。
- 使用方式:
- 当局部变量名与成员变量名相同时,在方法体中会优先使用局部变量(就近原则),若希望使用成员变量,则需要在成员变量的前面加上this.的前缀,明确要求该变量是成员变量。
- this关键字除了可以通过this.的方式调用成员变量和成员方法外,还可以作为方法的返回值。
- 在构造方法的第一行可以使用this()的方式来调用本类中的其它构造方法。
四. 方法的递归和调用
1.递归
递归本质就是指在方法体的内部直接或间接调用当前方法自身的形式。
- 注意事项:
- 使用递归必须有递归的规律以及退出条件。
- 使用递归必须使得问题简单化而不是复杂化。
- 若递归影响到程序的执行性能,则使用递推取代之。
2.案例
编程实现费式数列中第n项的数值并返回。
费式数列:1 1 2 3 5 8 13 21 ……
2.1费式数列的递归分析
费式数列的规律:前两项为0,后面的每一项都是前两项数字之和。
过程如下:
1.自定义成员方法show(int n)实现费式数列第n项并返回;
2.当n=1或者n=2时,结果是1;
3.否则结果是前两项的和。
代码如下:
/*
编程实现费氏数列的计算并打印 功能类/封装类
*/
public class Fee {
// 自定义成员方法实现费氏数列中第n项数值的计算并返回,n由参数指定
// 1 1 2 3 5 8 13 21 ....
int show(int n) { // int n = 5; int n = 4; int n = 3; int n = 2; int n = 1;
// 使用递归的方式进行计算
// 当n=1或者n=2时,结果是1
if(1 == n || 2 == n) {
return 1;
}
// 否则结果是前两项的和
return show(n-1) + show(n-2);
// show(5) => return show(4) + show(3); => 5
// show(4) => return show(3) + show(2); => 3
// show(3) => return show(2) + show(1); => 2
// show(2) => return 1; => 1
// show(1) => return 1; => 1
}
}
递归过程如图所示:
2.2费式数列的递推分析
当数据量过大时,递归明显要耗费更多的时间,严重影响程序性能,因此我们可以改进,采取递推的方式实现。
- 如图所示,我们先可以定义两个变量ia和ib,并将它们赋值为数列的前两项1。
- 当n=1或2时直接返回ib的值;
- 当n为其他值时,我们只需再定义一个变量ic让它存储ia和ib(也就是前两项)的和,然后再将ib的值赋值给ia成为ia的新值,ic的值赋值给ib成为ib的新值,这样我们也可以直接返回ib的值,因为此时ib的值就是前两项之和;
- 如此循环,执行n-2次,此时ib的值就是第n项费式数列的值。
代码如下:
/*
编程实现费氏数列的计算并打印 功能类/封装类
*/
public class Fee {
// 自定义成员方法实现费氏数列中第n项数值的计算并返回,n由参数指定
// 1 1 2 3 5 8 13 21 ....
int show(int n) { // int n = 5; int n = 4; int n = 3; int n = 2; int n = 1;
// 使用递推的方式进行计算
int ia = 1;
int ib = 1;
for(int i = 3; i <= n; i++) {
int ic = ia + ib;
ia = ib;
ib = ic;
}
return ib;
}
}