java面试题全集(一)
相信有一些朋友和我一样的想法,平时看起来写代码很溜,或者说没有什么太大的问题。但是面试题就是往答打不出来。最起码在最开始学习java的时候,我自己就是这样:所以就个人平时需要的java的面试题做了如下总结,愿对各位亲们有所帮助:
1、面向对象的特征有哪些方面?
答:面向对象的特征主要有如下几个方面:
(1)、抽象:抽象是将一类对象的公共特征总结出来构造类的过程,包括数据抽象和行为抽象两个方面。抽象只关注对
象 有哪些属性和行为,而并不关注具体的行为细节是什么。
(2)、继承:继承是从已存在的类得到继承信息并创建新类的过程。提供继承信息的类称为父类(超类、基类),而得
到继承信息的类称为子类(派生类)。
(3)、封装:通常认为封装就是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本
质就是将现实世界描绘成一系列完全自治、封闭的对象。
(4)、多态:多态性是指允许不同子类型的对象对同一消息做出不同响应。简单的来说就是用同样的对象引用调用同样的方
法但是做了不同的事情。
2、访问修饰符public、private、protected,以及不写(默认)时的区别?
答:
修饰符 | 当前类 | 同包 | 子类 | 其他包 |
public | 是 | 是 | 是 | 是 |
protected | 是 | 是 | 是 | 否 |
default | 是 | 是 | 否 | 否 |
private | 是 | 否 | 否 | 否 |
类的成员不写访问修饰符是默认的是default。默认对于同包中的其他类可以调用(相当于公开的public),对于不是同一个包的其他类不可以调用(相当于私有的private)。其他请参考上图:“是”代表的是公开的,“否”代表的是不公开(私有)的。
3、String是最基本的数据类型吗?
答:不是,java中的基本类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(eunmeration type),剩下的都是引用类型(reference type)。
4、float f=3.4;时候正确?
答:不正确,float是双精度数,而float属于浮点型。正确应该是 float f=3.4f;
5、short s1=1; s1=s1+1;有错吗?s1+=1;有错吗?
答:前者有错,因为1是int类型的,s1是short类型的,两者相加后的结果是int型,应该强转。正确应该为:s1=(short)s1+1;
后者没错,可以正确编译,因为+=运算符中有隐含的强转类型转换。
6、java中有没有goto?
答:goto是java这种的保留字,在目前版本中java没有使用。
7、int和Integer有什么区别。
答:Integer是int的包装类型,使得两者可以转换。java为每个基本类型都提供了包装类型:
基本类型 | 包装类型 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
8、Integer f1=100,f2=100,s1=150,s2=150; f1=f2;对吗?s1=s2;对吗?
答:f1=f2;对,s1=s2;不对。因为Integer的范围在-128—127之间时,不会new Integer对象,而是直接引用常量池中的Integer。所以前者对,后者不对。
9、&和&&的区别?
答:&运算符有两种用法:1)、按位与;2)、逻辑与。&&运算符是短路运算,也就是说只要遇到结果为false的时候就不会再往下进行。而&则相反。
10、解释内存中的栈(stack)、堆(heap)、静态区(static area)的用法?
答:通常我们定义一个基本的数据类型变量,一个对象的引用,还有就是函数调用的现场保存都是用的是内存的栈空间,而通过new关键字和构造器创建的对象放在堆空间中,程序中的字面量(literal)和直接书写的100,"hello"都是放在静态区的。栈空间操作起来最快,但是栈很小。通常大量的对象都是放在堆空间中,理论上整个内存没有被其他的进程使用的空间甚至硬盘上的虚拟内存都可以被当做堆空间使用。
String str =new String("hello");
上面的语句中str是存放在栈空间中,用new创建出来的字符串对象放在堆空间上,而"hello"这个字面量放在静态区里面。
11、Math.round(9.5)和Math.round(-9.5)分别等于多少?
答:Math.round(9.5)=10
Math.round(-9.5)=-9四舍五入的原理是在参数上加0.5在进行取整。
12、switch是否可以作用在byte上,是否可以作用在long上,时候可以作用在String上?
答:在java5以前,在switch(expr)中,expr只能是byte,short,char,int。从java5开始,java中引入了枚举类型,expr也可以还是枚举类型,从java7开始,expr还可以是String类型,但是long类型在目前所有的版本中都是不可以的。
13、用最有效的方法计算2乘以8?
2<<3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。
14、数组有没有length()方法?String有没有length()方法?
答:数组中没有length()方法,有length属性。String有length()方法。
15、构造器(constructor)是否可被重写(override)?
答:构造器不能被继承,所以也就不能被重写,但是可以被重载。
16、两个对象值相同(x.equals(y)==true),但是可以有不同的hash code,这句话对不对?
答:不对,如果两个对象x和y满足x.equals(y)==true,则它们的哈希码(hash code)也是相同的。java对于hashcode是这样规定的:1)如果两个对象的相同(equals方法返回true)那么 他们的hashcode一定相同;2)相反两个对象的hashcode相同他们并不一定相同。
17、String类时候可以被继承?
答:String是final类,所以不能被继承。
18、String和StringBuilder、StringBuffer的区别?
答:java平台提供了两种类型的字符串:String和StringBuilder/StringBuffer,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串是不能被改变的。而StringBuilder/StringBuffer类表示的字符串对象可以直接被修改。StringBuilder是java5引入的,它和StringBuffer的方法完全相同。区别在与它是在单线程环境下面使用的,因为他的所有方面都没有被sysnchronized修饰,因此它的效率也比StringBuffer要高。
19、重载(overload)和重写(override)的区别。重载的方法能否根据返回类型进行区分?
答:方法的重载和重写都是实现多态的方式。区别在于重载实现的是编译时的多态性,而重写实现的是运行时的多态性。重载是发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好的访问,不能比父类被重写的方法声明的更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。
20、描述一下JVM加载class文件的原理机制?
答:JVM中类的加载时由类加载器(ClassLoader)和它的子类来实现的,java中类加载器是重要的运行时系统组件,它负责在运行时查找和装入类文件中的类。
21、char型变量中能否储存一个中文汉字,为什么?
答:char可以储存一个中文汉字,因为java使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。
22、抽象类(abstract class)和接口(interface)有什么异同?
答:相同点:
1)抽象类和接口都不能实例化,但可以定义抽象类和接口类型的引用。
2)一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。
不同点:
1)接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。
2)抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全部都是public的。
3)抽象类中可以定义成员变量,而接口中定义的成类,而抽象类未必要有抽象方法。
23、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
Static Nested Classs是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。
24、什么是java构造器?
构造器是为了创建一个类的实例。这个过程也可以在创建一个对象的时候用到:Platypus p1 = new Platypus();
相反,方法的作用是为了执行java代码。
修饰符,返回值和命名的不同
构造器和方法在下面三个方便的区别:修饰符,返回值,命名。和方法一样,构造器可以有任何访问的修饰: public, protected, private或者没有修饰(通常被package 和 friendly调用). 不同于方法的是,构造器不能有以下非访问性质的修饰: abstract, final, native, static, 或者 synchronized。
返回类型也是非常重要的。方法能返回任何类型的值或者无返回值(void),构造器没有返回值,也不需要void。
最后,谈谈两者的命名。构造器使用和类相同的名字,而方法则不同。按照习惯,方法通常用小写字母开始,而构造器通常用大写字母开始。构造器通常是一个名词,因为它和类名相同;而方法通常更接近动词,因为它说明一个操作。
“this”的用法
构造器和方法使用关键字this有很大的区别。方法引用this指向正在执行方法的类的实例。静态方法不能使用this关键字,因为静态方法不属于类的实例,所以this也就没有什么东西去指向。构造器的this指向同一个类中,不同参数列表的另外一个构造器
25、java中会存在内存泄漏吗?请简单描述。
答:理论上java因为有垃圾回收机制(GC)不会存在内存泄漏问题(这也是java被广泛使用于服务器端编程的一个重要的原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄漏的发生。例如:hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而和谐对象中可能存在无用的垃圾对象,如果不及时关闭(close)或者清空(flush)一级缓存就可能导致内存泄漏。
26、final,finally以及finlized三者的区别?
答:final:最终的意思,该关键字可以修饰类,成员变量、方法
修饰类:该类不能被继承
修饰变量:该变量为常量
修饰方法:方法不能被重写
finally:是异常处理中的一部分,用于释放资源
finlized:是Object中的一个方法,用于垃圾回收
27、throws和throw的区别?
答:throws:用在方法声明后面,跟的是异常的类名
可以跟多个异常的类名,中间用逗号隔开
表示的是抛出异常,由该方法的调用者处理
throws表示的是一种可能性,并不一定会发生这些异常
throw:用在方法体内,后面跟的是异常对象名称
只能抛出一个异常对象
表示抛出异常,由方法体内的语句进行处理
执行throw是则一定抛出了某种异常
28、如果在finally之前有return,finally里面的语句能否继续执行?在return之前还是之后。下面method方法中的代码执行的结果是多少?
答 :能继续执行,在return之前。确切的应该说是在中间。如以上代码:当执行到catch中的return的时候,a的值很明显是30,但是它发现后面后finally,于是就执行finally里面的语句,a的值也就变成40,当执行完finally之后,又返回到之前的路径,继续走return=30,所以应该是中间,上面的代码的最后结果应该是30,。