Java——总结

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之前存储的值。


猜你喜欢

转载自blog.csdn.net/ella7/article/details/80694660