- 浏览: 34471 次
- 性别:
- 来自: 北京
最新评论
文章列表
题目:修改前一个练习程序,让你的finalize方法总会被调用
分析:上一个例子中我们使用system.gc方法,但是偶尔会出现finalize方法不会被调用的情形。那是因为
System.gc(); //告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的 而System.runFinalization(); //强制调用已经失去引用的对象的finalize方法
所以如果用runFinalization方法的话,那finalize方法绝对会被调用。
public class test {
@Override
public void finaliz ...
题目:编写具有finalize方法的类,并在方法中打印消息。在main中为该类创建一个对象。试着解释这个程序的行为。
分析:大多数时候我们不需要编写finalize方法,因为jvm垃圾回收器已经帮我们做好了一切,我们什么时候需要它呢?如果我们的对象不是new获得的内存空间,或者调用了naive方法,在方法中用其他方式获得内存空间,我们需要finalize方法告诉编译器如何释放内存空间。
它的工作流程如下:一旦垃圾回收器准备释放对象的空间,先调用其finalize方法,在下一次垃圾回收动作发生的时候,才会真正的回收。
我们需要注意的是fianlize方法并不是析构方法,它可能永远不会被调 ...
题目:编写具有两个构造器的类,并且在第一个构造器中调用第二个构造器。
分析:在类中通过this调用构造器有很多需要遵守的规则
不能调用两个构造器
必须将构造器调用置于方法的起始位置
禁止在除构造器的其他地方调用构造器
public class test {
public test(){this("default");}
public test(String s){System.out.println(s);}
public static void main(String[] args) {
test t=new test();
}
} ...
也许你会有疑问super关键字是如何暗箱操作的呢?
这个问题涉及到java虚拟机的一些机制了,我们知道java是支持多态的,那是因为具体到指令集上,是invokevirtual指令支持多态的!而invokespecial是不支持多态的!
我们通过使用super关键字发出方法调用时,指令就被编译器编译成了invokespecial指令(发出方法调用的对象依然是this指向的实例)
例子:
public class Parent {
public void test(){
}
public void test1() {
test();
}
}
public ...
题目:编写具有两个方法的类,在第一个方法内调用第二个方法两次:第一次调用不使用this关键字,第二次使用this关键字(验证this关键字起作用)
分析:为什么可以使用this关键字呢?那是因为编译器的“暗箱操作”,举例来说:
假设我们有Banana这样一个类,里面有peel这样一个方法,我们这样创建实例并且使用它。
Banana a=new Banana();
a.peel(1);
但是编译器真实的做了什么呢?
Banana.peel(a,1);
它暗自把操作对象的引用作为第一个参数传给了方法peel。并且设了一个专门的关键字this,用this表示调用这个方法的那 ...
(1)创建一个带默认构造器的类,在构造器中打印一条消息。
public class test {
public test(){
System.out.println("i am constructor");
}
public static void main(String[] args) {
test t=new test();
}
}
(2)修改1中代码,添加重载构造器,另其接受一个字符串参数,并在构造器中把参数和消息一起打印
public class test {
public test(){
System.ou ...
题目:(1)创建一个类,它包含一个未初始化的String引用。验证该引用被java初始化为null
(2)创建一个类,它包含一个在定义时就被初始化的String,以及一个通过构造器初始化的String域,这两种方法有什么差异?
(1)
public class test {
String str;
public static void main(String[] args) {
test t=new test();
System.out.println(t.str);
System.out.println(t.st ...
题目:吸血鬼数字是指位数为偶数的数字,可以由一堆数字,可以由一对数字相乘得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个零结尾的数字是不允许的,例如,下列数字都是吸血鬼数字:
1260=21*60
1827=21*87
2187=27*81
写一个程序,找出所有的4位数的吸血鬼数字。
import java.util.Arrays;
public class test {
public static void main(String[] args) {
for(int i = 10; i &l ...
题目:一个斐波那契数列是由数字1、1、2、3、5、8、13、21、34等组成的,其中每一个数字(从第三个开始)都是前两个数字的和。创建一个方法,接受一个整数参数,并显示从第一个元素开始总共由该参数指定个数所构成的所有斐波那契数字。
public class test {
public static int f(int x){
if(x==1|x==2)
return 1;
return f(x-1)+f(x-2);
}
public static void main(String[] args) {
if(args.length==0)
...
题目:写一个switch语句,为每一个case打印一个消息。然后把这个switch放到for循环来测试每个case。先让每个case后面都有break,测试一下,再删掉break测试一下。
分析:case后面必须跟break否则会出现顺序输出的后果。
public class test {
public static void main(String[] args) {
for(int i=1;i<=100;i++){
switch(i%3){
case 0:
System.out.println(i+"%3=&qu ...
练习1:写一个程序,打印1到100的值
for(int i=1;i<=100;i++){
System.out.println(i);
}
练习2:写一个程序,产生25个int类型的随机数,对于每一个随机数,使用if-else语句来对其分类为大于,小于或等于紧随它而生成的的值。
分析:因为涉及两个值,需要维护两个域。
import java.util.*;
public class test {
public static void main(String[] args) {
Random rand1 = new Random();
Random ...
题目:编写一个接受两个字符串参数的方法,用各种布尔值的比较关系来比较这两个字符串,然后把结果打印出来。
解析:有很多种可能,看例子先
import java.util.*;
public class test {
static void f(boolean b) {if(b == true) System.out.println(true);
else System.out.println(false);}
static void stringTest(String s, String t) {
f(s == t);
f(s. ...
题目:编写一个方法,它以二进制形式显示char类型的值。使用多个不同的字符来展示它。
import java.util.*;
public class test {
public static int transform(int a )
{
int temp,result;
if(a==1)
return 1;
temp=a/2;
result=(a%2)+transform(temp)*10;
return result;
}
public static void main ...
题目:(1)以一个最高有效位为1的二进制数字开始,用有符号右移操作符对其进行右移,直至所有的二进制位都被移出为止。
(2)亿一个所有位都是1的二进制数字开始,先左移它,然后用无符号右移操作对其右移,直至所有的二进制位被移出为止。
分析:java移位操作有有符号移位和无符号移位两种,这样来记,左移位<<低位补零,有符号右移位>>高位插符号位,无符号右移位>>>高位补零
import java.util.*;
public class test {
public static void main(String[] args) ...
题目:编写一个具有两个常量值得程序,一个具有交替的二进制位1和0,其中最低有效位为0.另一个也具有交替二进制位1和0,但是其最低有效位为1.
取这两个值,用按位操作符以所有可能的方式结合他们。
分析:
使用十六进制常量来表示最合适,也最简单。
import java.util.*;
public class test {
public static void main(String[] args) {
Integer a=0xaaaa;
Integer b=0x5555;
System.out.println("a=& ...