Java语言程序设计 习题
6.4习题
使用方法的优点有哪些?
可以实现代码复用,将相似的多个解决方案统一写成1个方法
代码更简单高效,需要使用方法时只需要调用即可,不必重写代码
如何定义一个方法?如何调用一个方法?
定位方法声明修饰符、返回值类型、方法名、参数列表
调用方法写出方法名和对应的方法参数
如何使用条件操作符简化程序清单6-1中的max方法?
public class Main {
public static void main(String[] args) {
int a = 10;
int b = 5;
int z = max(a,b);
System.out.print(z);
}
public static int max (int num1, int num2) {
int result = (num1 > num2) ? num1 : num2;
return result;
}
}
下面的说法是否正确:对返回值类型为void的方法的调用总是单独的一条语句,但是对带返回值类型的方法的调用本身不能作为一条语句
第二句错误
main方法的返回值类型是什么?
void
如果在一个带返回值的方法中,不写return语句会发生什么错误?在返回值类型为void的方法中可以有return语句吗?下面方法中的return语句是否会导致语法错误?
public static void xMethod(double x,double y){
System.out.println(x + y);
return x + y;
}
语法错误
可以有,但只能有return;用于终止程序
会,void方法的return只能用于终止程序
给出形参、实参和方法签名的定义。
形参时方法头中,也就是参数列表中定义的参数
实参是实际调用形参的真实数据
方法签名=方法体+参数列表
写出下列方法的方法头(而不是方法体):
//给定销售额和提成率,计算销售提成
public static double sales(price, percent)
//给定月份和年份,打印该月的日历。
public static void canlendar(month, year)
//计算一个数的平方根。
public static double sqrt(double x)
//测试一个数是否是偶数,如果是,则返回true。
public static boolean even(int x)
//按指定次数打印某条消息。
public static void times(int x)
//给定贷款额、还款年数和年利率,计算月支付额。
public static double monthlyPayment(loan, year, rate)
//对于给定的小写字母,给出相应的大写字母。
public static char case(char x)
确定并更正下面程序中的错误:
public class Test {
public static method1(int n, m){
n+=m;
method2(3.4);
}
public static int method2(int n){
if (n > 0) return 1;
else if (n == 0) return 0;
else if (n < 0)return -1;
}
}
没有main入口方法
method1没有指明返回值
method1的参数需要独立定义
method1中调用method2,只能为int整数
method2中如果用了else-if,需要保证有else结尾,不然编译器会认为该方法会出现没有返回值的情况
根据1.9节提出的程序设计风格和文档指南,使用花括号的次行风格重新编排下面的程序。
public class Test
{
public static double method(double i,double j)
{
while (i < j)
{
j--;
}
return j;
}
}
6.5 习题
实参是如何传递给方法的?实参可以和形参同名吗?
通过将实参传递给形参进行传递
可以,二者被分配不同的储存空间,互不影响
确定并更正下面程序中的错误:
public class Main{
public static void main(String[]args){
nPrintln(5, "Welcome to Java!");
}
public static void nPrintln(String message, int n){
int n = 1;
for (int i=0; i<n; i++)
System.out.println(message);
}
}
第一,调用参数不匹配,调用时应该先写字符串,再写数字
第二,已经在方法头中定义了n,不需要在方法体中再次定义了
什么是值传递?给出下面程序的运行结果:
值传递就是把实参传递给形参的过程
public class Main{
public static void main(String[]args){
//形参与实参使用2个不同的储存空间
int max = 0;
max(1, 2, max);
System.out.println(max);
}
public static void max(int valuel, int value2, int max){
if (valuel > value2)
max = valuel;
else
max = value2;
}
}
0
public class Main{
public static void main(String[]args){
int i = 1;
while (i <= 6){
method1(i, 2);
i++;
}
}
public static void method1(int i,int num){
for (int j=1; j<=i; j++){
System.out.print(num + " ");
num *= 2;
}
System.out.println();
}
}
2
2 4
2 4 8
2 4 8 16
2 4 8 16 32
2 4 8 16 32 64
public class Main {
public static void main(String[]args) {
//Initialize times
int times =3;
System.out.println("Before the call," + "variable times is " + times);
//Invoke nPrintln and display times
nPrintln("Welcome to Java!", times);
System.out.println("After the call," + "variable times is " + times);
}
//Print the message n times
public static void nPrintln(String message, int n){
while (n > 0){
System.out.println("n = " + n);
System.out.println(message);
n--;
}
}
}
Before the call,variable times is 3
n = 3
Welcome to Java!
n = 2
Welcome to Java!
n = 1
Welcome to Java!
After the call,variable times is 3
public class Main{
public static void main(String[]args){
//循环会改变变量的值,按值传递不会
int i =0;
while (i <= 4){
methodl(i);
i++;
}
System.out.println("i is " + i);
}
public static void methodl(int i){
do{
if(i % 3 != 0)
System.out.print(i + "");
i--;
}
while (i >= 1);
System.out.println();
}
}
1
2 1
2 1
4 2 1
i is 5
在6.13的a中,分别给出调用max方法之前、刚进人max方法、max方法刚要返回之前以及 max方法返回之后堆栈的内容
调用main方法:
main方法所需要的空间:max = 0
调用max方法:
max方法所需要的空间:value1 = 1, value2 = 2, max = 0
main方法所需要的空间:max = 0
执行max方法:
max方法所需要的空间:value1 = 1, value2 = 2, max = 2
main方法所需要的空间:max = 0
结束max方法:
main方法所需要的空间:max = 0
结束main方法
栈为空
6.8习题
什么是方法重载?可以定义两个同名但参数类型不同的方法吗?可以在一个类中定义两个名称和参数列表相同,但返回值类型不同或修饰符不同的方法吗?
方法重载就是,在方法头中,只有参数列表不同的方法
可以,就是方法重载
不可以
下面的程序有什么错误?
public class Main{
public static void method(int x){
}
public static int method(int y){
return y;
}
}
方法重载必须返回值相同
给定两个方法定义:
public static double m(double x,double y)
public static double m(int x,double y)
给出对于下面的语句,两个方法中的哪个被调用?
a.double z =m(4, 5); //调用第二个(相比于第一个,第二个方法更精确)
b.double z = m(4, 5.4); //调用第二个
c.double z = m(4.5, 5.4); //调用第一个
6.9习题
什么是局部变量? 什么是局部变量的作用域?
在方法中定义的变量就是局部变量,局部变量的作用域从定义处开始,一直到包含该变量的块结束为止