Java程序员面试宝典.pdf
《Java程序员面试宝典.pdf》由会员分享,可在线阅读,更多相关《Java程序员面试宝典.pdf(23页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java 程序员面试宝典(程序员面试宝典(重点有标记重点有标记 推荐初级学者认真看最后一道面试题推荐初级学者认真看最后一道面试题 我几回笔试都看到了类此的我几回笔试都看到了类此的 必考题哦必考题哦)面向对象面向对象 面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看做是对象。对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例。如果说传统的过程式编程语言是以过程为中心、以算法为驱动的话,面向对象的编程语言则是以对象为中心,以消息为驱动。用公式表示,过程式编程语言为:程序=算法+数据;面向对象编程语言为:程序=对象+消息。所有面向对象编
2、程语言都支持 3 个概念,即封装、多态性和继承,Java 也不例外。现实世界中的对象均有属性和行为,映射到计算机程序上,属性则表示对象的数据,行为表示对象的方法(其作用是处理数据或同外界交互)。所谓封装,就是用一个自主式框架把对象的数据和方法连在一起形成一个整体。可以说,对象是支持封装的手段,是封装的基本单位。Java 语言的封装性较强,因为 Java 无全程变量,无主函数,在 Java 中绝大部分成员是对象,只有简单的数字类型、字符类型和布尔类型除外。而对于这些类型,Java也提供了相应的对象类型以便与其他对象交互操作。“这个世界是由什么组成的?”这个问题如果让不同的人来回答会得到不同的答案
3、。如果是一个化学家,他也许会告诉你:“还用问吗?这个世界是由分子、原子、离子等化学物质组成的”。如果是一个画家,他也许会告诉你:“这个世界是由不同的颜色所组成的”。但如果让一个分类学家来考虑问题就有趣多了,他会告诉你:“这个世界是由不同类型的物与事所构成的”。好!作为面向对象的程序员,我们要从分类学家的角度去考虑问题!是的,这个世界是由动物、植物等组成的。动物又分为单细胞动物、多细胞动物、哺乳动物等,哺乳动物又分为人、大象、老虎就这样分下去了!现在,从抽象的角度,我们给“类”下个定义吧!我的意思是,从抽象的角度,你回答我“什么是人类?”首先让我们来看看人类所具有的一些特征,这个特征包括属性(一
4、些参数、数值)及方法(一些行为,他能干什么)。每个人都有身高、体重、年龄、血型等一些属性。还有人会劳动、人都会直立行走、人都会用自己的头脑去创造工具等方法。人之所以能区别于其他类型的动物,是因为每个人都具有人这个群体的属性与方法。“人类”只是一个抽象的概念,它仅仅是一个概念,它是不存在的实体。但是所有具备“人类”这个群体的属性与方法的对象都叫人。这个对象“人”是实际存在的实体。每个人都是人这个群体的一个对象。老虎为什么不是人?因为它不具备人这个群体的属性与方法,老虎不会直立行走,不会使用工具等,所以说老虎不是人。由此可见,类描述了一组有相同特性(属性)和相同行为(方法)的对象。在程序中,类实际
5、上就是数据类型,例如,整数、小数等。整数也有一组特性和行为。面向过程的语言与面向对象的语言的区别就在于,面向过程的语言不允许程序员自己定义数据类型,而只能使用程序中内置的数据类型。而为了模拟真实世界,为了更好地解决问题,我们需往往要创建解决问题所必需的数据类型。面向对象编程为我们提供了解决方案。以下的考题来自真实的笔试资料,希望读者先不要看答案,自我解答后再与答案加以比对,找出自己的不足。11.1 面向对象的基本概念面向对象的基本概念 面试例题面试例题 1:对象与实例有什么区别?解析:在 Java 的内存分配中,对象和实例是不同的,前者分配在内存堆里,后者分配在堆栈里,至于为什么要这样分,参考
6、一下其他的资料。对象是不变的东西,它是对客观事物的抽象,实例是对操作对象的引用,你不能直接操作对象。答案:答案:对象和实例从宏观的角度看,区别是:对象是同类事物的一种抽象表现形式,而实例是对象的具体化,一个对象可以实例化很多实例,对象就是一个模型,实例是照着这个模型生产的最终产品。实际上就是这样,一个对象可以实例化 N 个实例。就像根据一个模型可以制造多个实际的产品一样。从内存分配的角度来看,对象是保存在堆中的,而实例是存储在栈中的,实例其实只是对象的一个引用,也就是指向对象的指针。面试例题面试例题 2:Java 中所有的类都继承了 java.lang.Object 类,而在 C+中没有像 j
7、ava.lang.Object这样的类,这是为什么呢?都是面向对象,Java 这样做有什么好处呢?解析:Java 采用的是单根结构,所有的类都继承了 java.lang.Object 类。对于 Java 这种纯面向对象的语言来说,这种设计具有很好的灵活性,比如对垃圾收集来说很有利,所有的类都具有 java.lang.Object 类具有的方法等。C+没有更多这样的方法,大概是为了向后兼容。向 C 兼容,满足它设计上最大的灵活性。答案:答案:C+的特点是指针,一个指针可以指向任何的对象、结构、基本类型、函数。Java 没有指针类型,所以 Java 用 Object 基础类的共同特征来实现所有对象
8、类型之间的转换。面试例题 3:声明与定义之间的区别是什么?在 Java 里声明和定义能否分开?解析:解析:声明:一种把一个名称引入或者重新引入到某个作用域的构造。定义:它也是一种声明,但该声明必须给出被声明实体的细节。对于变量而言,这里的细节是指:为被声明实体保留存储空间。对于 class 类型和函数定义而言,指的是包含有一对花括号内容的声明。对于外部变量而言,指的是前面没有关键字 extern 或者在声明时就进行初始化。变量的声明有以下两种情况:一种是需要建立存储空间的。例如,int a 在声明的时候就已经建立了存储空间。另一种是不需要建立存储空间的,例如,extern int a。其中,变
9、量 a 是在别的文件中定义的。前者是“定义性声明(defining declaration)”,或者称为“定义(definition)”,而后者是“引用性声明(referencing declaration)”。从广义的角度来讲,声明中包含着定义,但是并非所有的声明都是定义,例如 int a,它既是声明,同时又是定义。然而对于 extern a来讲,它只是声明不是定义。在一般的情况下我们常常这样叙述,把建立空间的声明称为“定义”,而把不需要建立存储空间的声明称为“声明”。很明显在这里指的声明的范围是比较窄的,也就是说非定义性质的声明。答案:答案:变量的定义和声明的区别在于是否分配内存,如果分配
10、内存就是定义,否则就是声明。类中的变量只是声明而不是定义,因为它只是类声明的一部分。不同于变量的定义,类的定义是一种新的类型的定义,只有实例化后才会分配内存。所以类成员变量只是声明而不是定义。在 Java 中,利用 Interface,也可以将声明和实现分开。如下所示。/MyInterface.java public interface MyInterface void method();/MyImpl.java public class implements MyInterface public void method()/面试例题面试例题 4:Which is incorrect abou
11、t the class?(关于类的描述下面哪个是错误的?)金山公司 2005 年面试题 AA class is a blueprint to objects.BWe use the keyword class to create a class construct.COnce a class is declared,the class name becomes a type name and can be used to declare variables.D The class is same as the struct,and there are no different between
12、class and struct.解析:解析:这道题的考点是类的概念。答案:答案:D 面试例题面试例题 5:Which is incorrect about the OOP?(下面关于面向对象技术的叙述哪个是错误的?)金山公司 2005 年面试题 AThe central idea of OOP is to build programs using software objects.BThe OOP focuses mainly on the step-by-step procedure as procedure-oriented programing.CThe OOP offers many
13、 advantages:simplicity,modularity,modifiability,extensibility,and so on.DThe key concept of object orientation is the attachment of procedure to data.解析解析:OOP 的概念面试例题。面向对象和面向过程不能混为一谈。答案答案:B,D 11.2 类和对象类和对象 面试例题 1:以下代码编译时会产生错误的是_。Trend 公司 2005 年面试题 class reverseIt4 public static void main(String args
14、)EnclosingClass jb2;/-1 System.out.println(jb2.m);/-2 class EnclosingClass /-3 public int m=6;class InnerClass /-4 int msquare;InnerClass()msquare=m*m;A语句 1 B语句 2 C语句 3 D语句 4 解析:语句 3 和语句 4 显然是正确的,尽管它们的描述不是那么规范(存在一个类中的类)。语句 1 声明了一个类,但是没有做定义,于是问题就出现了。声明好比只是告诉编译器有一个人,但是如果不定义,这个人就是个抽象的人,没有身高、体重、年龄、职业的“空
15、”人。所以定义对象必须在声明的同时给它定义。正确的程序如下。class reverseIt4 public static void main(String args)EnclosingClass jb=new EnclosingClass();System.out.println(jb.m);class EnclosingClass public int m=6;class InnerClass int msquare;InnerClass()msquare=m*m;答案:该题是问编译在哪儿出现问题,尽管问题出在 1 处,但编译器不会发现,编译器只有在 2 处才会发现问题。所以答案选 B。面试
16、例题 2:Object 是所有类的父类,任何类都默认继承 Object。Object 类到底实现了哪些方法?答案:1clone 方法方法 保护方法,实现对象的浅复制,只有实现了 Cloneable 接口才可以调用该方法,否则抛出CloneNotSupportedException 异常。2getClass 方法方法 final 方法,获得运行时类型。3toString 方法方法 该方法用得比较多,一般子类都有覆盖。4finalize 方法方法 该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。5equals 方法方法 该方法是非常重要的一个方法。一般 equals 和=是不一样的
17、,但是在 Object 中两者是一样的。子类一般都要重写这个方法。6hashCode 方法方法 该方法用于哈希查找,重写了 equals 方法一般都要重写 hashCode 方法。这个方法在一些具有哈希功能的 Collection 中用到。一般必须满足 obj1.equals(obj2)=true。可以推出 obj1.hash-Code()=obj2.hashCode(),但是 hashCode 相等不一定就满足 equals。不过为了提高效率,应该尽量使上面两个条件接近等价。7wait 方法方法 wait 方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。
18、wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。调用该方法后当前线程进入睡眠状态,直到以下事件发生。(1)其他线程调用了该对象的 notify 方法。(2)其他线程调用了该对象的 notifyAll 方法。(3)其他线程调用了 interrupt 中断该线程。(4)时间间隔到了。此时该线程就可以被调度了,如果是被中断的话就抛出一个 InterruptedException 异常。8notify 方法方法 该方法唤醒在该对象上等待的某个线程。9notifyAll 方法方法 该方法唤醒在该对象上等待的所有线程。
19、11.3 嵌套类嵌套类 面试例题面试例题 1:请说明 static nested class 和 inner class 的不同。答案:答案:1nested(嵌套)class(一般是 C+的说法)nested class 是合成型聚集关系(Composite Aggregation)的另一种表达方式,也就是说nested class 也可以用 Aggregation 表达出来。但是,nested class 更加精确地表达了一种专用的、紧耦合的关系,尤其在代码生成时,nested class 在 Java 中映射成 inline class。比如,计算机专用开关电源类可以作为计算机类的 nes
20、ted class,但是,电池组类就不一定适合作为计算机类的 nested class,因为,电池组类表述的是一个过于通用的对象,可能还被包含(Aggregation)于模型中的其他设备对象。class A nested in class B,则说明 A是一个 nested class,一般 A 是用来完成 B 中的某种重要功能的。2inner class(一般是 Java 的说法)Java 内部类与 C+嵌套类最大的不同就在于是否有指向外部的引用上。静态内部类(inner class)意味着:创建一个 static 内部类的对象,不需要一个外部类对象;不能从一个 static 内部类的一个对
21、象访问一个外部类对象。面试例题 2:关于下面类的定义,以下哪种说法是正确的?研华科技 2005 年 11 月面试题 public class Droitwich class one private class two public void main()System.out.println(two);A此代码不能编译成功,因为该类嵌套了不止一层 B此代码不能编译通过,因为 class two 是私有的 C此代码可以编译通过,并且在运行的时候输出字符串 two D此代码编译没有错误 解析:解析:内部类或嵌套类在类层级上没有限制,所以选项 A 是错误的。内部类可以是私有类,所以选项 B 也是错误的
22、。选项 C 的 main 方法不是 public static void main 的,并且假设命令行是 java Droitwich,它不能在任何地方被调用。答案:答案:D 第第 12 章章 继承与接口继承与接口 接口在实际语言,如 Delphi、Java、C+等中,都有广义和狭义之分,这很重要,以前就是因为没明白接口的广义和狭义之分,始终没能真正理解接口的真正意义。广义接口从一般意义上说,凡是一个类提供给外部使用的部分都可以被称为接口。但是在引入继承和抽象类之前,这个广义接口并没有太大意义。广义接口的真正意义是在类的继承中体现多态的功能,这种接口又被称为抽象类接口。狭义接口是指特定的函数集
23、合,一般是用 interface(Delphi)声明的,它表示一个方法集合,这个集合被称为一个命名接口。一个命名接口中的方法必须在一个类中实现后才能被使用,一个类继承实现一个接口,称为这个类实现了该接口,一个接口可以被多个类实现,一个类也可以继承多个接口,这样就形成了一种灵活的接口调用方式,从而实现更加灵活和节省资源的多态。从上述认识来看,接口实际上是结合着多态而来的,它的最大的任务就是实现多态。而多态又是面向对象最精华的理论,掌握了多态,也就掌握了面向对象的精髓。但掌握多态必须先理解和掌握接口,只有充分理解接口的意义,才能更好地应用多态。在面试过程中,各大企业会考量你对虚函数、纯虚函数、私有
24、继承、多重继承等知识点的掌握程度。因此,这是本书比较难掌握的一章。12.1 基础知识基础知识 面试例题面试例题 1:下面哪一项说法是正确的?A在一个子类中一个方法不是 public 的就不能被重载 B覆盖一个方法只需要满足相同的方法名和参数类型就可以了 C覆盖一个方法必须需要相同的方法名参数和返回类型 D一个覆盖的方法必须有相同的方法名、参数名和参数类型 解析:对于在同一可访问区内被声明的几个具有不同参数列(参数的类型、个数、顺序不同)的同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制叫重载,重载不关心函数的返回值类型。覆盖是指派生类中存在重新定义的函数,其函数名、参数列、返回
25、值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本,这种机制就叫做覆盖。成员函数被重载的特征如下。(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。覆盖的特征如下。(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有 virtual 关键字。答案:C 面试例题面试例题 2:下面的说法中哪项是正确的?A静态方法不能被覆盖成非静态的方法 B静态方法不能被声
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 程序员 面试 宝典
限制150内