java常见面试题史上最全最经典希望对你有用.docx
《java常见面试题史上最全最经典希望对你有用.docx》由会员分享,可在线阅读,更多相关《java常见面试题史上最全最经典希望对你有用.docx(67页珍藏版)》请在冰豆网上搜索。
java常见面试题史上最全最经典希望对你有用
1.Java基本某些
基本某些顺序:
基本语法,类有关语法,内部类语法,继承有关语法,异常语法,线程语法,集合语法,io语法,虚拟机方面语法。
1、一种".java"源文献中与否可以涉及各种类(不是内部类)?
有什么限制?
可以有各种类,但只能有一种public类,并且public类名必要与文献名相一致。
2、Java有无goto?
java中保存字,当前没有在java中使用。
3、说说&和&&区别。
&和&&都可以用作逻辑与运算符,表达逻辑与(and),当运算符两边表达式成果都为true时,整个运算成果才为true,否则,只要有一方为false,则成果为false。
&&还具备短路功能,即如果第一种表达式为false,则不再计算第二个表达式。
&还可以用作位运算符,当&操作符两边表达式不是boolean类型时,&表达按位与操作。
4、在JAVA中如何跳出当前多重嵌套循环?
在Java中,要想跳出多重循环,可以在外面循环语句前定义一种标号,然后在里层循环体代码中使用带有标号break语句,即可跳出外层循环。
5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
在switch(expr1)中,expr1只能是一种整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,因此,这些类型以及这些类型包装类型也是可以。
显然,long和String类型都不符合switch语法规定,并且不能被隐式转换成int类型,因此,它们不能作用于swtich语句中。
6、shorts1=1;s1=s1+1;有什么错?
shorts1=1;s1+=1;有什么错?
对于shorts1=1;s1=s1+1;由于s1+1运算时会自动提高表达式类型,因此成果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型错误。
对于shorts1=1;s1+=1;由于+=是java语言规定运算符,java编译器会对它进行特殊解决,因而可以对的编译。
7、char型变量中能不能存贮一种中文中文?
为什么?
char型变量是用来存储Unicode编码字符,unicode编码字符集中包括了中文,因此,char型变量中固然可以存储中文啦。
但是,如果某个特殊中文没有被包括在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊中文。
补充阐明:
unicode编码占用两个字节,因此,char类型变量也是占用两个字节。
8、用最有效率办法算出2乘以8等於几?
2<<3,
10、使用final核心字修饰一种变量时,是引用不能变,还是引用对象不能变?
使用final核心字修饰一种变量时,是指引用变量不能变,引用变量所指向对象中内容还是可以变化。
11、"=="和equals办法究竟有什么区别?
==操作符专门用来比较两个变量值与否相等,也就是用于比较变量所相应内存中所存储数值与否相似,要比较两个基本类型数据或两个引用变量与否相等,只能用==操作符。
如果一种变量指向数据是对象类型,那么,这时候涉及了两块内存,对象自身占用一块内存(堆内存),变量也占用一块内存,例如Objetobj=newObject();变量obj是一种内存,newObject()是另一种内存,此时,变量obj所相应内存中存储数值就是对象占用那块内存首地址。
对于指向对象类型变量,如果要比较两个变量与否指向同一种对象,即要看这两个变量所相应内存中数值与否相等,这时候就需要用==操作符进行比较。
equals办法是用于比较两个独立对象内容与否相似,就好比去比较两个人长相与否相似,它比较两个对象是独立。
例如,对于下面代码:
Stringa=newString("foo");
Stringb=newString("foo");
两条new语句创立了两个对象,然后用a/b这两个变量分别指向了其中一种对象,这是两个不同对象,它们首地址是不同,即a和b中存储数值是不相似,因此,表达式a==b将返回false,而这两个对象中内容是相似,因此,表达式a.equals(b)将返回true。
12、静态变量和实例变量区别?
在语法定义上区别:
静态变量前要加static核心字,而实例变量前则不加。
在程序运营时区别:
实例变量属于某个对象属性,必要创立了实例对象,其中实例变量才会被分派空间,才干使用这个实例变量。
静态变量不属于某个实例对象,而是属于类,因此也称为类变量,只要程序加载了类字节码,不用创立任何实例对象,静态变量就会被分派空间,静态变量就可以被使用了。
总之,实例变量必要创立对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
13、与否可以从一种static办法内部发出对非static办法调用?
不可以。
由于非static办法是要与对象关联在一起,必要创立一种对象后,才可以在该对象上进行办法调用,而static办法调用时不需要创立对象,可以直接调用。
也就是说,当一种static办法被调用时,也许还没有创立任何实例对象,如果从一种static办法中发出对非static办法调用,那个非static办法是关联到哪个对象上呢?
这个逻辑无法成立,因此,一种static办法内部发出对非static办法调用。
14、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中还定义了表达整数最大值和最小值常量。
15、Math.round(11.5)等於多少?
Math.round(-11.5)等於多少?
Math类中提供了三个与取整关于办法:
ceil、floor、round,这些办法作用与它们英文名称含义相相应,例如,ceil英文意义是天花板,该办法就表达向上取整,Math.ceil(11.3)成果为12,Math.ceil(-11.3)成果是-11;floor英文意义是地板,该办法就表达向下取整,Math.ceil(11.6)成果为11,Math.ceil(-11.6)成果是-12;最难掌握是round办法,它表达“四舍五入”,算法为Math.floor(x+0.5),即将本来数字加上0.5后再向下取整,因此,Math.round(11.5)成果为12,Math.round(-11.5)成果为-11。
16、下面代码有什么不当之处?
1.if(username.equals(“zxx”){}
2.intx=1;
returnx==1?
true:
false;
17、请说出作用域public,private,protected,以及不写时区别
这四个作用域可见范畴如下表所示。
阐明:
如果在修饰元素上面没有写任何访问修饰符,则表达friendly。
作用域当前类同一package子孙类其她package
public√√√√
protected√√√×
friendly√√××
private√×××
18、Overload和Override区别。
Overloaded办法与否可以变化返回值类型?
重载Overload表达同一种类中可以有各种名称相似办法,但这些办法参数列表各不相似(即参数个数或类型不同)。
重写Override表达子类中办法可以与父类中某个办法名称和参数完全相似,通过子类创立实例对象调用这个办法时,将调用子类中定义办法,这相称于把父类中定义那个完全相似办法给覆盖了,这也是面向对象编程多态性一种体现。
在覆盖要注意如下几点:
1、覆盖办法标志必要要和被覆盖办法标志完全匹配,才干达到覆盖效果;
2、覆盖办法返回值必要和被覆盖办法返回一致;
3、覆盖办法所抛出异常必要和被覆盖办法所抛出异常一致,或者是其子类;
4、被覆盖办法不能为private,否则在其子类中只是新定义了一种办法,并没有对其进行覆盖。
在使用重载要注意如下几点:
1、在使用重载时只能通过不同参数样式。
例如,不同参数类型,不同参数个数,不同参数顺序(固然,同一办法内几种参数类型必要不同样,例如可以是fun(int,float),但是不能为fun(int,int));
2、不能通过访问权限、返回类型、抛出异常进行重载;
3、办法异常类型和数目不会对重载导致影响;
4、对于继承来说,如果某一办法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义话,也只是定义了一种新办法,而不会达到重载效果。
如果几种Overloaded办法参数列表不同样,它们返回者类型固然也可以不同样。
如果两个办法参数列表完全同样,与否可以让它们返回值不同来实现重载Overload。
这是不行
19、构造器Constructor与否可被override?
构造器Constructor不能被继承,因而不能重写Override,但可以被重载Overload。
20、接口与否可继承办口?
抽象类与否可实现(implements)接口?
抽象类与否可继承详细类(concreteclass)?
抽象类中与否可以有静态main办法?
接口可以继承办口。
抽象类可以实现(implements)接口,抽象类与否可继承详细类。
抽象类中可以有静态main办法。
只有记住抽象类与普通类唯一区别就是不能创立实例对象和容许有abstract办法。
21、写clone()办法时,普通均有一行代码,是什么?
clone有缺省行为,super.clone();由于一方面要把父类中成员复制到位,然后才是复制自己成员。
22、面向对象特性有哪些方面
面向对象编程语言有4个重要特性。
1封装:
封装是保证软件部件具备优良模块性基本,封装目的就是要实现软件部件“高内聚、低耦合”,防止程序互相依赖性而带来变动影响。
把握一种原则:
把对同一事物进行操作办法和有关办法放在同一种类中,把办法和它操作数据放在同一种类中。
抽象:
抽象就是找出某些事物相似和共性之处,然后将这些事物归为一种类,这个类只考虑这些事物相似和共性之处,并且会忽视与当前主题和目的无关那些方面,将注意力集中在与当前目的关于方面。
继承:
在定义和实现一种类时候,可以在一种已经存在类基本之上来进行,把这个已经存在类所定义内容作为自己内容,并可以加入若干新内容,或修改本来办法使之更适合特殊需要,这就是继承。
继承是子类自动共享父类数据和办法机制,这是类之间一种关系,提高了软件可重用性和可扩展性。
多态:
多态是指程序中定义引用变量所指向详细类型和通过该引用变量发出办法调用在编程时并不拟定,而是在程序运营期间才拟定,即一种引用变量倒底会指向哪个类实例对象,该引用变量发出办法调用究竟是哪个类中实现办法,必要在由程序运营期间才干决定。
由于在程序运营时才拟定详细类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同类实现上,从而导致该引用调用品体办法随之变化,即不修改程序代码就可以变化程序运营时所绑定详细代码,让程序可以选取各种运营状态,这就是多态性。
多态性增强了软件灵活性和扩展性。
23、java中实现多态机制是什么?
靠是父类或接口定义引用变量可以指向子类或详细实现类实例对象,而程序调用办法在运营期才动态绑定,就是引用变量所指向详细实例对象办法,也就是内存里正在运营那个对象办法,而不是引用变量类型中定义办法。
24、abstractclass和interface有什么区别?
具有abstract修饰符class即为抽象类,abstract类不能创立实例对象。
具有abstract办法类必要定义为abstractclass,abstractclass类中办法不必是抽象。
abstractclass类中定义抽象办法必要在详细(Concrete)子类中实现,因此,不能有抽象构造办法或抽象静态办法。
如果子类没有实现抽象父类中所有抽象办法,那么子类也必要定义为abstract类型。
接口(interface)可以说成是抽象类一种特例,接口中所有办法都必要是抽象。
接口中办法定义默以为publicabstract类型,接口中成员变量类型默以为publicstaticfinal。
下面比较一下两者语法区别:
1.抽象类可以有构造办法,接口中不能有构造办法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包括非抽象普通办法,接口中所有办法必要都是抽象,不能有非抽象普通办法。
4.抽象类中抽象办法访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应当也不行),但接口中抽象办法只能是public类型,并且默认即为publicabstract类型。
5.抽象类中可以包括静态办法,接口中不能包括静态办法
6.抽象类和接口中都可以包括静态成员变量,抽象类中静态成员变量访问类型可以任意,但接口中定义变量只能是publicstaticfinal类型,并且默认即为publicstaticfinal类型。
7.一种类可以实现各种接口,但只能继承一种抽象类。
25、abstractmethod与否可同步是static,与否可同步是native,与否可同步是synchronized?
abstractmethod不可以是static,由于抽象办法是要被子类实现,而static与子类扯不上关系!
native办法表达该办法要用此外一种依赖平台编程语言实现,不存在着被子类实现问题,因此,它也不能是抽象,不能与abstract混用。
关于synchronized与abstract合用问题,我觉得也不行,由于在我几年学习和开发中,从来没见到过这种状况,并且我觉得synchronized应当是作用在一种详细办法上才故意义。
并且,办法上synchronized同步所使用同步锁对象是this,而抽象办法上无法拟定this是什么。
26、什么是内部类?
StaticNestedClass和InnerClass不同。
内部类就是在一种类内部定义类,内部类中不能定义静态成员,内部类可以直接访问外部类中成员变量,内部类可以定义在外部类办法外面,也可以定义在外部类办法体中。
在办法外部定义内部类前面可以加上static核心字,从而成为StaticNestedClass,它不再具备内部类特性,所有,从狭义上讲,它不是内部类。
StaticNestedClass与普通类在运营时行为和功能上没有什么区别,只是在编程引用时语法上有某些差别,它可以定义成public、protected、默认、private等各种类型,而普通类只能定义成public和默认这两种类型。
在外面引用StaticNestedClass类名称为“外部类名.内部类名”。
在外面不需要创立外部类实例对象,就可以直接创立StaticNestedClass,例如,假设Inner是定义在Outer类中StaticNestedClass,那么可以使用如下语句创立Inner类:
Outer.Innerinner=newOuter.Inner();
由于staticNestedClass不依赖于外部类实例对象,因此,staticNestedClass能访问外部类非static成员变量。
当在外部类中访问StaticNestedClass时,可以直接使用StaticNestedClass名字,而不需要加上外部类名字了,在StaticNestedClass中也可以直接引用外部类static成员变量,不需要加上外部类名字。
在静态办法中定义内部类也是StaticNestedClass,这时候不能在类前面加static核心字,静态办法中StaticNestedClass与普通办法中内部类应用方式很相似,它除了可以直接访问外部类中static成员变量,还可以访问静态办法中局部变量,但是,该局部变量前必要加final修饰符。
27、内部类可以引用它包括类成员吗?
有无什么限制?
完全可以。
如果不是静态内部类,那没有什么限制!
如果你把静态嵌套类当作内部类一种特例,那在这种状况下不可以访问外部类普通成员变量,而只能访问外部类中静态成员,
28、AnonymousInnerClass(匿名内部类)与否可以extends(继承)其他类,与否可以implements(实现)interface(接口)?
可以继承其她类或实现其她接口。
不但是可以,而是必要!
29、super.getClass()办法调用
下面程序输出成果是多少?
importjava.util.Date;
publicclassTestextendsDate{
publicstaticvoidmain(String[]args){
newTest().test();
}
publicvoidtest(){
System.out.println(super.getClass().getName());
}
}
成果是Test。
在test办法中,直接调用getClass().getName()办法,返回是Test类名,由于getClass()在Object类中定义成了final,子类不能覆盖该办法,因此,在test办法中调用getClass().getName()办法,其实就是在调用从父类继承getClass()办法,等效于调用super.getClass().getName()办法,因此,super.getClass().getName()办法返回也应当是Test。
如果想得到父类名称,应当用如下代码:
getClass().getSuperClass().getName();
30、String是最基本数据类型吗?
基本数据类型涉及byte、int、char、long、float、double、boolean和short。
java.lang.String类是final类型,因而不可以继承这个类、不能修改这个类。
为了提高效率节约空间,咱们应当用StringBuffer类
31、Strings="Hello";s=s+"world!
";这两行代码执行后,原始String对象中内容究竟变了没有?
没有。
由于String被设计成不可变(immutable)类,因此它所有对象都是不可变对象。
在这段代码中,s原先指向一种String对象,内容是"Hello",然后咱们对s进行了+操作,那么s所指向那个对象与否发生了变化呢?
答案是没有。
这时,s不指向本来那个对象了,而指向了另一种String对象,内容为"Helloworld!
",本来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
32、与否可以继承String类?
String类是final类故不可以继承。
33、Strings=newString("xyz");创立了几种StringObject?
两者之间有什么区别?
两个或一种,”xyz”相应一种对象,这个对象放在字符串常量缓冲区,常量”xyz”不论浮现多少遍,都是缓冲区中那一种。
NewString每写一遍,就创立一种新对象,它一句那个常量”xyz”对象内容来创立出一种新String对象。
如果此前就用过’xyz’,这句代表就不会创立”xyz”自己了,直接从缓冲区拿。
34、String和StringBuffer区别
JAVA平台提供了两个类:
String和StringBuffer,它们可以储存和操作字符串,即包括各种字符字符数据。
这个String类提供了数值不可变化字符串。
而这个StringBuffer类提供字符串进行修改。
当你懂得字符数据要变化时候你就可以使用StringBuffer。
典型地,你可以使用StringBuffers来动态构造字符数据。
此外,String实现了equals办法,newString(“abc”).equals(newString(“abc”)成果为true,而StringBuffer没有实现equals办法,因此,newStringBuffer(“abc”).equals(newStringBuffer(“abc”)成果为false。
接着要举一种详细例子来阐明,咱们要把1到100所有数字拼起来,构成一种串。
StringBuffersbf=newStringBuffer();
for(inti=0;i<100;i++)
{
sbf.append(i);
}
上面代码效率很高,由于只创立了一种StringBuffer对象,而下面代码效率很低,由于创立了101个对象。
Stringstr=newString();
for(inti=0;i<100;i++)
{
str=str+i;
}
String覆盖了equals办法和hashCode办法,而StringBuffer没有覆盖equals办法和hashCode办法,因此,将StringBuffer对象存储进Java集合类中时会浮现问题。
35、如何把一段逗号分割字符串转换成一种数组?
如果不查jdkapi,我很难写出来!
我可以说说我思路:
1用正则表达式,代码大概为:
String[]result=orgStr.split(“,”);
2用StingTokenizer,代码为:
StringTokenizertokener=StringTokenizer(orgStr,”,”);
String[]result=newString[tokener.countTokens()];
Inti=0;
while(tokener.hasNext(){result[i++]=toker.nextToken();}
36、数组有无length()这个办法?
String有无length()这个办法?
数组没有length()这个办法,有length属性。
String有有length()这个办法。
37、下面这条语句一共创立了多少个对象:
Strings="a"+"b"+"c"+"d";
答:
对于如下代码:
Strings1="a";
Strings2=s1+"b";
Strings3="a"+"b";
System.out.println(s2=="ab");
System.out.println(s3=="ab");
第一条语句打印成果为false,第二条语句打印成果为true,这阐明javac编译可以对字符串常量直接相加表达式进行优化,不必要等到运营期去进