Java面试宝典2011版.pdf
《Java面试宝典2011版.pdf》由会员分享,可在线阅读,更多相关《Java面试宝典2011版.pdf(129页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java面试宝典2011版余了。3、说说&和&的区别。&和&都可以用作逻辑与的运算符,表示逻辑与(a n d),当运算符两边的表达式的结果都为true时,整个运算结果才为true,另外,我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。int arr=l,2,3),4,5,6,7,9);boolean found=false;for(int i=0;iarr.length&!found;i+)for(int j=0;j arri.length;j+)System.out.println(4ti=M+i+”,j=+j
2、);if(arriU=5)found=true;break;)5、switch语句能否作用在byte上,能否作用在long上,能否作用在String?在switch(exprl)中,exprl只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为in t,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。6、short si=1;si=si+1;有什么错?shor
3、t si=1;si+=1;有什么错?对于$11011$1=1;51=$1+1;由于sl+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s i时,编译器将报告需要强制转换类型的错误。对于$11011$1=1;$1+=1;由于+=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。7、char型变量中能不能存贮一个中文汉字?为什么?char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char
4、型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。备注:后面一部分回答虽然不是在正面回答题目,但是,为了展现自己的学识和表现自己对问题理解的透彻深入,可以回答一些相关的知识,做到知无不言,言无不尽。8、用最有效率的方法算出2 乘以8 等於几?2 3,因为将 个数左移n位,就相当于乘以了 2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 构造器 Constructor 是否可被 override?构造器Constructor不能被继承,因此不能重写Ove
5、rride,但可以被重载Overload。20、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?抽象类中是否可以有静态的main方法?接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承具体类。抽象类中可以有静态的m ain方法。备注:只要明白了接口和抽象类的本质和作用,这些问题都很好回答,你想想,如果你是java语言的设计者,你是否会提供这样的支持,如果不提供的话,有什么理由吗?如果你没有道理不提供,那答案就是肯定的了。只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstrac
6、t方法。21、写clone。方法时,通常都有一行代码,是什么?clo n e有缺省行为,superdoneO;因为首先要把父类中的成员复制到位,然后才是复制自己的成员。22、面向对象的特征有哪些方面计算机软件系统是现实生活中的业务在计算机中的映射,而现实生活中的业务其实就是一个个对象协作的过程。面向对象编程就是按现实业务一样的方式将程序代码按一个个对象进行组织和编写,让计算机系统能够识别和理解用对象方式组织和编写的程序代码,这样就可以把现实生活中的业务对象映射到计算机系统中。面向对象的编程语言有,吗 等4个主要的特征。1封装:封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部
7、件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,而向对象的封装比传统语言的封装更为清晰、更为有力。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同 个对象中的属性。通常情况下,只要记住让变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义成私有的,只有这个类自己的方法才可以访问到这些成员变量,这就基本上实现对象的封装,就很容易找出要分配到这个类上的方法了,就基本上算是会面向对象的编程了。把握一个原则:把对同一事物进行操作的方法和相关
8、的方法放在同一个类中,把方法和它操作的数据放在同一个类中。例如,人要在黑板上画圆,这一共涉及三个对象:人、黑板、圆,画圆的方法要分配给哪个对象呢?由于画圆需要使用到圆心和半径,圆心和半径显然是圆的属性,如果将它们在类中定义成了私有的成员变量,那么,画圆的方法必须分配给圆,它才能访问到圆心和半径这两个属性,人以后只是调用圆的画圆方法、表示给圆发给消息而已,画圆这个方法不应该分配在人这个对象上,这就是面向对象的封装性,即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。个更便于理解的例子就是,司机将火车刹住了,刹车的动作是分配给司机,还是分配给火车
9、,显然,应该分配给火车,因为司机自身是不可能有那么大的力气将一个火车给停下来的,只有火车自己才能完成这动作,火车需要调用内部的离合游和刹车片等多个器件协作才能完成刹车这个动作,司机刹车的过程只是给火车发了一个消息,通知火车要执行刹车动作而已。抽象:抽象就是找出一些事物的相似和共性之处,然后揩这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。抽象包括行为抽象和状态抽象两个方面。例如,定义一个Person类,如下:class PersonStrin
10、g name;int age;)人本来是很复杂的事物,有很多方面,但因为当前系统只需要了解人的姓名和年龄,所以上面定义的类中只包含姓名和年龄这两个属性,这就是一种抽像,使用抽象可以避免考虑一些与目标无关的细节。我对抽象的理解就是不要用显微镜去看一个事物的所有方面,这样涉及的内容就太多了,而是要善于划分问题的边界,当前系统需要什么,就只考虑什么。继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,
11、提高了软件的可重用性和可扩展性。多态:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。例 如,下 面 代 码 中 的UserDao是一个接口
12、,它 定 义 引 用 变 量userDao指向的实例对象由daofactory.getDao。在执行的时候返回,有 时 候 指 向 的 是UserJdbcDao这个实 现,有时候指向的 是UserHibernateDao这个实现,这 样,不用修改源代码,就 可 以 改 变userDao指向的具体类实现,从 而 导 致userDao.insertUser。方法调用的具体代码也随之改变,即有时候调用的是UserJdbcDao 的 insertUser 方 法,有时候调用的是 UserHibernateDao 的 insertUser 方 法:UserDao userDao=daofactory.g
13、etDao();userDao.insertUser(user);比喻:人吃 饭,你看到的是左手,还是右手?23、java中实现多态的机制是什么?靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。24、abstract class 和 interface 有什么区别?含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstra
14、ct class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。接 口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类 型,接口中的成员变量类型默认为public static final,下面比较一下两者的语法区别:1.抽象类可以有构造方法,接口中不能有构造方法。2.抽象类中可以有普通成员变量,接口中没有普通成员变量3.
15、抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。4.抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为publicabstract 类型。5.抽象类中可以包含静态方法,接口中不能包含静态方法6.抽象类和接口中都可以包含静态成员变星:,抽象类中的苗,态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。7.一个类可以实现多个接口
16、,但只能继承一个抽象类。下面接着再说说两者在应用上的区别:接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下:public abstract class BaseServlet extends H
17、ttpScrvletfpublic final void service(HttpServletRequest request,HttpServletResponse response)throwsIOExcetion,ServletException 记录访问日志进行权限判断if(具有权限乂try(doService(request,response);)catch(Excetpion e)(记录异常信息)protected abstract void doService(HttpServlctRequcst request,HttpServletResponse response)thro
18、wsIOExcetion,ServletException;注意访问权限定义成protected,显得既专业,乂严谨,因为它是专门给子类用的public class MyServletl extends BaseServletprotected void doService(HttpServletRequest request,HtlpServletResponse response)throwsIOExcetion,ServletException(本Servlet只处理的具体业务逻辑代码父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。备注:这道题的思路是先从总体解释抽象类和
19、接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。25、abstract的 method是否可同时是static,是否可同时是native,是否可同时是 synchronized?abstract的method不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系!native方法表示该方法要用另外一种依赖平台的编程语言实现的,
20、不存在着被子类实现的问题,所以,它也不能是抽象的,不 能 与abstract混用。例如,FileOutputSteam类要硬件打交道,底层的实现用的是操作系统相关的a p i实现,例如,在windows用c语言实现的,所以,查 看jd k的源代码,可以发现FilcOutputStrcam的open方法的定义如下:private native void open(String name)throws FileNotFoundException;如果我们要用java调用别人写的c语言函数,我们是无法直接调用的,我们需要按照java的 要 求 写 个c语言的函数,又我们的这个c语言函数去调用别人的c
21、语言函数。由于我们的c语言函数是按java的要求来写的,我们这个c语言函数就可以与java对接上,java那边的对接方式就是定义出与我们这个c函数相对应的方法,java中对应的方法不需要写具体的代码,但需要在前面声明nativeo关于synchronized与abstract合用的问题,我觉得也不行,因为在我几年的学习和开发中,从来没见到过这种情况,并 且 我 觉 得synchronized应该是作用在一个具体的方法匕才有意义。而且,方法上的synchronized同步所使用的同步锁对象是th is,而抽象方法上无法确定this是什么。26、什么是内部类?Static Nested Class
22、 和 Inner Class 的不同。内部类就是在一个类的内部定义的类,内部类中不能定义静态成员(静态成员不是对象的特性,只是为了找一个容身之处,所以需要放到个类中而已,这么一点小事,你还要把它放到类内部的一个类中,过分了啊!提供内部类,不是为让你干这种事情,无聊,不让你干。我想可能是既然静态成员类似c语言的全局变量,而内部类通常是用于创建内部对象用的,所以,把“全局变量”放在内部类中就是毫无意义的事情,既然是毫无意义的事情,就应该被禁止),内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中,如下所示:public class Outer(in
23、t out_x=0;public void method()Inner 1 innerl=new Inner 1();public class lnner2 在方法体内部定义的内部类(public method()(out_x=3;)Inner2 inner2=new Inner2();public class Innerl 在方法体外面定义的内部类在方法体外面定义的内部类的访问类型可以是public,protects默认的,private等4种类型,这就好像类中定义的成员变量有4种访问类型一样,它们决定这个内部类的定义对其他类是否可见;对于这种情况,我们也可以在外面创建内部类的实例对象,创建
24、内部类的实例对象时,一定要先创建外部类的实例对象,然后用这个外部类的实例对象去创建内部类的实例对象,代码如卜:Outer outer=new Outer();Outer.Innerl innerl=outer.new Innnerl();在方法内部定义的内部类前面不能有访问类型修饰符,就好像方法中定义的局部变量样,但这种内部类的前面可以使用final或abstract修饰符。这种内部类对其他类是不可见的其他类无法引用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。这种内部类必须是先定义,后使用,即内部类的定义代码必须出现在使用该类之前,这与方法中的局部变量必须先定义后使用的道理也
25、是一样的。这种内部类可以访问方法体中的局部变量,但是,该局部变量前必须加final修饰符。对于这些细节,只要在eclipse写代码试试,根据开发工具提示的各类错误信息就可以马上了解到。在方法体内部还可以采用如下语法来创建一种匿名内部类,即定义某一接口或类的子类的同时,还创建了该子类的实例对象,无需为该子类定义名称:public class Outer(public void start()(new Thread(new Runable()public void run();).start();)最后,在方法外部定义的内部类前面可以加上static关键字,从而成为Static Nested C
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 面试 宝典 2011
限制150内