Thinking in Java 习题 - 第五章

Thinking in Java 习题 - 第五章

9月 21, 2013
Java

练习1 #

/*创建一个类,它包含一个未初始化的String引用。验证该引用被Java初始化成了null。*/
class Main {
    static String s;
    public static void main (String args[]){
        System.out.println("s="+s);
    }
}/*Output:
s=null
*/

练习2 #

/*创建一个类,它包含一个在定义时就被初始化了的String域,以及另一个通过构造器初始化的String域,这两种方式有何差异?*/
class Main {
    String s1 = "hello";
    String s2 ;
    public Main(String s){
        s2=s;
    }
    public static void main (String args[]){
        Main s = new Main("world");
        System.out.println(s.s1);
        System.out.println(s.s2);
    }
}/*Output:
hello
world
*/

练习3 #

/*创建一个带默认构造器(即无参构造器)的类,在构造器中打印一条消息。为这个类创建一个对象。*/
class Main {
    Main(){
        System.out.println("无参构造器");
    }
    public static void main (String args[]){
        new Main();
    }
}/*Output:
无参构造器
*/

练习4 #

/*为前一个练习中的类添加一个重载构造器,令其接受一个字符参数,并在构造器中把你自己的信息和接受的参数一起打印出来。*/
class Main {
    Main (String s){
        System.out.println(s);
        System.out.println("I'm your fans");
    }
    public static void main (String args[]){
        new Main("Hello Lady");
    }
}/*Output:
Hello Lady
I'm your fans
*/

练习5 #

/*创建一个名为Dog的类,它具有重载的bark()方法。此方法应根据不同的基本数据类型进行重载,并根据被调用的版本,
打印出不同类型的狗吠(barking)、咆哮(howling)等信息,编写main()来调用所有不同版本的方法。*/
class Dog {
    void bark(){
        System.out.println("barking");
    }
    void bark(int i){
        System.out.println("howling");
    }
    void bark(double i){
        System.out.println("wangwang");
    }
}
public class Main {
    public static void main (String args[]){
        Dog dog = new Dog();

        dog.bark();
        dog.bark(1);
        dog.bark(1.0);
    }
}/*Output:
barking
howling
wangwang
*/

练习6 #

/*修改前一个练习的程序,让两个重载方法各自接受两个类型的不同的参数,但二者顺序相反。验证其是否工作。*/
class Dog {
    public void bark(int i){
        System.out.println("barking");
    }
    public void bark(double i){
        System.out.println("howling");
    }
}
class Main {
    public static void main (String args[]){
        Dog dog = new Dog();
        dog.bark(1.0);
        dog.bark(1);
    }
}/*Output:
howling
barking
*/

练习7 #

/*创建一个没有构造器的类,并在main()中创建其对象,用以验证编译器是否真的自动加入了默认构造器。*/
class Main {
    public static void main(String args[]){
        Main main = new Main();
    }
}

练习8 #

/*编写具有两个方法的类,在第一个方法内调用第二个方法两次:第一次调用时不使用this关键字,第二次调用时使用this关键字--
* 这里只是为了验证它是起作用的,你不应该在实践中使用这种方法。*/
class Main {
    void test1(){
        System.out.println("调用了test1()方法");
    }
    void test2(){
        System.out.print("执行test1()方法:");
        test1();
        System.out.print("执行test2()方法:");
        this.test1();
    }
    public static void main (String args[]){
        Main main = new Main();
        main.test2();
    }
}/*Output:
执行test1()方法:调用了test1()方法
执行test2()方法:调用了test1()方法
*/

练习9 #

/*编写两个(重载)构造器的类,并在第一个构造器中,通过this调用第二个构造器。*/
class Main {
    Main(String s){
        System.out.println("s="+s);
    }
    Main(int i){
        this("i="+i);
    }
    public static void main (String args[]){
        new Main("hello world");
        new Main(521);
    }
}/*Output:
s=hello world
s=i=521
*/

练习10 #

/*编写具有finalize()方法的类,并在方法中打印消息,在main()中为该类创建一个对象,试解释这个程序的行为。*/
class Main {
	protected void finalize(){
		System.out.println("finalize()called");
	}
	public static void main (String args[]){
		new Main();
	}
}

练习11 #

//修改前一个练习的程序,让你的finalize()总会被调用。
class Main {
	protected void finalize(){
		System.out.println("finalize()called");
	}
	public static void main (String args[]){
		new Main();
		System.gc();
		System.runFinalization();
	}
}/*Output:
finalize()called
*/

练习12 #

/*编写名为Tank的类,此类的状态可以是“满的”或“空的”。其终结条件是:对象被清理时必须处于空状态。
 * 请编写finalize()以检验终结条件是否成立,在main()中测试Tank可能发生的几种使用方式。
 */

练习13 #

//验证前面段落中的语句
class Cup{
	Cup(int marker){
		System.out.println("Cup()");
	}
	void f(int marker){
		System.out.println("f("+marker+")");
	}
}
class Cups{
	static Cup cup1;
	static Cup cup2;
	static {
		cup1 = new Cup(1);
		cup2 = new Cup(2);
	}
	Cups(){
		System.out.println("Cups()");
	}
}
public class Main {
	public static void main (String args[]){
		System.out.println("main()");
		Cups.cup1.f(99);
	}
	static Cups cups1 = new Cups();
	static Cups cups2 = new Cups();
}/*Output:
Cup()
Cup()
Cups()
Cups()
main()
f(99)
*/

练习14 #

//编写一个类,拥有两个静态字符串域,其中一个在定义处初始化,另一个在静态块中初始化。
//现在,加入一个静态方法用以打印出两个字段值。请证明它们都会在被使用之前完成初始化动作。
class Main {
	static String s1 = "dog";
	static String s2;
	static {
		s2 = "kitty";
	}
	public static void main (String args[]){
		System.out.println("s1="+s1);
		System.out.println("s2="+s2);
	}
}/*Output:
s1=dog
s2=kitty
*/

练习15 #

//编写一个含有字符串域的类,并采用实例初始化方式进行初始化。
class Main {
	String s ;
	{
		s = "young for you";
	}
	public Main(){
		System.out.println("s="+s);
	}
	public static void main (String args[]){
		new Main();
	}
}/*Output:
s=young for you
*/

练习16 #

/*创建一个String对象数据,并为每一个元素都赋值一个String。用for循环来打印该数组。*/
class Main {
	public static void main(String args[]){
		String[] a = new String[4];
		a[0]="these";
		a[1]="are";
		a[2]="some";
		a[3]="String";
		for (int i=0;i<a.length;i++){
			System.out.println(a[i]);
		}
	}
}/*Output:
these
are
some
String
*/

练习17 #

//创建一个类,他有一个接受一个String参数的构造器。在构造阶段,打印该参数。创建一个该类的对象引用数组,
//但是不实际去创建对象赋值给该数组。当运行程序时,请注意来自对该构造器的调用中的初始化消息是否打印了出来。
class Test {
	Test(String s){
		System.out.println("s="+s);
	}
}
class Main {
	public static void main (String args[]){
		Test[] array1 = new Test[5];
	}
}//不知这样是否符合题意。。

练习18 #

//通过创建对象赋值给引用数组,从而完成前一个练习。
class Test{
	Test(String s){
		System.out.println("s="+s);
	}
}
class Main {
	public static void main (String args[]){
		Test[] array1 = new Test[5];
		for (int i=0;i<array1.length;i++){
			array1[i]=new Test(Integer.toString(i));
		}
	}
}/*Output:
s=0
s=1
s=2
s=3
s=4
*/

练习19 #

//写一个类,他接受一个可变参数的String数组,验证你可以向该方法传递一个用逗号分隔的String列表,或是一个String[]。
class Test{
	void printString(String... args){
		for (String s :args)
			System.out.println(s+" ");
	}
}
class Main {
	public static void main (String args[]){
		Test test = new Test();
		test.printString("nice","to","meet","you");
	}
}/*Output:
nice 
to 
meet 
you 
*/

练习20 #

//创建一个使用可变参数列表而不是普通的main()语法的main()。打印所产生的args数组的所有元素,并用各种不同数量的命令行参数来测试它。
class Main{
	static void printString(String... args){
		for (String s :args)
			System.out.print(s+" ");
		System.out.println();
	}
	public static void main (String... args){
		printString("nice","to","meet","you");
		printString(
			new String[] {"there","are","some","strings"}
		);
	}
}/*Output:
nice to meet you 
there are some strings 
*/

练习21 #

//创建一个enum,它包含纸币中最小面值的6种类型。通过values()循环并打印每一个值及其ordinal()
enum Money{
One,Five,Ten,Hun,Tho
}
class Main {
public static void main (String args[]){
for (Money s:Money.values())
System.out.println(s+",ordinal:"+s.ordinal());
}
}/*Output:
One,ordinal:0
Five,ordinal:1
Ten,ordinal:2
Hun,ordinal:3
Tho,ordinal:4
*/

练习22 #

//在前面的例子中,为enum写一个switch语句,对于每一个case,输出该特定货币的描述。
enum Money{
	One,Five,Ten,Twe,Fif
}
class Main {
	Money money;
	public void describe(){
		switch(money){
		case One:System.out.println("1");break;
		case Five:System.out.println("5");break;
		case Ten:System.out.println("10");break;
		case Twe:System.out.println("20");break;
		case Fif:System.out.println("50");break;
		default:
			break;
		}
	}
	public static void main (String args[]){
		for (Money s : Money.values())
			System.out.println(s+",ordinal:"+s.ordinal());
	}
}/*Output:
One,ordinal:0
Five,ordinal:1
Ten,ordinal:2
Twe,ordinal:3
Fif,ordinal:4
*/

第5章完

本文共 2323 字,上次修改于 Oct 14, 2024,以 CC 署名-非商业性使用-禁止演绎 4.0 国际 协议进行许可。

相关文章

» Thinking in Java 习题 - 第四章

» Thinking in Java 习题 - 第三章

» Thinking in Java 习题 - 第二章