首页 > 代码库 > java基础面试题
java基础面试题
1、一个".java"源文件里能否够包含多个类(不是内部类)?有什么限制?
能够有多个类,但仅仅能有一个public的类,而且public的类名必须与文件名称相一致。
2、Java有没有goto?
java中的保留字,如今没有在java中使用。
3、说说&和&&的差别。
&和&&都能够用作逻辑与的运算符,表示逻辑与(and)。当运算符两边的表达式的结果都为true时。整个运算结果才为true,否则。仅仅要有一方为false,则结果为false。
&&还具有短路的功能,即假设第一个表达式为false。则不再计算第二个表达式,比如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会运行,所以不会出现NullPointerException假设将&&改为&。则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长
&还能够用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算。来获取该整数的最低4个bit位,比如,0x31 & 0x0f的结果为0x01。
4、switch语句是否能作用在byte上,是否能作用在long上。是否能作用在String上?
在switch(expr1)中。expr1仅仅能是一个整数表达式或者枚举常量,整数表达式能够是int基本类型或Integer包装类型,因为,byte,short,char都能够隐含转换为int,所以,这些类型以及这些类型的包装类型也是能够的。
显然,long和String类型都不符合switch的语法规定,而且不能被隐式转换成int类型。所以。它们不能作用于swtich语句中。
5、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;
有什么错?
对于short s1 = 1; s1 = s1 + 1; 因为s1+1运算时会自己主动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告须要强制转换类型的错误。
对于short s1 = 1; s1 += 1;因为 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此能够正确编译。
6、char型变量中能不能存贮一个中文汉字?为什么?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包括了汉字,所以,char型变量中当然能够存储汉字啦。
只是,假设某个特殊的汉字没有被包括在unicode编码字符集中。那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
7、使用finalkeyword修饰一个变量时。是引用不能变,还是引用的对象不能变?
使用finalkeyword修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是能够改变的。
比如,对于例如以下语句:
final StringBuffer a=new StringBuffer("immutable");
运行例如以下语句将报告编译期错误:
a=new StringBuffer("");
可是。运行例如以下语句则能够通过编译:
a.append(" broken!");
有人在定义方法的參数时。可能想採用例如以下形式来阻止方法内部改动传进来的參数对象:
public void method(final StringBuffer param){
}
实际上。这是办不到的,在该方法内部仍然能够添加例如以下代码来改动參数对象:
param.append("a");
8、"=="和equals方法到底有什么差别?
“==”操作符专门用来比較两个变量的值是否相等,也就是用于比較变量所相应的内存中所存储的数值是否同样,要比較两个基本类型的数据或两个引用变量是否相等。仅仅能用==操作符。
假设一个变量指向的数据是对象类型的。那么。这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存(栈内存),比如Objet obj = new Object();变量obj是一个内存,new Object()是还有一个内存。此时,变量obj所相应的内存中存储的数值就是对象占用的那块内存的首地址。
对于指向对象类型的变量,假设要比較两个变量是否指向同一个对象。即要看这两个变量所相应的内存中的数值是否相等,这时候就须要用==操作符进行比較。
equals方法是用于比較两个独立对象的内容是否同样,就好比去比較两个人的长相是否同样,它比較的两个对象是独立的。
比如,对于以下的代码:
String a=new String("foo");
String b=new String("foo");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了当中一个对象,这是两个不同的对象。它们的首地址是不同的,即a和b中存储的数值是不同样的,所以,表达式a==b将返回false。而这两个对象中的内容是同样的。所以,表达式a.equals(b)将返回true。
在实际开发中。我们常常要比較传递进行来的字符串内容是否等。比如,String input = …;input.equals(“quit”),很多人稍不注意就使用==进行比較了,这是错误的,记住,字符串的比較基本上都是使用equals方法。
假设一个类没有自定义equals方法,那么它将继承Object类的equals方法。Object类的equals方法的实现代码例如以下:
boolean equals(Object o){
return this==o;
}
这说明,假设一个类没有自定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符。也是在比較两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,假设比較的是两个独立的对象则总返回false。假设你编写的类希望可以比較该类创建的两个实例对象的内容是否同样,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况就可以觉得两个对象的内容是同样的。
9、静态变量和实例变量的差别?
在语法定义上的差别:静态变量前要加statickeyword,而实例变量前则不加。
在程序执行时的差别:实例变量属于某个对象的属性,必须创建了实例对象,当中的实例变量才会被分配空间,才干使用这个实例变量。
静态变量不属于某个实例对象,而是属于类,所以也称为类变量。仅仅要程序载入了类的字节码,不用创建不论什么实例对象,静态变量就会被分配空间。静态变量就能够被使用了。总之。实例变量必须创建对象后才干够通过这个对象来使用,静态变量则能够直接使用类名来引用。
比如,对于以下的程序,不管创建多少个实例对象,永远都仅仅分配了一个staticVar变量。而且每创建一个实例对象,这个staticVar就会加1;可是,每创建一个实例对象,就会分配一个instanceVar。就可以能分配多个instanceVar,而且每一个instanceVar的值都仅仅自加了1次。
public class VariantTest{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest(){
staticVar++;
instanceVar++;
System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
}
}
10、能否够从一个static方法内部发出对非static方法的调用?
不能够。由于非static方法是要与对象关联在一起的,必须创建一个对象后,才干够在该对象上进行方法调用,而static方法调用时不须要创建对象,能够直接调用。也就是说,当一个static方法被调用时,可能还没有创建不论什么实例对象,假设从一个static方法中发出对非static方法的调用。那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以。一个static方法内部不能够发出对非static方法的调用。
11、Integer与int的差别
int是java提供的8种原始数据类型之中的一个。
Java为每一个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer能够区分出未赋值和值为0的差别,int则无法表达出未赋值的情况,比如。要想表达出没有參加考试和考试成绩为0的差别。则仅仅能使用Integer。在JSP开发中。Integer的默觉得null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0。所以,int不适合作为web层的表单数据的类型。
在Hibernate中,假设将OID定义为Integer类型,那么Hibernate就能够依据其值是否为null而推断一个对象是否是暂时的,假设将OID定义为了int类型。还须要在hbm映射文件里设置其unsaved-value属性为0。
另外,Integer提供了多个与整数相关的操作方法。比如。将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。
12、请说出作用域public,private,protected,以及不写时的差别
这四个作用域的可见范围例如以下表所看到的。
说明:假设在修饰的元素上面没有写不论什么訪问修饰符。则表示friendly。
13、Overload和Override的差别。Overloaded的方法能否够改变返回值的类型?
Overload是重载的意思。Override是覆盖的意思,也就是重写。
重载Overload表示同一个类中能够有多个名称同样的方法。但这些方法的參数列表各不同样(即參数个数或类型不同)。
重写Override表示子类中的方法能够与父类中的某个方法的名称和參数全然同样。通过子类创建的实例对象调用这种方法时,将调用子类中的定义方法。这相当于把父类中定义的那个全然同样的方法给覆盖了,这也是面向对象编程的多态性的一种表现。
子类覆盖父类的方法时,仅仅能比父类抛出更少的异常。或者是抛出父类抛出的异常的子异常。由于子类能够解决父类的一些问题。不能比父类有很多其它的问题。子类方法的訪问权限仅仅能比父类的更大,不能更小。假设父类的方法是private类型。那么,子类则不存在覆盖的限制,相当于子类中添加了一个全新的方法。
至于Overloaded的方法能否够改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目非常模糊。
假设几个Overloaded的方法的參数列表不一样,它们的返回者类型当然也能够不一样。但我预计你想问的问题是:假设两个方法的參数列表全然一样,能否够让它们的返回值不同来实现重载Overload?这是不行的,我们能够用反证法来说明这个问题,由于我们有时候调用一个方法时也能够不定义返回结果变量。即不要关心其返回结果,比如,我们调用map.remove(key)方法时,尽管remove方法有返回值,可是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和參数列表全然同样的方法,不过返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,由于它无法通过返回结果类型来推断。
override能够翻译为覆盖。从字面就能够知道,它是覆盖了一个方法而且对其重写。以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般仅仅是对方法进行了声明,而我们在实现时。就须要实现接口声明的全部方法。除了这个典型的使用方法以外。我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意下面的几点:
1、覆盖的方法的标志必需要和被覆盖的方法的标志全然匹配,才干达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中仅仅是新定义了一个方法,并没有对其进行覆盖。
overload对我们来说可能比較熟悉,能够翻译为重载,它是指我们能够定义一些名称同样的方法,通过定义不同的输入參数来区分这些方法,然后再调用时。VM就会依据不同的參数样式,来选择合适的方法运行。
在使用重载要注意下面的几点:
- 在使用重载时仅仅能通过不同的參数样式。比如,不同的參数类型,不同的參数个数。不同的參数顺序(当然。同一方法内的几个參数类型必须不一样。比如能够是fun(int,float),可是不能为fun(int,int));
- 不能通过訪问权限、返回类型、抛出的异常进行重载;
- 方法的异常类型和数目不会对重载造成影响;
- 对于继承来说,假设某一方法在父类中是訪问权限是priavte,那么就不能在子类对其进行重载,假设定义的话,也仅仅是定义了一个新方法,而不会达到重载的效果。
14、has a与is a的差别
is-a表示的是属于的关系。比方兔子属于一种动物(继承关系)。
has-a表示组合,包括关系。
比方兔子包括有腿。头等组件。
15、ClassLoader怎样载入class?
jvm里有多个类载入器,每一个类载入器能够负责载入特定位置的类,比如。bootstrap类载入负责载入jre/lib/rt.jar中的类, 我们平时用的jdk中的类都位于rt.jar中。extclassloader负责载入jar/lib/ext/*.jar中的类。appclassloader负责classpath指定的文件夹或jar中的类。
除了bootstrap之外,其它的类载入器本身也都是java类。它们的父类是ClassLoader。
16、分层设计的优点
把各个功能按调用流程进行了模块化。模块化带来的优点就是能够任意组合。举例说明:假设要注冊一个用户。流程为显示界面并通过界面接收用户的输入。接着进行业务逻辑处理,在处理业务逻辑又訪问数据库,假设我们将这些步骤所有按流水帐的方式放在一个方法中编写,这也是能够的,但这当中的坏处就是,当界面要改动时,因为代码全在一个方法内,可能会碰坏业务逻辑和数据库訪问的码。相同,当改动业务逻辑或数据库訪问的代码时,也会碰坏其它部分的代码。分层就是要把界面部分、业务逻辑部分、数据库訪问部分的代码放在各自独立的方法或类中编写,这样就不会出现牵一发而动全身的问题了。这样分层后,还能够方便切换各层,譬如原来的界面是Swing。如今要改成BS界面。假设最初是按分层设计的,这时候不须要涉及业务和数据訪问的代码。仅仅需编写一条web界面就能够了。
分层的优点:
1.实现了软件之间的解耦。
2.便于进行分工
3.便于维护
4.提高软件组件的重用
5.便于替换某种产品,比方持久层用的是hibernate,须要更换产品用toplink。就不用该其它业务代码。直接把配置一改。
6.便于产品功能的扩展。
7.便于适用用户需求的不断变化
17、hashCode方法的作用?
hashcode这种方法是用来鉴定2个对象是否相等的。
equals方法和hashCode方法这2个方法都是用来推断2个对象是否相等的,可是他们是有差别的。
一般来讲。equals这种方法是给用户调用的。假设你想推断2个对象是否相等,你能够重写equals方法,然后在代码中调用,就能够推断他们是否相等了。简单来讲,equals方法主要是用来推断从表面上看或者从内容上看,2个对象是不是相等。举个样例,有个学生类,属性仅仅有姓名和性别,那么我们能够觉得仅仅要姓名和性别相等。那么就说这2个对象是相等的。
hashcode方法一般用户不会去调用,比方在hashmap中,因为key是不能够反复的,他在推断key是不是反复的时候就推断了hashcode这种方法,并且也用到了equals方法。这里不能够反复是说equals和hashcode仅仅要有一个不等就能够了!所以简单来讲,hashcode相当于是一个对象的编码,就好像文件里的md5。他和equals不同就在于他返回的是int型的。比較起来不直观。我们一般在覆盖equals的同一时候也要覆盖hashcode,让他们的逻辑一致。
举个样例,还是刚刚的样例。假设姓名和性别相等就算2个对象相等的话。那么hashcode的方法也要返回姓名的hashcode值加上性别的hashcode值,这样从逻辑上,他们就一致了。
要从物理上推断2个对象是否相等,用==就能够了,假设两个对象的物理(内存)地址相等,那么这两个对象肯定就是同一个对象。
18、什么是AOP?
1.AOP概念介绍
所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程。
面向切面编程Aspect-Orlented-Programming。即AOP是对面向对象的思维方式的有力补充。
AOP的优点是能够动态地加入和删除在切面上的逻辑而不影响原来的运行代码
2.解释什么是方面(切面)
所谓方面(切面),指的是贯穿到系统的各个模块中的系统一个功能就是一个方面(切面)。比方,记录日志,统一异常处理,事务处理,权限检查,这些功能都是软件系统的一个面,而不是一点,在各个模块中都要出现。
3.什么是面向方面编程
把系统的一个方面的功能封装成对象的形式来处理就是面向方面(切面)编程
4.怎么进行面向方面编程
把功能模块相应的对象作为切面嵌入到原来的各个系统模块中。採用代理技术,代理会调用目标。同一时候把切面功能的代码(对象)增加进来。所以,用spring配置代理对象时仅仅要要配两个属性,分别表示目标和切面对象(Advisor)。
19.谈谈你对mvc的理解
MVC是Model—View—Controler的简称。
即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。
MVC中的模型、视图、控制器它们分别担负着不同的任务。
- 视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行不论什么业务逻辑处理。
- 模型: 模型表示业务数据和业务处理。
相当于JavaBean。
一个模型能为多个视图提供数据。这提高了应用程序的重用性
- 控制器: 当用户单击Web页面中的提交button时,控制器接受请求并调用对应的模型去处理请求。然后依据处理的结果调用对应的视图来显示处理的结果。
MVC的处理过程:首先控制器接受用户的请求,调用对应的模型来进行业务处理,并返回数据给控制器。控制器调用对应的视图来显示处理的结果。并通过视图呈现给用户。
java基础面试题