java细节整理(易错点)

来源:互联网 发布:excel宏的编程实例 编辑:程序博客网 时间:2024/06/02 05:05

1)==用于基本数据类型的比较,在引用数据类型上面使用的时候比较的是地址值
例:
下面程序的运行结果是()

String str1 = "hello";String str2 = "he" + new String("llo");System.err.println(str1 == str2);

A hello B he C true D false

答案:false 解析:因为str2中的llo是新申请的内存块,而==判断的是对象的地址而非值,所以不一样。如果是String str2 = str1,那么就是true了。


2)普通类的方法名字其实是可以与类名一致的,和构造函数唯一的区别就是构造函数没有返回值类型,而普通方法有返回值类型
例:
下列说法正确的有()
A. class中的constructor不可省略
B. constructor必须与class同名,但方法不能与class同名
C. constructor在一个对象被new时执行
D.一个class只能定义一个constructor

答案:C 解析:这里可能会有误区,其实普通的类方法是可以和类名同名的,
和构造方法唯一的区分就是,构造方法没有返回值


3)Thread类中start()方法和run()方法的使用区别:
start()是用来启动一个线程,当调用了start方法之后,系统才会开启一个新的线程,进而调用run()方法来执行任务,而单独的调用run()方法其实就和普通方法一样,按照顺序执行,不会单独开辟一个线程,从而失去了线程的特性了。因此在启动一个线程的时候一定要使用start()而不是run()。
例:
下面程序的运行结果:()

  public static void main(String args[]) {             Thread t = new Thread() {                 public void run() {                     pong();                 }             };             t.run();             System.out.print("ping");  }  static void pong() {             System.out.print("pong");  }

A pingpong B pongping C pingpong和pongping都有可能 D 都不输出

答案:B 解析:这里考的是Thread类中start()和run()方法的区别了。start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程,进而调用run()方法来执行任务,而单独的调用run()就跟调用普通方法是一样的,已经失去线程的特性了。


4)关于接口和接口中的修饰符
a.接口中的成员常量和方法都必须是public类型的。因为接口用于描述系统对外提供的所有服务,要确保外部使用者能够访问它们。
b.接口中的方法都是抽象类型abstract的。因为接口仅仅描述系统能够做什么,但是不指明如何去做,为此接口中的方法都是抽象类型的。
c.接口中的变量类型只有final,static类型。因为接口中的变量是所有实现类所共有的,既然共有,就是不变的东西,所以变量是不可变的final类型,也就是常量了;接口不涉及和任何具体实例相关的细节,通俗的话讲就是接口不能够被new,因此接口没有构造方法,不能够被实例化,没有实例变量,只有静态static变量。
d.接口中不能够出现变量,如果有变量出现,就和接口提供的统一抽象的这种思想相抵触了。所以接口中的属性必然是一个常量,只能够读不能够被修改,这样才能为实现接口的对象提供一个统一的属性。通俗的讲,如果有认为是要变化的东西,就放到实现接口的类中去实现,而不应该放到接口中去,接口只是对一类事物的属性和行为更高层次的抽象。
e.综上:接口的方法默认是public abstract,接口的属性默认是public static final常量,且必须赋值。
例:
Java接口的修饰符可以为()

A private B protected C final D abstract

答案:cd


5)ArrayList扩充问题
ArrayList默认的长度为10个,但是如果在声明的时候指定了长度的话,就会一次性创建指定长度,而不需要扩充。
例:
ArrayList list = new ArrayList(20);中的list扩充几次()

A 0 B 1 C 2 D 3

答案:A 解析:这里有点迷惑人,大家都知道默认ArrayList的长度是10个,所以如果你要往list里添加20个元素肯定要扩充一次(扩充为原来的1.5倍),但是这里显示指明了需要多少空间,所以就一次性为你分配这么多空间,也就是不需要扩充了


6)异常try……catch语句块的执行顺序
当有多个catch语句的时候,从最前面的catch语句块依次进行异常类型的匹配,仅仅匹配一个,当按顺序来从上到下匹配到一个之后,后续的匹配都不会再执行了;如果父类异常在子类异常的前面的时候,首先匹配的就是父类异常,子类异常是不会得到匹配并执行的。所以在写代码的时候,父类异常Exception一般都放在catch语句块的最后一个。
例:
getCustomerInfo()方法如下,try中可以捕获三种类型的异常,如果在该方法运行中产生了一个IOException,将会输出什么结果()

public void getCustomerInfo() {             try {               // do something that may cause an Exception             } catch (java.io.FileNotFoundException ex) {                    System.out.print("FileNotFoundException!");             } catch (java.io.IOException ex) {                    System.out.print("IOException!");             } catch (java.lang.Exception ex) {                    System.out.print("Exception!");             }  }

A IOException!
B IOException!Exception!
C FileNotFoundException!IOException!
D FileNotFoundException!IOException!Exception!

答案:A 解析:考察多个catch语句块的执行顺序。当用多个catch语句时,catch语句块在次序上有先后之分。从最前面的catch语句块依次先后进行异常类型匹配,这样如果父异常在子异常类之前,那么首先匹配的将是父异常类,子异常类将不会获得匹配的机会,也即子异常类型所在的catch语句块将是不可到达的语句。所以,一般将父类异常类即Exception老大放在catch语句块的最后一个。


7)编译时异常:变量没有初始化的时候不能够输出。
Java中所有定义的基本类型或对象都必须初始化才能输出值,否则会发生编译时异常。
例:
下面代码的运行结果为:()

import java.io.*;import java.util.*;public class foo{  public static void main (String[] args){             String s;             System.out.println("s=" + s);  }}

A 代码得到编译,并输出“s=”
B 代码得到编译,并输出“s=null”
C 由于String s没有初始化,代码不能编译通过
D 代码得到编译,但捕获到 NullPointException异常

答案:C


8)参数传递与修改
不管是对象、基本类型还是对象数组、基本类型数组,在函数中都不能改变其实际地址但能改变其中的内容

例:
下列程序的运行结果是:

public class Example {  String str = new String("good");  char[] ch = { 'a', 'b', 'c' };  public static void main(String args[]) {             Example ex = new Example();             ex.change(ex.str, ex.ch);             System.out.print(ex.str + " and ");             System.out.print(ex.ch);  }  public void change(String str, char ch[]) {             str = "test ok";             ch[0] = 'g';  }}

A、 good and abc
B、 good and gbc
C、 test ok and abc
D、 test ok and gbc


9)关于switch语句:
case语句后面如果没有break,那么就会一直往下执行。
例:
下面的方法,当输入为2的时候返回值是多少?()

 public static int getValue(int i) {             int result = 0;             switch (i) {             case 1:                 result = result + i;             case 2:                 result = result + i * 2;             case 3:                 result = result + i * 3;             }  return result;  }

A 0 B 2 C 4 D 10

答案:D 解析:注意这里case后面没有加break,所以从case 2开始一直往下运行。


10)抽象类细节
a)类中只有成员变量和成员函数,是不能够出现语句的;
b)抽象类中的抽象函数定义的时候是不能够有方法体的,就是{};
c)抽象类和接口不同,接口是公开的,里面的方法都是public的,里面不能够有私有的方法或者变量,接口就是让别人使用的;而抽象类不同,抽象类是可以有私有的方法和变量的。

例:
选项中哪一行代码可以替换题目中//add code here而不产生编译错误?()

public abstract class MyClass {  public int constInt = 5;  //add code here  public void method() {  }}

A public abstract void method(int a);
B constInt = constInt + 5;
C public int method();
D public abstract void anotherMethod() {}