面试之JAVA

来源:互联网 发布:cc免费顶级域名注册 编辑:程序博客网 时间:2024/04/30 23:24


第一部分  Java的类

1. 请解释Java语言的跨平台特性。

参考答案:Java的跨平台特性也被称为可移植性、平台无关性,或者一次编写处处运行等。意思就是如果用Java语言编写一个应用,那么就可以在不同平台上运行,而不需要为不同平台单独运行开发。之所以能实现跨平台的特性,主要得益于Java虚拟机(JVM),JVM中的解释器在运行Java应用时根据当前平台进行解释,解释成符合当前平台规范的机器码,从而保证同样的应用在不同平台上都能运行。

2. 请列举Java语言的主要特点

参考答案:Java语言有很多特点,主要包括①跨平台性:一个应用可以不经过修改,就直接运行到不同的平台上。②面向对象:Java语言是一门面向对象的语言,可以使用对象封装事物的属性和行为,可以使用面向对象的思想进行分析设计,并实现整个应用。③解释执行:执行Java应用时,JVM中的解释器将解释类文件,生成符合当前平台的字节码。④自动垃圾回收:Java应用中的垃圾回收时自动进行的,JVM中的后台线程将监视内存中数据的使用情况。当内存中的数据不再被引用时,将被作为垃圾回收,而不需要程序员手动收回。

3. 请说明一个Java类中主要包含哪几种元素?并说明每种元素的作用。

参考答案:Java类中主要包含属性、方法、构造方法、块以及内部类。属性用来定义对象的数据:方法定义对象的行为;构造方法可以用来创建对象;块能够用来在类加载时执行通用性操作或者在每次实例化前执行通用操作;内部类作为类的一个成员存在,能够访问外部类的属性和方法。

4. 请说明构造方法的作用和特征。

参考答案:构造方法的作用是用来创建对象,使用new关键字调用。构造方法的名字必须与类的名字完全相同,并且大小写敏感,同时构造方法不能声明返回值类型,可以使用任意一中权限访问修饰符,但是不能使用其他修饰符进行修饰,如static、final、abstract等修饰符都不能修饰构造方法。

5. 什么是方法重载(overload)?

参考答案:方法重载指的是在一个类中可以声明多个相同的名字和方法,而方法的形式参数有所区别。调用这些同名方法时,JVM会根据实际参数的不同绑定到不同的方法。

6. 请列举Java语言中的权限访问修饰符,并说明每种权限的含义。

参考答案:Java语言中有四种权限访问修饰符,即public、protected、同包以及private。Public表示公共权限,即任何包中都可以访问;protected表示受保护权限,即同包中可以访问,不同包中的子类可以访问;同包权限是默认权限,即不显式指明权限修饰符的时候是同包权限,表示只有同包中可以访问;private是私有权限,表示只能在本类中访问。

7. 请列举 Java 语言中的八种基本数据类型,并说明每种数据类型的含义及长度。

参考答案:Java语言的八种基本数据类型有:byte字节型,8位长度;short短整型,16位长度;int 整型,32位长度;long长整型,64位长度;float 单精度浮点型,32位长度;double 双精度浮点型,64为长度;char 字符型,16位长度;boolean型,表示逻辑值,有true和false两个值,分别表示真和假。

8.什么叫引用类型,引用类型和基本数据类型有什么区别?

参考答案:Java语言中除了基本数据类型之外的类型,都称为引用类型。引用类型就是类的类型,所有的对象都是引用类型,包括数组对象。引用类型必须使用new调用构造方法进行赋值,引用类型的变量拥有自己的属性和方法,可以使用圆点调用自己的属性和方法。基本数据类型直接使用=号进行赋值,且没有自己的属性和方法,往往都在声明属性或方法时使用。

9.对于String对象,可以使用“=”赋值,也可以使用new关键字赋值,两种方式有什么区别?

参考答案:使用“=”赋值不一定每次都创建一个新的字符串,而是从“字符串实例池”中查找字符串。使用new进行赋值,则每次都创建一个新的字符串。

10.String类是一个“不可变类”,请解释“不可变类”的含义。

参考答案:所谓不可变类,就是字符串初始化后,就不能够被改变。

11.String类和StringBuffer类有什么区别?

参考答案:String类是不可变类,即字符串值一旦初始化后就不恩能够被改变。StringBuffer类是可变字符串类,类似String的缓冲区,可以修改字符串的值。

12.StringBuffer和StringBuilder类有什么区别?

参考答案:StringBuffer是线程安全的字符串缓冲,而StringBuilder不是线程安全的。

13.包装器类型包括哪些类,有什么作用?

参考答案:包装器类型包括Byte、Short、Integer、Long、Float、Double、Character、Boolean这八个类,主要用来对byte、short、int、long、float、double、char、boolean这八种基本数据类型进行包装,使其成为引用类型。

14.请说明Java语言中的值传递规则。

参考答案:基本数据类型传递的是值,引用类型传递的是引用,即虚地址。

15.使用static修饰属性或方法后,属性和方法有什么特征?

参考答案:static修饰属性或方法后,属性和方法不再属于某个特定对象,而是所有对象共享,也可以说static成员不依赖某个对象,在类加载时就被初始化。Static修饰的属性或者方法,可以直接使用类名调用,而不用先实例化对象再调用。

16.使用final修饰属性后,属性有什么特征?

参考答案:final修饰属性后,属性就成为一个常量。常量只要被赋值,就不能被改变。

17.请说明操作符= =的作用。

参考答案:= =可以用来比较基本类型或者引用类型。比较基本类型时,= =用来比较数值二进制的值,比较引用类型时,用来比较对象的虚地址。

18.请说明&&与&的区别和联系。

参考答案:&&会发生短路问题,当第一个表达式的值为false时,将直接返回结果false,而不会判断第二个表达式的值。而&不会发生短路问题,即使第一个表达式的值是false,依然会判断第二个表达式的值。

19.请列举Java语言中的几种位运算符,并说明位运算符的作用。

参考答案:Java语言中有三种移位运算符,分别是<<:左移运算符,左移1位相当于乘2。>>:有符号右移,右移一位相当于除2;>>>:无符号右移,忽略符号位,空位都以0补齐。

20.break语句能在什么场景使用。

参考答案:break语句可以在循环体中使用,也可以在switch的case语句中使用。

21.for循环中的break语句和continue语句的作用。

参考答案:break可以用来中断循环,continue可以用来继续下一次循环。

第二部分 类之间的关系

1.用代码表示A类关联B类的情况。

参考答案:  class  A{

                  Private  B  b;

                  Public  void set(B  b){

                     this.b = b;

                  } }

2.请说明Java语言中数组的基本概念,数组的作用,以及数组的声明创建方式。

参考答案:数组是相同元素的集合,作为数据容器使用。声明创建一个int型数组,如下所示:int[] x=newint[3]; 其中3是数组的长度,该数组能够存储3个int型变量。

3.使用代码,创建一个长度为5的String型数组,并使用增强for循环迭代数组打印输出数组中的元素。

参考答案:

         String [] sArray=newString [5];

         for(String s:sArray){

           System.out.println(s);

         }

4.说明Arrsys类的作用。

参考答案:Arrays类是java.util包中的一个类,类中所有方法都是static方法,这些方法都是数组对象的工具方法,能够对数组进行处理,如sort方法可以对数组元素进行排序。

5.请使用简单代码展示A类依赖B类的含义。

参考答案:

        class A{

           public void f(B,b){}

        }

6.请说明依赖关系和关联关系的区别。

参考答案:依赖关系是一种瞬时关系,A依赖B,指的是A的某个行为的参数是B的类型,也就是说,A要想实现这个行为,必须依赖B的实例。A关联B,是一种长久的关系。指的是B作为A的属性存在,只要实例化一个A的对象,就会为这个A的对象实例化一个B的对象,作为他的属性使用,可以在A中任何需要使用B的地方使用B。

7.继承有什么作用,Java语言中的继承有什么特点?

参考答案:继承主要为了能够重复使用父类中的成员。Java语言中的继承是单继承,也就是说一个类最多只能继承一个父类。

8.什么是方法覆盖(override)?并说明方法覆盖与方法重载(overload)的区别。

参考答案:覆盖是发生在继承关系的子类中,当子类要修改从父类继承到得某个方法的方法体时,就可以在子类中声明一个与父类同名字、同参数并且同返回值类型的方法,这就是方法覆盖。而重载与继承没有关系,指的是在一个类中可以同时声明多个同名但不同参数的方法,称为重载。

9.请说明什么是抽象类?抽象类有什么作用?

参考答案:抽象类是不能实例化的类,使用abstract修饰。抽象类往往用来做父类使用,定义一些子类的共同属性或行为。

10.请说明抽象方法的含义,并说明抽象类与抽象方法的关系。

参考答案:抽象方法是没有方法体的方法,使用abstract修饰符修饰。抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。

11.super关键字的两种用法。

参考答案:super关键字有两种用法。第一种是在子类构造方法的第一行,调用父类的某个构造方法,如super(); 表示调用父类中的没有参数的构造方法;犹如super(10); 表示调用父类中的具有一个整型参数的构造方法。第二种用法是子类中调用父类中的成员,如super.f(); 意思是调用父类中的f()方法。

12.final类与final方法有什么作用?

参考答案:final类是不能够被继承的关系,称为终极类,如String类就是final类,不能有子类。final修饰方法后,是终极方法,不能被子类覆盖,但是可以被子类继承使用。

13.什么是多态参数?多态参数有什么作用?

参考答案:多态参数就是参数的类型是某个父类类型,具体为这个参数赋值的时候,就可以使用该父类的任意子类的对象。使用多态参数,可以使得程序的扩展性更好,即使扩展了新的子类,方法不需要任何修改,就能接受子类类型进行处理。

14.Object类有什么特点?

参考答案:Object类是所有类的直接或间接的父类。

15.Object类中的toString方法有什么作用?

参考答案:toString方法可以把对象作为字符串返回。

16.Object类中的equals方法与hashCode方法有什么作用?

参考答案:Object类中的equals方法用来比较两个引用的引用值,hashCode用来返回引用的内地址的十六进制数值。在Set以及Map集合中,判断两个元素是否重复时,往往需要使用这两个方法。这两个方法往往被子类覆盖,覆盖的规则是:如果存在x和y两个对象,调用x.equals(y)返回true时,那么调用hashCode方法的返回值也应该相同;如果x.equals(y)返回false时,那么调用hashCode方法返回值可能相同,也可能不同。

17.接口有什么特点,与抽象类有什么区别?

参考答案:接口的特点是不能定义变量,而且所有方法都是抽象方法。而抽象类中可以有变量,也不强制必须有抽象方法。

18.类继承父类与类实现接口,有什么区别?

参考答案:类继承父类只能是单继承,也就是一个子类最多只能有一个父类;而类实现接口可以多实现,就是一个子类可以同时实现多个接口,并覆盖所有接口中的所有抽象方法。

19.Comparable接口有什么作用?

参考答案:Comparable接口定义了compareTo(Object  o)方法,可以用来实现对象的比较逻辑。这个接口常常在其他API中强制使用,用来规范对象的比较逻辑。

第三部分   异常处理

1.什么是异常?异常和错误有什么区别?

参考答案:异常时一些不正常的事件,能够中断程序的正常执行,例如除0计算就是异常。异常和错误不同,异常是可以被处理的,而错误往往是不能够被处理的,如内存溢出错误。

2.NullPointerException是什么异常?什么情况发生该异常?

参考答案:NullPointerException是空指针异常,当一个引用没有被赋值,就是null值。如果这种情况下,使用该引用调用其属性或者方法,就会发生NullPointerException异常。

3.说明try/catch/finally语句块的作用。

参考答案:try语句块用来包含可能发生异常的语句,catch块用来捕获异常,finally块用来包含必须执行的语句。

4.如何使用语句抛出异常,抛出异常后如何处理?

参考答案:使用throw语句就可以抛出异常,如throw newXXXException()。抛出异常后,一般情况下会在方法声明处使用throws声明该类型的异常,调用该方法时编译器将提示处理异常。

5.throws关键字和throw关键字有什么区别和联系?

参考答案:throw用来在方法体内抛出异常,而throws用来在方法声明处声明异常。这两个关键字有着一定联系。如果一个方法中使用了throw关键字抛出了异常,那么要么立即使用try/catch语句进行捕获,要么就使用throws进行声明,否则将出现编译错误。然而,并不是只有使用了throw关键字后才能使用throws关键字,语法上来说,任何一个方法都可以直接使用throws关键字,抽象方法也可以使用。

6.什么是自定义异常类?为什么要自定义异常类?

参考答案:自定义异常类区别于API中的标准异常类,指的是开发人员自己创建的异常类。只要继承API中某个异常类就可以自定义一个异常类,常常继承Exception类。自定义异常类主要为了标记业务逻辑中非正常事件流,避免与API中的标准异常混淆。

第四部分  核心API

1.请画出Java集合框架的主要接口和类的继承关系。



2.Collection接口和Map接口分别定义了什么集合类型?有什么区别?

参考答案:Collection接口是传统的集合接口,可以把单个对象存储进来。而Map接口是映射接口,存储的是键值对。

3.用简单代码演示创建一个泛型类型为Customer类的List对象,并使用增强for循环迭代该集合。

参考答案:

List<Customer>  list=newArrayList <Customer>();

for(Customer  cust:list){

}

4.List和Set集合有什么区别?

参考答案:List实现了列表类型的集合,List中的元素是有顺序(ordered)的,每个元素根据加入集合的顺序而对应一个索引值,可以根据这个索引值返回集合元素。而Set实现了不重复的集合,即Set中的元素不能够重复,重复的元素将无法添加到集合中。

5.List接口有哪几个主要的实现类?分别说明其特征。

参考答案:List接口中有以下几个常用实现类:① ArrayList:实现了动态数组的特征。② LinkedList:实现了链表的数据结构,LinkedList也可以用作栈或者队列。③ Vector:Vector类的功能ArrayList都可以实现,区别在于Vector是线程同步的。

6.Collection和Collections有什么区别?

参考答案:Collection是一个接口的名字,定义了集合类型的共同特征。而Collections是一个类的名字,是集合类型的工具类,类中定义了大量的静态方法,能够操作集合对象。

7.如何将一个Collection转换成数组?

参考答案:Collection接口定义了toArray(T[] a)方法用来将集合转换为数组,其中T是泛型类型。

8.假设存在文本文件etc.doc,请用代码展示将该文件按行读出,并打印输出到控制台。

参考答案:

File file=new File(“etc.doc”);

             Try{

                    FileReaderfr=new FileReader(file);

                    BufferedReaderbr=new BufferedReader(fr);

                    Stringline=br.readLine();

                    while(line==null){

                           System.out.println(line);

                           line=br.readLine();

}

}catch(FileNotFoundException e){

      e.printStackTrace();

}catch(IOException e){

e.printStackTrace();}

9.请说明AWT、Swing以及SWT的区别和联系。

参考答案:AWT(Abstract Windows Toolkit)是Java语言中最原始的GUI工具包;Java Swing是JavaFoundation Classes (JFC)的一部分,是在AWT基础上发展而来的GUI API;AWT和Swing都是原Sun公司推出的Java GUI工具包,而SWT是Eclipse组织为了开发Eclipse IDE环境所编写的一组底层GUI API。

10.假设某GUI 中存在一个按钮button,请使用匿名内部类对该按钮注册监听器,使得点击按钮后应用能够推出。

参考答案:

    button.addActionListener(newActionListener(){

             public voidactionPerformed(ActionEvent arg0){

                  System.exit(0);

             }

    });

11.使用Java语言如何创建线程对象?请列出常用的两种方法。

参考答案:Java语言中经常使用两种方法创建线程。① 创建Thread类的子类,在子类中覆盖Thread类的run方法,实现线程的运行体,只要创建该子类对象对象就是线程对象。② 创建Runnable接口的实现类,在实现类中覆盖接口中的run方法,实现线程的运行体。使用Thread(Runnable)构造方法可以创建线程对象,参数是Runnable接口实现类的实例。

12.关键字synchronized有什么作用?用简单代码展示synchronized的用法。

参考答案:synchronized可以将某个代码块或者某个方法进行线程同步,被同步的代码块在一个时刻只能被一个线程访问,只有当前线程处理结束后,方能被其他线程访问。例如:

public void run(){

for(int i=0;i<50;i++){

synchronized(this){   System.out.println(Thread.currentThread().getName()+”:x=”+x);

x++;

      }}}

13.线程之间通信的方法有哪几个?分别起到什么作用?

参考答案:线程通信的方法有三个,在Object类中定义。① wait方法:使得线程进入等待状态。② notify方法:随意通知等待池中的某一个线程。③ notifyAll方法:通知等待池中所有线程。

14.基于TCP协议的网络编程,如何在客户端和服务器端传输数据?

 参考答案:基于TCP协议的网络编程,主要使用Socket类或得输入流和输出流,进一步在客户端和服务器端进行输入输出操作。

15.基于UDP协议的网络编程,如何在客户端和服务器端传输数据?

参考答案:基于UDP协议的网络编程,主要使用数据报传输数据,Java语言API中定义了DatagramPacket类,用来表示一个数据报。

16.Date和Calendar类有什么区别和联系?

参考答案:Date类用来表示某个特定瞬间,能够精确到毫秒。而在实际应用中,往往需要把一个日期中的年、月、日等信息单独返回进行显示或处理,Calendar类中就定义了这样一系列方法。往往可以先创建一个Date实例,然后通过Calendar中的setTime方法将该实例关联到Calendar,接下来就可以使用Calendar中的方法处理Date实例中的信息。

17.DateFormat类有什么作用?用简单代码展示其使用方法。

参考答案:DateFormat是一个用来对日期和时间类型进行格式转换的类,该类是一个抽象类,定义了日期时间格式化的通用方法。例如:

DateFormat format1=DateFormat.getInstance();

System.out.println(format1.format(new Date()));

18.SimpleDateFormat类有什么作用?用简单代码展示其使用方法。

参考答案:SimpleDateFormat类是DateFormat类的子类,可以非常灵活地定义日期显示格式。例如:

SimpleDateFormat sdf1=new SimpleDateFormat(“yyyy年MM月dd日hh时mm分ss秒EE”,Locale.CHINA);

System.out.println(sdf1.format(new Date()));

19.Java语言中与国际化相关的类有哪几个?说明其主要作用。

参考答案:Java语言中与国际化相关的类主要有三个:①java.util.Locale:对应一个特定的国家/区域、语言环境。②java.util.ResourceBundle:用于加载一个资源包,并从资源包中获取需要的内容。③java.text.MessageFormat:用于将信息格式化,如动态为占位符赋值等。

20.Java语言中与格式化相关的类有哪几个?说明其主要作用。

参考答案:Java语言中主要有三个和格式化相关的类:① DateFormat:用来对日期进行格式化,并有子类SimpleDateFormat对其进行了扩展。②MessageFormat:用来对信息进行格式化。③ NumberFormat:用来对数字进行格式化,并有ChoiceFormat和DecimalFormat两个子类对其进行了扩展。

21.Java语言中使用哪两个类封装大数据类型?分别有什么作用?

参考答案:Java语言中有两个大数据类型,及BigInteger和BigDecimal,其中BigInteger可以封装任意精度的整型数值,而BigDecimal可以封转任意精度的有符号数,包括整数和浮点数。

22.什么是反射?反射有哪些作用?

参考答案:反射式一种强大的工具,能够用来创建灵活的代码,这些代码可以在运行时装配,利用反射机制能够实现很多动态的功能,例如在运行期判断一个对象有哪些方法、动态为对象增加成员、运行期调用任意对象的任意方法等。

23.有哪几种方法可以返回Class类的对象?

参考答案:可以有三种方式返回Class类型对象:① 使用Object类中的getClass方法;② 使用Class类的forName方法;③ 使用“类名.class”形式返回Class实例。

第五部分  其他特性

1.什么是泛型?泛型有什么作用?

参考答案:泛型的本质就是参数化类型,也就是说把数据类型指定为一个参数。在需要声明数据类型的地方,就可以不指定具体的某个类型,而是使用这个参数。这样一来,就能够在具体使用时再指定具体类型,实现了参数的“任意化”。泛型的好处是在编译的时候能够检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

2.请声明一个简单的泛型类,说明泛型的作用。

参考答案:

public class GenClass<E>{

private E attr;

public GenClass(E attr){

      this.attr=attr;

}

public E getAttr(){

      returnattr;

}

public void setAttr(E attr){

      this.attr=attr;

}

public static void main(String[] args){

GenClass<String>g1=newGenClass<String>(“hello”);

System.out.println(g1.getAttr());

GenClass<Integer>g2=newGenClass<Integer>(new Integer(100));

System.out.println(g2.getAttr());

}}

上面的类GenClass就是一个泛型类,其中E是代表类型的一个参数,E不是一个具体的类,可以使用任意字母替代。在类中声明属性、方法的时候,都是用E这个参数表示类型,达到了类型任意化得效果。可见,使用该类时,可以根据需要将E替换为任意具体类型。

3.下述代码是否有编译错误,如果有,请指出错误。

List<String>ls=new ArrayList<String>();

List<Object>lo=ls;

参考答案:代码有编译错误,在第二行出错。一个泛型类型为String的List并不是一个泛型类型为Object的List的子类型。

4.请使用简单代码声明一个枚举类型,并说明枚举的作用。

参考答案:枚举使用enum关键字声明,如下所示:

public enum StudentGrade{

A,B,C;

}

使用枚举的时候,可以通过枚举的名字StudentGrade进行引用,如下所示:

public void setGrade(StudentGrade grade){

       this.grade=grade;

      }

在使用setGrade方法时,实际参数值只能是枚举StudentGrade中的预定义值,否则出现编译错误。

5.假设有一个枚举类型是Grade,请用代码展示遍历该枚举的方法。

参考答案:遍历枚举需要使用values()方法,如下所示:

    Grade[]grades=Grade.values();

           for(Grade g:grades){

            System.out.println(g);

        }

6.增强for循环在什么场合使用?用简单代码展示其使用方法。

参考答案:增强for循环可以用来遍历数组或者集合,如下所示:

for(String s:sArray){

        System.out.println(s);

}

上述代码中的sArray是一个String类型的数组。

7.什么是自动装箱/拆箱?使用该特性有哪些注意事项?

参考答案:自动装箱指的是可以直接将基本数据类型转换为包装器类型,自动拆箱指的是可以直接将包装器类型转换为基本数据类型,如下代码所示:

       intm=100;

      Integer im=m;

       intn=im;

上述代码中,直接将m赋值给包装器对象im,这就是自动装箱,然后直接将im赋值给基本数据类型n,这就是自动拆箱。虽然表面上看代码简洁方便,然而本质上装箱的时候依然使用new创建了对象,而拆箱时也依然调用了方法进行运算。因此,不要在没必要的时候,频繁使用装箱拆箱,会降低性能。

8.什么是可变参数?用简单代码展示可变参数的使用。

参考答案:可变参数是指参数个数不确定的参数,如下所示:

public static int add(int…args){

        ……

     }

上述方法的参数args就是可变参数,使用add方法时,形式参数可以是任意多个int型数值。

0 0