笔试最容易出现错误的题,分析过程详细

tech2023-09-06  104

执行流程的分析结果:D2 A2 A1 C3 A2 A3 D1 B2 D

public class CodeDemo { public static void main(String[] args) { new SB(); } } class SA { D d; static { System.out.println("D2"); } { System.out.println("C3"); d = new D(); } public SA() { System.out.println("D1"); } } class SB extends SA { static C c = new C(); static { System.out.println("A1"); } { System.out.println("B2"); } public SB() { System.out.println("D"); } } class C { public C() { System.out.println("A2"); } } class D extends C { public D() { System.out.println("A3"); } }

分析:当创建子类对象时,静态信息优先加载,所以需要先加载父类的静态信息,子类的静态信息,父类对象级别信息,子类对象级别信息。

1. 父类静态信息只有静态代码块,所以先加载静态代码块 2. 子类静态属性包括静态属性和静态代码块,所以加载的顺序是依次进行加载的 3. 静态属性常见:static C c = new C();和其他静态资源是同一级别需要进行顺序执行,静态方法不一样,方法必须要进行调用才会加载到栈中进行执行 4. 对象级别主要是构造代码块和构造方法,其中构造代码块优先于构造方法执行,构造代码块一般用来初始化成员变量和其他资源,所以在创建对象之前要保证其他属性均被初始化。 操作执行类的资源解释:bad good interface B { void f(); } class C implements B { public void f() { System.out.print("good "); } public void g(B b) { b.f(); } } class A implements B { public void f() { System.out.print("bad "); } public void g(B b) { b.f(); } public static void main(String[] args) { B b1 = new A(); B b2 = new C(); b1.f(); b2.f(); } }

分析:在向上造型创建的对象 B a=new A(); 方法的调用看子类的执行,子类不能调用自己独有的方法,只能调用重写的方法或者父类的方法,当子类找不到的话寻找父类的资源 拓展:final修饰的成员变量一定要被初始化,成员变量被每个对象享有,只能被赋值不能被操作

以下的输出结果是 : 5

class StaticStuff { static int x=10static { x+=5} public static void main(String args[ ]{ System.out.println("x=" + x); } static { x/=3;} }

分析:执行过程分析:先加载静态资源 ,静态区给静态变量进行赋初值:x=0;再次进行初始化 x=10 执行 第二个静态资源 x=15 再次进行执行第三个静态资源 x=15/3=5

结果:-1

下列的运行结果为( ) public class StaticExam { public static void main(String[] args) { System.out.println(SEDemo.i); System.out.println(new SEDemo().j); } } class SEDemo { public static int i = 6; public static SEDemo s = new SEDemo(); public int j; public SEDemo() { i--; j--; } }

分析:

1. 第一次进行 SEDemo.i的时候--->加载SEDemo类,从上到下进行执行,先加载静态资源(public static int i = 6;);再次进行加载静态属性(public static SEDemo s = new SEDemo();)加载静态属性的时候会第一次创建对象 --->执行构造方法 i--,j--:此 j=-1 2. 第二次执行时创建对象 new SEDemo().j--->由于静态资源之后加载一次,所以不会出现栈溢出的异常,静态资源第二次加载扫描类的时候,不会再次被加载,只会加载非静态资源 3.此时 j 默认系统初始值 1--->执行构造方法 j=-1 3. 静态资源不会被加载两次,只会再第一次加载的时候进行加载

最容易错的:b3=(b1+b2);这一行出错;编译错误

byte b1 = 1, b2 = 2, b3, b6; final byte b4 = 4, b5 = 6; b6 = b4 + b5; b3 = (b1 + b2); System.out.println(b3 + b6);

分析:

1. byte 类型存在常量池的说法 2. 当赋值的右边时常量是,jvm会优先进行编译优化操作,直接进行计算,查看是否在对应的范围 3. final的限定-->直接限定了值的类型不能被修改,并且是常量 ,所以(b4+b5)是常量,编译优化在范围中,编译通过 4. (b1+b2),b1,b2都是变量,没有进行编译优化,所以最终的相加的值为默认提升类型int类型,向下转型

有关finally的挂起状态分析:Person[name = Jack, age = 22]

对于代码: public class Test { public static void main(String[] args) { Person p = new Person(); p.name = "Sam"; p.age = 16; m(p); System.out.println(p); } public static Person m(Person p) { try { p.name = "Amy"; p.age = 18; throw new NullPointerException(); } catch (Exception e) { p.name = "Tom"; p.age = 20; return p; } finally { p = new Person(); p.name = "Jack"; p.age = 22; } } } class Person { String name; int age; @Override public String toString() { return "Person [name = " + name + ", age = " + age + "]"; } }的输出结果是

分析:

1. 当如果在try代码块中出现了异常,进行异常的抛出,此时catch进行捕获操作 2. 此时捕获的同时进行进行return 语句,检测到有finally代码块,此时将p进行挂起以及返回的状态一同进行挂起,执行finally块,执行finally块结束后,将p进行返回。 3. 拓展:接口中的属性默认被public final static 进行修饰,静态资源还是常量

结果:value is 9.0

关于输出结果的说明正确的是() public class Text04 { public static void main(String args[]) { int x = 4; System.out.println("value is" + ((x > 4) ? 99.9 : 9)); } }

分析:

三目运算的时候,直接进行可以进行类型的主动提升,保证前后类型是一致的

结果:1, 2行

对于代码:package cn.tedu.test1 ; public class A{ int age; } package cn.tedu.test2 ; public class C{ public static void main(String[] args) { B b=new B(); b.clone(); //1 } } class B extends A{ int age; public void test1(){ A a=new B(); a.clone(); //2 B b=new B(); b.clone(); //3 } } 编译报错的行号是?

分析:

1. clone方法是被protected修饰在Object方法类中与ABC三个类不在同一个包,但是又父子关系,如果想要进行调用protected修饰的方法,需要保证子类对象在子类的本类中属性。 2. protected修饰的访问范围是同包中的本类 或者子类同包的子类本类进行调用

结果:0.8999999999999999

对于代码:package cn.tedu.test1 ; public class A{ int age; } package cn.tedu.test2 ; public class C{ public static void main(String[] args) { B b=new B(); b.clone(); //1 } } class B extends A{ int age; public void test1(){ A a=new B(); a.clone(); //2 B b=new B(); b.clone(); //3 } } 编译报错的行号是?

分析:

丢失精度的原因:大部分小数底层二进制补码形式都是无限位数但是double数据类型的存储范围是一定的,所以小数在进行运算时会有无法精确运算小数位的情况,范围的限制必然导致精度的丢失

执行结果:100

import java.util.*; public class test1 { public static void main(String args[]) { Set<Short> s = new HashSet<Short>(); for (Short i = 0; i < 100; i++) { s.add(i); s.remove(i - 1); } System.out.println(s.size()); } }

分析:

当泛型进行指定的时候,操作的类型也只能是泛型的类型,包装类没有自动类型的提升 由于Set集合存储的元素类型时Short类型那么删除的时候也只能根据Short类型进行删除,当执行i-1时会默认变成int类型,所以类型不一致就不能删除

结果:ACD

下列各项可能会出现空指针异常的是 A.s != null & !s.equals(“”); B.s != null && !s.equals(“”); C.s != null | !s.equals(“”); D.s != null || !s.equals(“”); E.s == null || s.equals(“”)

分析:

1. 引用类型的变量进行调用方法的时候,引用类型不能使null值,否则底层爆出空指针异常 2. 短路&&不单&的区别,短路与,当左边是false那么不会执行右边的语句,提高了执行速度 3. 当单&的时候,无论什么时候,两边一定要进行执行判断

结果:BCD

关于代码public class Demo { int value; public static void main(String[] args) { Animal a = new Dog(); // 1 } } interface tiger { } class Animal { } class Dog extends Animal { } class Cat extends Animal{}}}可以填在1处编译没错运行有错的选项是? A.Dog d=(Dog)a; B.Cat c=(Cat)a; C.Animal e=(Animal)a; D.tiger t=(tiger)a;

分析:

1. 在编译的时候,向上造型,检查左边的声明和右边的创建类之间是否存在继承关系,如果继承关系那么编译通过,否则不通过 2. 在运行的时候,给类进行传值,检测类的左边声明类和当前值的创建类是否是同一类型,如果是同一类型则运行通过,否则进行类型转换异常,给接口进行传值的时候,值不是实现类就会进行报错。

结果: AE

下列各项中可以正确编译运行的是 A.Integer i = new Integer("017"); B.Long l = 35; C.Byte b = new Byte(127); D.Float f = 'a'; E.Boolean b = new Boolean(null);

分析:

1. //Integer会会可能的使用表示成一个数字,如果第一个数字为+ - 或者为0 那么必须要进行使用 //底层进行了屏蔽的属性封装 前提是后面必须要有数字进行标识,该类能够尽可能的将字符串进行数字的标识,可以忽略掉 + - 数字的最前面是0 的操作,直接将字符串转换成整数的形式 2. BD选项是属于自动封箱,在进行自动封箱时需要保证基本类型数据只能直接封箱为对应类型包装类。 3. 自动封箱的时候类型要一一进行对应,两边的类型要一直(包装类)

结果:将第8行改成super(6); 或者 将第8行改成this(5);

下列选项中,哪个可以使下列代码成功编译? package cn.tedu.a; class Super{ private int a; //第2行 Super(){} // 第3行 protected Super(int a){ this.a = a; } } pakcage cn.tedu.b; import cn.tedu.a.Super; public class Sub extends Super{ public Sub(int a){ super(a); } public Sub() { this.a = 5;//第8行 } }

分析:

此题的错误出在第8行,一是不能调用到父类私有属性,二是子类构造方法不能默认调用到父类无参构造 protected:其他包的子类可以访问,其他包的类不能进行访问: default:默认访问权限修饰符,其他包的都不能进行访问,包括子类 范围:public > protected > default > private 从四个方面:当前类,当前包 ,其他包的子类,其他类

最新回复(0)