1.重载方法
上一篇文章用到的max方法只能用于int型数据类型,但是如果需要决定两个浮点数中哪个较大,解决方法是创建另一个方法名相同但参数不同的方法,代码如下:
public static double max(double num1, double num2){
if(num1>num2)
return num1;
else
return num2;
}
如果调用带int型参数的max方法,就将调用需要int型的max方法,如果需要double型参数的max方法,就将调用需要double型参数的max方法,这称为方法重载,在一个类中有两个方法,它们具有相同的名字,但有不同的参数列表,Java编译器根据方法签名决定使用哪个方法。
下面我们用一个例子来说明,我们想写一个程序,程序中创建三个方法,第一个方法为求最大整数,第二个方法为求最大双精度数,第三个方法求三个双精度数中的最大值,这三个方法都被命名为max,程序清单如下:
package testmax;
/**
*
* @author john
*/
public class TestMax {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
System.out.println("The maxium between 3 and 4 is"+max(3,4));
System.out.println("The maxium between 3.0 and 5.4 is"+max(3.0,5.4));
System.out.println("The maxium between 3.0 , 5.4 and 10.14 is"+max(3.0,5.4,10.14));
}
public static int max(int num1,int num2){
if(num1>num2)
return num1;
else
return num2;
}
public static double max(double num1,double num2){
if(num1>num2)
return num1;
else
return num2;
}
public static double max(double num1,double num2,double num3){
return max(max(num1,num2),num3);
}
}
当调用max(3,4)时,调用的是两个整数中较大值的max方法,当调用max(3.0,4.5)时,调用的是求两个双精度数中较大值的max方法。当调用max(3.0,5.4,10.14)时,调用的是求三个双精度数中最大值的max方法。
我们同样也可以调用像max(3,2.5)这样带一个int值和一个double值得max方法,那就是调用求两个double数中较大值的方法,实参值2自动转换为double值,然后传递给这个方法。
我们可能都会有一些疑惑,那就是为什么调用max(3,4)时不会使用max(double,double)呢,其实max(double,double)和max(int,int)都是可能的匹配,在调用方法时,Java编译器寻找最精确匹配的方法,因为int更为精确,所以调用的是max(int,int),如果两个方法谁也不比谁精确,就会出现歧义,导致编译错误。
2.变量的作用域
变量的作用域是指变量可以在程序中引用的范围,在方法中定义的变量称为局部变量。局部变量的作用域从声明变量的地方开始,直到包含该变量的块结束为止。局部变量都必须在使用之前进行声明和赋值,下面举一个例子:
public static void method(){
int x=1;
int y=1;
for(int i=1;i<10;i++){
x=x+i;
}
for(int i=1;i<10;i++){
y=y+i;
}
}
由这个例子我们可以看到,我们可以在一个方法的不同块里声明同名的局部变量,但是不能在嵌套块中或同一块中两次声明一个局部变量。下面这种就是错误的编程写法
public static void method2(){
int x=1;
int sum=0;
for(int x=1;x<10;x++){
sum=sum+x;
}
我们再举一个错误的例子:
for(int i=0;i<10;i++){
}
System.out.println("i");
这个程序的错误在于,我们不要在块内声明变量,然后企图在块外使用它,因为i没有在for循环之外定义,所以最后一条语句就会产生一个语法错误。
3.Math数学类
Math类包含完成基本数学函数所需的方法,我们在之前的学习中已经
使用过方法pow(a,b),也使用过方法Math.random,我们这次会介绍Math类中其他的方法,这些方法分为三类:三角函数方法,指数函数方法和服务方法,除了这些方法之外,Math类还提供了两个很有用的double型常量,PI和E(自然对数的底),可以在任意程序中用Math.PI和Math.E的形式来使用这两个常量。
(1)三角函数方法
Math类包含下面的三角函数方法:
public static double sin(double radians)
public static double cos(double radians)
public static double tan(double radians)
public static double toRadians(double degree)
public static double toDegrees(double radians)
public static double asin(double a)
public static double acos(double a)
public static double atan(double radians)
sin,cos,tan的参数都是以弧度为单位的角,asin,acos,atan的返回值是在-Π/2到Π/2之间的一个弧度值。
例如:
Math.toDegrees(Math.PI/2) returns 90.0
Math.toRadians(30) returns Π/6
Math.sin(0) returns 0.0
Math.sin(Math.toRadians(270)) returns -1.0
Math.sin(Math.PI/6) returns 0.5
Math.sin(Math.PI/2) returns 1.0
Math.cos(0) returns 1.0
Math.asin(0.5) returns Π/6
(2)指数函数方法
Math类中有五个与指数函数有关的方法:
public static double exp(double x) 返回e的x次幂
public static double log(double x) 返回ln(x)
public static double log10(double x) 返回log10(x)
public static double pow(double a,double b) 返回a的b次幂
public static double sqrt(double x) 返回根号x
3.min max和abs方法
重载min和max方法返回两个数的最小值和最大值,重载abs返回一个数的绝对值。Math.abs(-2) returns 2
4.random方法
我们已经使用过random方法,生成大于等于0.0小于1.0的double型随机数,我们可以用它编写简单的表达式,生成任意范围的随机数。
int (Math.random()*10) 返回0到9之间的随机数。
50+ (int)(Math.random()*10) 返回50到59之间的随机数。
a + (int)(Math.random()*b) 返回一个a到a+b之间但不包括a+b的随机数
5.取整方法
public static double ceil(double x) 返回比这个数大的最近的整数
public static double floor(double x) 返回比这个小的最近的整数
public static double rint(double x) 返回其值最接近参数并且是整数的double值。如果两个整数的double值都同样接近,那么结果取偶数