java面试题下篇wordWord文档下载推荐.docx
《java面试题下篇wordWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《java面试题下篇wordWord文档下载推荐.docx(141页珍藏版)》请在冰豆网上搜索。
我们编写一个类就是对数据和数据操作的封装。
可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;
我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。
-多态性:
多态性是指允许不同子类型的对象对同一消息作出不同的响应。
简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。
多态性分为编译时的多态性和运行时的多态性。
如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:
当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。
方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。
运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:
1).方法重写(子类继承父类并重写父类中已有的或抽象的方法);
2).对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。
2、访问修饰符public,private,protected,以及不写(默认)时的区别?
修饰符
当前类
同包
子类
其他包
public
√
protected
×
default
private
类的成员不写访问修饰时默认为default。
默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。
受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。
Java中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以是以上四种。
3、String是最基本的数据类型吗?
不是。
Java中的基本数据类型只有8个:
byte、short、int、long、float、double、char、boolean;
除了基本类型(primitivetype),剩下的都是引用类型(referencetype),Java5以后引入的枚举类型也算是一种比较特殊的引用类型。
4、floatf=3.4;
是否正确?
答:
不正确。
3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换floatf=(float)3.4;
或者写成floatf=3.4F;
。
5、shorts1=1;
s1=s1+1;
有错吗?
shorts1=1;
s1+=1;
有错吗?
对于shorts1=1;
由于1是int类型,因此s1+1运算结果也是int型,需要强制转换类型才能赋值给short型。
而shorts1=1;
可以正确编译,因为s1+=1;
相当于s1=(short)(s1+1);
其中有隐含的强制类型转换。
6、Java有没有goto?
goto是Java中的保留字,在目前版本的Java中没有使用。
(根据JamesGosling(Java之父)编写的《TheJavaProgrammingLanguage》一书的附录中给出了一个Java关键字列表,其中有goto和const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字)
7、int和Integer有什么区别?
Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapperclass),int的包装类就是Integer,从Java5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
Java为每个原始类型提供了包装类型:
-原始类型:
boolean,char,byte,short,int,long,float,double
-包装类型:
Boolean,Character,Byte,Short,Integer,Long,Float,Double
classAutoUnboxingTest{publicstaticvoidmain(String[]args){Integera=newInteger(3);
Integerb=3;
//将3自动装箱成Integer类型intc=3;
System.out.println(a==b);
//false两个引用没有引用同一对象System.out.println(a==c);
//truea自动拆箱成int类型再和c比较}}
●1
●2
●3
●4
●5
●6
●7
●8
●9
●10
最近还遇到一个面试题,也是和自动装箱和拆箱有点关系的,代码如下所示:
publicclassTest03{publicstaticvoidmain(String[]args){Integerf1=100,f2=100,f3=150,f4=150;
System.out.println(f1==f2);
System.out.println(f3==f4);
}}
如果不明就里很容易认为两个输出要么都是true要么都是false。
首先需要注意的是f1、f2、f3、f4四个变量都是Integer对象引用,所以下面的==运算比较的不是值而是引用。
装箱的本质是什么呢?
当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,如果看看valueOf的源代码就知道发生了什么。
publicstaticIntegervalueOf(inti){if(i>
=IntegerCache.low&
&
i<
=IntegerCache.high)returnIntegerCache.cache[i+(-IntegerCache.low)];
returnnewInteger(i);
}
IntegerCache是Integer的内部类,其代码如下所示:
/***Cachetosupporttheobjectidentitysemanticsofautoboxingforvaluesbetween*-128and127(inclusive)asrequiredbyJLS.**Thecacheisinitializedonfirstusage.Thesizeofthecache*maybecontrolledbythe{@code-XX:
AutoBoxCacheMax=<
size>
}option.*DuringVMinitialization,java.lang.Integer.IntegerCache.highproperty*maybesetandsavedintheprivatesystempropertiesinthe*sun.misc.VMclass.*/privatestaticclassIntegerCache{staticfinalintlow=-128;
staticfinalinthigh;
staticfinalIntegercache[];
static{//highvaluemaybeconfiguredbypropertyinth=127;
StringintegerCacheHighPropValue=sun.misc.VM.getSavedProperty("
java.lang.Integer.IntegerCache.high"
);
if(integerCacheHighPropValue!
=null){try{inti=parseInt(integerCacheHighPropValue);
i=Math.max(i,127);
//MaximumarraysizeisInteger.MAX_VALUEh=Math.min(i,Integer.MAX_VALUE-(-low)-1);
}catch(NumberFormatExceptionnfe){//Ifthepropertycannotbeparsedintoanint,ignoreit.}}high=h;
cache=newInteger[(high-low)+1];
intj=low;
for(intk=0;
k<
cache.length;
k++)cache[k]=newInteger(j++);
//range[-128,127]mustbeinterned(JLS75.1.7)assertIntegerCache.high>
=127;
}privateIntegerCache(){}}
●11
●12
●13
●14
●15
●16
●17
●18
●19
●20
●21
●22
●23
●24
●25
●26
●27
●28
●29
●30
●31
●32
●33
●34
●35
●36
●37
●38
●39
●40
●41
●42
●43
●44