Java错题总结
1.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();
}
}
总结:
执行顺序:
父类静态代码块>子类静态代码块>父类构造代码块>父类构造函数>子类构造代码块>子类构造函数
2.public class EqualsMethod
{
public static void main(String[] args)
{
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.print(n1 == n2);
System.out.print(",");
System.out.println(n1 != n2);
}
}
总结:==符号:
==可用于基本类型和引用类型;
当用于基本类型的时候,是比较值是否相同;当用于引用类型的时候,是比较对象是否相同。
使用Integer a=1;或Interger a=Integer.valueOf(1);在值介于-128至127之间时,作为基本类型。
使用Integer a=new Integer(1);无论值是多少,都作为对象。
3. public class Test {
static int x=10;
static {x+=5;}
public static void main(String[] args) //4
{
System.out.println("x="+x);
}
static{x/=3;};
}//9
总结:
4. public class test {
public static void main(String args[]) {
int x,y;
x=5>>2;
y=x>>>2;
System.out.println(y);
}
}
总结:
>>表示带符号右移;>>>无符号左移。左边空出的位以0填充。
5. /*关于下列程序段的输出结果,说法正确的是:( ) */
public class MyClass{
static int i;
public static void main(String argv[]){
System.out.println(i);
}
}
总结:局部变量(final变量)没有默认初始化值,必须先赋值后使用,否则不能通过编译;
成员变量(类的属性)有默认初始化值,在创建对象时被初始化。
6.package Test;
public class Test {
private static void test(int[] arr) {
for (int i = 0; i < arr.length; i++) {
try {
if (arr[i] % 2 == 0) {
throw new NullPointerException();
} else {
System.out.print(i);
}
} finally {
System.out.print("e");
}
}
}
public static void main(String[]args) {
try {
test(new int[] {0, 1, 2, 3, 4, 5});
} catch (Exception e) {
System.out.print("E");
}
}
}
总结:
1、finally语句只有在非常极端的情况下不会执行,默认肯定会要执行;
2、如果try、catch语句中有return语句或者throw语句,这些语句要在finally执行之后再执行;
3、try中一旦抛出异常,则try语句中的剩下语句则不会执行;
4、抛出异常的方法的调用者捕获到异常后进行处理;
7.public class Test {
public static void mian(String[] args) {
System.out.println(new B().getValue());
}
static class A{
protected int value;
public A(int v) {
setValue(v);
}
public void setValue(int value)
{
this.value = value;
}
public int getValue() {
try {
value++;
return value;
}
finally {
this.setValue(value);
System.out.println(value);
}
}
}
static class B extends A{
public B() {
super(5);
setValue(getValue()-3);
}
public void setValue(int value) {
super.setValue(2*value);
}
}
}
总结:答案:22 34 17
①
new B()
执行B的构造函数,第一行是super(5);
此时执行的是A的构造函数,A的构造函数调用的是setValue()方法,由于B重写了A的这个方法,
所以!!!执行的是B的 setValue()方法。
即传入的参数是2*5=10
此时,因为super,所以调用的是父类的 setValue()方法,即value=10
第一行执行完毕。
第二行是 setValue(getValue()-3);
B没有getValue()方法,故执行父类的此方法,
try返回的是value=10+1=11,保存在临时栈中
finally中调用this的方法,这个this指的是B的对象,又重写,故就是B的 setValue()方法
value=2*11=22,第一个打印到屏幕上的数字
接下来参数 getValue()-3=11-3=8
传入B的 setValue()方法
此时value=2*8=16
至此,new B()执行结束
②
new B(). getValue()
B没有 getValue(),故执行A的 getValue()
try返回16+1=17,保存到临时栈中
finally调用B的 setValue()方法
value=17*2=34,第二个打印到屏幕上面的数字
最后主函数打印返回值,也就是try保存到临时栈的17
注意点:
① 子类B中重写了父类A中的setValue方法
super(5) //调用了父类构造器,其中构造函数里面的setValue(value),调用的是子类的setValue方法
finally块中的
this.setValue(value) //调用的也是子类的setValue方法
而子类setValue方法中的
super.setValue(2*value); //调用的是父类A的setValue方法
② try...catch...finally块中有return返回值的情况
finally块中虽然改变了value的值,但try块中返回的应该是return之前存储的值。