《Java经典入门指南》课后习题Chapter4
1.至少列出类中可以包含的3种元素类型。
answer:属性、方法、构造方法、块以及内部类。
2.方法和构造方法之间有什么区别?
answer:方法(method) 定义一个类的对象(或实例)可以执行的动作。方法包括声明部分和主体部分。声明部分由返回值、方法名和参数列表组成,主体包含操作执行的代码。方法的返回类型可以是基本类型、对象或void(为空)。返回类型为void意味着该方法不返回任何东西。方法的声明部分也称方法签名(signature)。如果一个方法有多个参数,两个参数之间需要用逗号分隔。
每个类必须至少有一个构造方法(constructor),否则,将无法用类创建任何对象,它将毫无用处。因此,如果类没有明确定义构造方法,编译器将添加一个构造方法。构造方法用于创建对象,它虽然看起来像一个方法,但是与方法不同,构造方法没有返回值,甚至没有void。此外,构造方法必须与类名相同。构造方法没有参数时,叫无参构造。
3.类图中的类是否显示其构造方法?
answer:在UML类图中,类由一个矩形表示,矩形包含3部分:最上面的部分是类名,中间部分是字段列表,底部是方法列表,如果字段和方法不那么重要,也可以不列出。通常UML类图中的类不用显示其构造方法。
4.null是什么意思?
answer:空值。引用变量指向一个对象,但是有时引用变量没有值(它没有引用一个对象),这样的引用变量被称为具有null值。
5.关键字this有什么作用?
answer:可以在任何方法或构造方法中使用this关键字来引用当前对象。例如,如果有一个类级字段,它的名称与局部变量相同,就可以使用下面的语法来引用字段:this.field。一个常见的用法是在构造方法中接收用于初始化字段的值。例如:
public class Box {
int length;
int width;
int height;
public Box(int length, int width, int height) {
this.length = length;
this.width = width;
this.height = height;
}
6.当用“==”操作符比较个对象引用时,真正比较的是对象的内容吗?为什么?
answer:不是。因为基本类型变量按值传递,引用变量按引用传递。如果变量都是对象引用,==运算比较的不是值而是引用。【涉及自动装箱与拆箱知识,推荐阅读博主骆昊,java面试题全集上。】
7.什么是变量的作用域?
answer:变量作用域(scope)是指变量的可访问性。 第一条规则是:在块中定义的变量只能从块中访问。第二条规则是:在一个嵌套的块内部可以访问外部块中声明的变量(如下代码是有效的)。
for (int x = 0; x < 5; x++) {
for (int y = 0; y < 3; y++) {
System.out.println(x);
System.out.println(y);
}
}
8.请解释“超出作用域”的含义。
answer:指超出了作用域的范围,无法访问。
9.垃圾回收器如何确定要销毁哪些对象?
answer:Java提供了几个垃圾回收器(garbage collector),以此来销毁无用对象并释放内存。无用对象是指不再被引用的对象或其引用已经超出作用域的对象。
10.什么是方法重载?【什么是方法覆盖】
answer:在Java类中允许多个方法具有相同的名称,只要每个方法接收不同的参数类型集即可。这个特性叫做方法重载 换句话说,将下面两个方法放在同一个类中是合法的:
public String printString(String string)
public String printString(String string, int offset)
11.创建一个完全限定名为com.example.Tablet的类来模拟Android平板电脑。该类须包含3个私有字段:weight(int)、screenSize(float)和wifiOnly(boolean)。要访问这些字段,必须使用一对公共的访问方法和修改方法,即getWeight/setWeight、getScreenSize/setScreenSize和getWifiOnly/setWifiOnly。该类还必须有一个构造方法,即无参数的构造方法。
answer:
package com.example;//包名
public class Tablet {//类名
public Tablet(){
}//无参构造方法
private int weight=2;
private float screenSize=6f;
private boolean wifiOnly=false;//设置三个私有字段
public void setWeight(int weight) {
this.weight = weight;
}//公共的修改方法
public int getWeight() {
return weight;
}//公共的访问方法
public void setScreenSize(float screenSize) {
this.screenSize = screenSize;
}
public float getScreenSize() {
return screenSize;
}
public void setWifiOnly(boolean wifiOnly){
this.wifiOnly = wifiOnly;
}
public boolean getWifiOnly() {
return wifiOnly;
}
}
备注:完全限定名 = 包名 + 类型名。
12.在com.example.test包中定义一个TabletTest类并实例化Tablet类,实例化之后立即打印字段的值(通过调用它的get方法),然后重新设置字段值并再次打印它们。
answer:
代码1:在com.example.test包中定义一个TabletTest类并实例化Tablet类,实例化之后立即打印字段的值(通过调用它的get方法)
package com.example.test;
import com.example.Tablet;
public class TabletTest {
public static void main(String[] args) {
//实例化后立即打印值
Tablet ta=new Tablet();
System.out.println("重量为:"+ta.getWeight()+"屏幕尺寸为:"+ta.getScreenSize()+"wifi设置为:"+ta.getWifiOnly());
}
}
代码1运行结果为:重量为:2屏幕尺寸为:6.0wifi设置为:false
代码2:重新设置字段值并再次打印它们。
package com.example.test;
import com.example.Tablet;
public class TabletTest {
public static void main(String[] args) {
//实例化后立即打印值
Tablet ta=new Tablet();
ta.setWeight(6);//重新设置变量的值
ta.setScreenSize(18f);
ta.setWifiOnly(true);
System.out.println("重量为:"+ta.getWeight()+"屏幕尺寸为:"+ta.getScreenSize()+"wifi设置为:"+ta.getWifiOnly());//取出值并打印
}
}