您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > java程序员面试必备的32个要点1
第一,谈谈final,finally,finalize的区别。final修饰符(关键字),如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载finally再异常处理时提供finally块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。finalize方法名。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。续:final变量不能改变吗?publicclassFirstClass{finalStringBuildersb=newStringBuilder(initfinal......);publicstaticvoidmain(String[]args){FirstClassfc=newFirstClass();System.out.println(fc.sb.toString());fc.sb.append(changed);System.out.println(fc.sb.toString());}}看看能不能改变?不能改变的是这个变量的句柄(的值),也就是它不能再指向其它对象,而指向的对象本身你只要有方法就可以任意改变.final方法不能重载吗?publicclassFirstClass{finalStringBuildersb=newStringBuilder(initfinal......);finalvoida(){}voida(Stringa){}publicstaticvoidmain(String[]args)throwsException{FirstClassfc=newFirstClass();fc.a();fc.a();}}只是不能被继承而已finally从句除了在try{}catch(){}中调用了System.exit(x);其它任何时候都会在离开该段之前执行,并不是只有抛出异常,即使return,breaklabel也一样.第二,AnonymousInnerClass(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?答案:可以继承其他类或完成其他接口,在swing编程中常用此方式。第三,StaticNestedClass和InnerClass的不同,说得越多越好(面试题有的很笼统)。1--NestedClass(一般是C++的说法),InnerClass(一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注:静态内部类(InnerClass)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象2--NestedClass一般是C++的说法,InnerClass一般是JAVA的说法。Nestedclass分为静态Staticnestedclass的和非静态的innerclass,静态的Staticnestedclass是不可以直接调用它的外部类enclosingclass的,但是可以通过外部类的引用来调用,就像你在一个类中写了main方法一样。非静态类innerclass可以自由的引用外部类的属性和方法,但是它与一个实例绑定在了以其,不可以定义静态的属性、方法3--1.nested(嵌套)class(一般是C++的说法)nestedclass是合成型聚集关系(CompositeAggregation)的另一种表达方式,也就是说nestedclass也可以用Aggregation表达出来。但是,nestedclass更加精确地表达了一种专用的、紧耦合的关系,尤其在代码生成时,nestedclass在Java中映射成inlineclass。比如,计算机专用开关电源类可以作为计算机类的nestedclass,但是,电池组类就不一定适合作为计算机类的nestedclass,因为,电池组类表述的是一个过于通用的对象,可能还被包含(Aggregation)于模型中的其他设备对象。classAnestedinclassB,则说明A是一个nestedclass,一般A是用来完成B中的某种重要功能的。2.innerclass(一般是Java的说法)Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。静态内部类(innerclass)意味着:创建一个static内部类的对象,不需要一个外部类对象;不能从一个static内部类的一个对象访问一个外部类对象。关于下面类的定义,以下哪种说法是正确的?[研华科技2005年11月面试题]publicclassDroitwich{classone{privateclasstwo{publicvoidmain(){System.out.println(two);}}}}A.此代码不能编译成功,因为该类嵌套了不止一层B.此代码不能编译通过,因为classtwo是私有的C.此代码可以编译通过,并且在运行的时候输出字符串twoD.此代码编译没有错误解析:内部类或嵌套类在类层级上没有限制,所以选项A是错误的。内部类可以是私有类,所以选项B也是错误的。选项C的main方法不是publicstaticvoidmain的,并且假设命令行是javaDroitwich,它不能在任何地方被调用。答案:D第四,&和&&的区别。1.&是位运算符,&&是布尔逻辑运算符2.&是非短路逻辑运算符,&&是短路逻辑运算符3.我们老师的说法:&既是逻辑运算符,又是位运算符,当&作为逻辑运算符时属于非短路型,而&&只是短路型逻辑运算符问题补充://这是我们老师讲逻辑运算符时举的例子,结果b=13,c=4publicclassTestLogic{publicstaticvoidmain(String[]args){inta=2,b=3,c=4;if(a2&(b=13)10)System.out.println(不可能!);if(a2&&(c=14)10)System.out.println(不可能!);System.out.println(b=+b);System.out.println(c=+c);}}-----只有1对。&是位运算符,&&是布尔逻辑运算符而且是短路与操作符。注意:&就根本不应该作为逻辑运算用的。所谓的可以作为逻辑运算实际上是判断运算的结果是不是等于0,而由于要进行逻辑与操作,必须先要求出两边操作数的值(这个就好像是非短路了)。不过这不是java语言所支持的,混淆了和C的区别。绝对错误的概念。------&和&&都可作为逻辑运算符“与”使用,但是&&是“短路与”,运算时先判断符号前面的表达式的值,如果能够确定整个表达式的值,则不进行符号后面的表达式的运算,如果是“&”则前后都必须进行判断。另外,&也可作为位运算符使用。eg:publicclassTest{publicstaticvoidmain(Stringargs[]){Stringstr=null;if(str!=null&str.length()0){System.out.println(hahha);}else{System.out.println(hehe);}}}A:hahaB:heheC:编译错误D:运行时异常str.length()会报空指针异常,如果用&&则会输出“hehe”-----&单与单与前后逻辑表达式都执行if((a++0)&(b--0)){}表达式1:a++0与表达式2:b--0-------------------------执行返回true或false之后,按照同真则真,有假则假------------------------返回boolean值&&双与-------双与先判断表达式1,若表达式1为false则表达式2不再执行----------------------直接返回false,若表达式2为true则再执行表达式2之后按照同真则真,有假则假----------------返回boolean值.|与||的区别:与上述正好相反(可以自己试一试)单与&的特殊用法:n1%n2==n1&(n2-1)主要用在移位运算,求余数(大家可以试一试)第五,HashMap和Hashtable的区别。HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。3.HashTable有一个contains(Objectvalue),功能和containsValue(Objectvalue)功能一样。4.HashTable使用Enumeration,HashMap使用Iterator。以上只是表面的不同,它们的实现也有很大的不同。5.HashTable中hash数组默认大小是11,增加的方式是old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:inthash=key.hashCode();intindex=(hash&0x7FFFFFFF)%tab.length;而HashMap重新计算hash值,而且用与代替求模:inthash=hash(k);inti=indexFor(hash,table.length);staticinthash(Objectx){inth=x.hashCode();h+=~(h9);h^=(h14);h+=(h4);h^=(h10);returnh;}staticintindexFor(inth,intlength){returnh&(length-1);}以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如HashMap对null的操作2--Hashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现。也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。一个方便的方法就是利用Collections类的静态的synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时,你不能切断Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。第三点不同是,只有HashMap可以让你将空值作为一个表
本文标题:java程序员面试必备的32个要点1
链接地址:https://www.777doc.com/doc-4964749 .html