Java专项训练
本文仅供个人学习使用,无任何商业行为,题目内容摘自其他网站,请勿进行商业活动
题目预览
1.下列程序执行后结果为( )
class A
{
public int func1(int a, int b)
{
return a - b;
}
}
class B extends A
{
public int func1(int a, int b)
{
return a + b;
}
}
public class ChildClass
{
public static void main(String[] args)
{
A a = new B();
B b = new B();
System.out.println("Result=" + a.func1(100, 50));
System.out.println("Result=" + b.func1(100, 50));
}
}
2.请问输出的结果是:
class A
{
public A(String str)
{
}
}
public class Test
{
public static void main(String[] args)
{
A classa=new A("he");
A classb=new A("he");
System.out.println(classa==classb);
}
}
3.下面的代码运行的结果是:
class B extends Object
{
static
{
System.out.println("Load B");
}
public B()
{
System.out.println("Create B");
}
}
class A extends B
{
static
{
System.out.println("Load A");
}
public A()
{
System.out.println("Create A");
}
}
public class Testclass
{
public static void main(String[] args)
{
new A();
}
}
4.Thread. sleep()是否会抛出checked exception?
5.下列说法正确的是:
A. 在类方法中可用this来调用本类的类方法
B. 在类方法中调用本类的类方法可直接调用
C. 在类方法中只能调用本类的类方法
D. 在类方法中绝对不能调用实例方法
6.以下代码结果是:
public class foo
{
public static void main(String sgf[])
{
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
operate(a,b);
System.out.println(a+"."+b);
}
static void operate(StringBuffer x,StringBuffer y)
{
x.append(y);
y=x;
}
}
7.以下代码的输出结果是:
public class B
{
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("构造块");
}
static
{
System.out.println("静态块");
}
public static void main(String[] args)
{
B t = new B();
}
}
8.执行如下程序代码后,
char chr = 127;
int sum = 200;
chr += 1;
sum += chr;
sum的值是()
备注:同时考虑c/c++和Java的情况的话
答案解析
1.下列程序执行后结果为( )
class A
{
public int func1(int a, int b)
{
return a - b;
}
}
class B extends A
{
public int func1(int a, int b)
{
return a + b;
}
}
public class ChildClass
{
public static void main(String[] args)
{
A a = new B();
B b = new B();
System.out.println("Result=" + a.func1(100, 50));
System.out.println("Result=" + b.func1(100, 50));
}
}
答案:
Result=150
Result=150
解析:
涉及转型的题目,分为向上或者向下转型。不论向上或者向下转型,都是一句话,“编译看左边,运行看右边”。也就是编译时候,会看左边引用类型是否能正确编译通过,运行的时候是调用右边的对象的方法。
就本题来说,编译时候会发现左边满足条件所以编译通过,运行时候又会调用右边也就是 class B 的方法,所以答案都是150。
2.请问输出的结果是:
class A
{
public A(String str)
{
}
}
public class Test
{
public static void main(String[] args)
{
A classa=new A("he");
A classb=new A("he");
System.out.println(classa==classb);
}
}
答案:
false
解析:
对于非字符串变量而言,equals和 == 比较的是地址(未被重写的情况下)
对于字符串变量而言,equals比较的是内容,而 == 比较地址
object类 —— 众类鼻祖
1.取得对象信息:toString():对象输出时,会默认调用Object类的toString()方法,将对象信息变为字符串返回。
2.对象相等判断方法:equals():两个对象进行比较时,实际上是比较两个对象的地址值(从程序看出两个对象内容完全相等,但是结果是不相等的,这是因为classa与classb的内容分别在不同的内存空间指向了不同的内存地址)。所以要对equals()进行覆写,判断equals()方法里面的Object类对象是否与调用equals()的类是同一个类的实例(用instanceof判断),如果是,则进行向下转型,然后再调用String类中的equals方法对属性进行比较。
3.对象签名:hashCode():Object类有两种方法来推断对象的标识:equals()和hashCode()。如果根据equals()方法判断两个对象是相等的,那么对这两个对象中的每一个调用hashCode()方法都必然生成相同的整数结果。但是反过来,如果两个hashCode()返回的结果相等,两个对象的equals()方法却不一定相等。在默认情况下equals()方法用来比较两个对象的地址值,而原始的hashCode()方法用来返回其所在对象的物理地址.
3.下面的代码运行的结果是:
class B extends Object
{
static
{
System.out.println("Load B");
}
public B()
{
System.out.println("Create B");
}
}
class A extends B
{
static
{
System.out.println("Load A");
}
public A()
{
System.out.println("Create A");
}
}
public class Testclass
{
public static void main(String[] args)
{
new A();
}
}
答案:
Load B
Load A
Create B
Create A
解析:
初始化块在构造器执行之前执行,类初始化阶段先执行最顶层父类的静态初始化块,依次向下执行,最后执行当前类的静态初始化块;创建对象时,先调用顶层父类的构造方法,依次向下执行,最后调用本类的构造方法。
优先级:
父类静态初始化块 > 子类静态初始化块 > 父类初始化块 > 父类构造方法 > 本类初始化块 > 本类构造方法
同级按顺序运行
4.Thread. sleep()是否会抛出checked exception?
答案:
会
解析:
Thread.sleep() 和 Object.wait(),都可以抛出 InterruptedException。这个异常是不能忽略的,因为它是一个检查异常(checked exception)
Checked Exception:指的是编译时异常,该类异常需要本函数必须处理的,用try和catch处理,或者用throws抛出异常,然后交给调用者去处理异常。
Runtime Exception:指的是运行时异常,该类异常不必须本函数必须处理,当然也可以处理。
Thread.sleep()抛出的InterruptException属于Checked Exception;
IllegalArgumentException属于Runtime Exception;
5.下列说法正确的是:
A. 在类方法中可用this来调用本类的类方法
B. 在类方法中调用本类的类方法可直接调用
C. 在类方法中只能调用本类的类方法
D. 在类方法中绝对不能调用实例方法
答案:
B
解析:
在类方法中调用本类的类方法可直接调用。 实例方法也叫做对象方法。 类方法是属于整个类的,而实例方法是属于类的某个对象的。 由于类方法是属于整个类的,并不属于类的哪个对象,所以类方法的方法体中不能有与类的对象有关的内容。
类方法体有如下限制:
(1) 类方法中不能引用对象变量;
(2) 类方法中不能调用类的对象方法;
(3) 在类方法中不能使用super、this关键字。
(4)类方法不能被覆盖。 如果违反这些限制,就会导致程序编译错误。
与类方法相比,对象方法几乎没有什么限制:
(1) 对象方法中可以引用对象变量,也可以引用类变量;
(2) 对象方法中可以调用类方法;
(3) 对象方法中可以使用super、this关键字。
类中的方法分为:实例方法和类方法
方法类型前面不加关键字static修饰的是实例方法
加static关键字修饰的是类方法(也称"静态方法",沿用C++的叫法)
6.以下代码结果是:
public class foo
{
public static void main(String sgf[])
{
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
operate(a,b);
System.out.println(a+"."+b);
}
static void operate(StringBuffer x,StringBuffer y)
{
x.append(y);
y=x;
}
}
答案:
AB.B
解析:
对于append函数而言,修改的是x引用所指向的对象本身,所以无论是a还是x,其引用没有变化,但指向的值都变成了AB。然而对于y而言,其修改的是引用的值,也就是y这个形参(局部变量)的引用指向了AB,但对于实参b而言,其指向和指向对象的值都没有变动,所以仍然是B
7.以下代码的输出结果是:
public class B
{
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("构造块");
}
static
{
System.out.println("静态块");
}
public static void main(String[] args)
{
B t = new B();
}
}
答案:
构造块
构造块
静态块
构造块
解析:
同级代码从上往下运行,所有运行顺序是1,2,3,4.
当运行1时,静态变量t1被初始化,而初始化过程运行构造块,输出"构造块"
当运行2时,静态变量t2被初始化,而初始化过程运行构造块,输出"构造块"
当运行3时,直接运行静态块,输出"静态块"
当运行4时,实例变量被初始化,而初始化过程运行构造块,输出"构造块"
示意图
具体分析:
这段代码涉及了类的实例化、构造块(实例初始化块)和静态块(静态初始化块)。
静态成员变量初始化:
public static B t1 = new B();
public static B t2 = new B();
在类加载时,静态成员变量 t1 和 t2 被初始化。由于它们是静态成员,它们在类加载阶段就会被初始化。此时会执行类的构造方法,因此会执行构造块和静态块。
静态块(静态初始化块):
static
{
System.out.println("静态块");
}
在类加载时,静态块会被执行。因此,在创建类的第一个实例之前,就会输出 “静态块”。
构造块(实例初始化块):
{
System.out.println("构造块");
}
构造块是在对象实例化时执行的,每次创建对象都会执行。在这个例子中,由于每次创建对象都会执行构造块,所以在每个对象实例化时都会输出"构造块"。
main 方法:
public static void main(String[] args)
{
B t = new B();
}
在 main 方法中创建了一个类的对象 t,这会触发构造方法的执行。 因为在类加载时已经初始化了静态变量,所以不会再次触发静态块的执行。每次创建对象时都会执行构造块,所以会输出 “构造块”。
8.执行如下程序代码后,
char chr = 127;
int sum = 200;
chr += 1;
sum += chr;
sum的值是()
备注:同时考虑c/c++和Java的情况的话
答案:
C/C++:72
Java:328
解析:
在Java中,char 类型是16位的,即占用2个字节。它的取值范围是 0 到65535,用来表示Unicode字符。在Java中,char类型是无符号的,不支持负值。
在C/C++中,char 类型通常是一个字节,但其符号性是实现定义的。在某些系统中,char 可能是有符号的,取值范围是 -128 到127;而在另一些系统中,char 可能是无符号的,取值范围是 0 到 255。
Java中只有byte, boolean是一个字节, char是两个字节, 所以对于java来说127不会发生溢出, 输出328 .
但是对于c/c++语言来说, char是一个字节, 会发生溢出, 对127加一发生溢出, 0111 1111 —> 1000 0000, 1000 0000为补码-128, 所以结果为200-128=72.