JavaSE-易错题集-001

1. AccessViolationException异常触发后,下列程序的输出结果为(      )

1

2

3

4

5

6

7

8

9

10

11

12

13

static void Main(string[] args)  

{  

    try  

    {  

        throw new AccessViolationException();  

        Console.WriteLine("error1");  

    }  

    catch (Exception e)  

    {  

        Console.WriteLine("error2");  

    }  

    Console.WriteLine("error3");  

  • A error2
      error3
  • B error3
  • C error2
  • D error1

正确答案:A

题解:

(1. 若catch(){} 块中 有throw 语句,则 try{} catch{} finally{} 块之外的代码不执行;否则,执行。

(2. try{} 中有异常,则try{}中异常下面代码不执行。

(3.  finally{} 中显示的代码必执行。


2. 非抽象类实现接口后,必须实现接口中的所有抽象方法,除了abstract外,方法头必须完全一致.

  • A 正确
  • B 错误

正确答案:B

题解:

实际上这道题考察的是两同两小一大 原则:

方法名相同,参数类型相同

子类返回类型小于等于父类方法的返回类型

子类抛出异常小于等于父类方法抛出异常

子类访问权限大于等于父类方法访问权限


3. 以下代码执行后输出结果为( )

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public class Test

{

    public static Test t1 = new Test();

    {

         System.out.println("blockA");

    }

    static

    {

        System.out.println("blockB");

    }

    public static void main(String[] args)

    {

        Test t2 = new Test();

    }

 }

  • A blockAblockBblockA
  • B blockAblockAblockB
  • C blockBblockBblockA
  • D blockBblockAblockB

正确答案:A

题解:

首先区别<clinit>是类初始化,<init>是实例初始化

类装载准备阶段->类初始化clinit阶段

类装载准备阶段:变量赋系统要求的初始值(0或者null等),final变量会在此时赋用户定义的初始值

类初始化<clinit>过程:

Step1 编译器收集t1的赋值动作,static语句块,main方法语句块

Step2 执行收集好的语句块:

Step2.1 执行t1 = new Test,发现clinit过程已经调用,于是可以开始触发init过程,执行成员变量的初始化(此处没有),以及非静态代码块,输出blockA,最后调用构造函数(此处没有)

Step2.2 按照顺序,执行static语句块,输出blockB

Step2.3 按照顺序,执行main方法语句块,执行t2 = new Test,触发init方法,执行非静态代码块,输出blockA


4. 下面哪几个函数 public void example(){....} 的重载函数?()

  • public void example(int m){...}
  • public int example(){..}
  • public void example2(){..}
  • public int example(int m,float f){...}

参考答案

AD ,函数方法名必须相同,看参数列表即可,无关返回值。

 题解:

java重载的时候以参数个数和类型作为区分,方法名相同,返回类型可以相同也可以不同,但不以返回类型作为区分,所以b也是错的,因为b的参数列表和原来一样。


5. jdk1.8版本之前的前提下,接口和抽象类描述正确的有( )

  • 抽象类没有构造函数
  • 接口没有构造函数
  • 抽象类不允许多继承
  • 接口中的方法可以有方法体

正确答案:B C

 题解:

A 抽象类是一个类,所以有构造器

B 接口不是一个类,所以没有构造函数

C 抽象类是一个类,类不允许继承多个类,但是可以实现多个接口,而接口可以继承多个接口,接口不能实现接口。

D jdk1.8 之前,接口中的方法都是抽象方法,用public abstract 修饰,jdk1.8新特性:可以有默认方法(用default 修饰,不能省略)和静态方法(static修饰),jdk1.9:接口中的默认方法还可以用private修饰


6. 下面哪些写法能在 java8 中编译执行()

  • dir.listFiles((File f)->f.getName().endsWith(“.Java”));
  • dir.listFiles((File f)=>f.getName().endsWith(“.Java”));
  • dir.listFiles((_.getName().endsWith(“.Java”)));
  • dir.listFiles( f->f.getName().endsWith(“.Java”));

正确答案:A D

题解:

Lanbda表达式的主要作用就是代替匿名内部类的繁琐语法, 它由三部分组成:

(1) 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。

(2) 箭头(→)。必须通过英文中画线和大于符号组成。

(3)代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么那条语句就不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一套省略了return的语句。Lambda表达式会自动返回这条语句的值。

由此可见,应该是A和D正确。


7. 在JDK1.7中,下述说法中抽象类与接口的区别与联系正确的有哪些?

  • 抽象类中可以有普通成员变量,接口中没有普通成员变量。
  • 抽象类和接口中都可以包含静态成员常量。
  • 一个类可以实现多个接口,但只能继承一个抽象类
  • 抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法。

正确答案:A B C D

 题解:(jdk1.7中)

接口(interface) 可以说是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的对象变量类型默认为public static final。另外,接口和抽象类在方法上有区别:

1. 抽象类可以有构造方法,接口中不能有构造方法。

2. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

3. 抽象类中可以有普通成员变量,接口中没有普通成员变量

4. 抽象类中抽象方法的访问类型可以是public,protected和默认类型

5. 抽象类中可以包含静态方法,接口中不能包含静态方法

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final 类型,并且默认为 public static final 类型

7. 一个类可以实现多个接口,但只能继承一个抽象类。二者在应用方面也有一定的区别:接口更对的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的复用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值