1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。
2、Java数据类型
基本数据类型
byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0;
short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0;
int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0;
long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L;
float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0;
double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0;
char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空;
boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false;
引用数据类型
类
接口
数组
3、面向对象思想有哪些特征?
封装:隐藏对象的属性和实现的细节,仅对外提供公共的访问方式。
继承:把多个类中的相同的属性和行为进行抽取,封装到一个类中,然后再建立新类的时候,不需要从头做起,继承刚才定义的那个类即可。
好处:
A:提高代码的复用性。
B:让类与类之间产生了一个关系,是多态的前提。
特点:
A:Java只支持单继承,不支持多继承。为什么?如果支持多继承,就会有调用不明确的问题。
B:Java支持多层(重)继承。
多态:对象在不同时刻表现出来的不同状态。
前提:
A:要有继承或者实现关系。
B:要有方法的重写/实现。
C:要有父类引用或者父接口引用指向子类对象。
好处:
可以提高代码的扩展性和可维护性。
4、逻辑运算符有哪些?
与(&),或(|),非(!),异或(^),与(&&),或(||)
&:有false则false
|:有true则true
!:true变false,false变true
^:相同false,不同true
&&:有false则false
||:有true则true
&&和&的区别是:如果左边有false了,右边将不再执行。
||和|的区别是:如果左边有true了,右边将不再执行。
5、说说逻辑运算符&和&&的区别。
&和&&都可以用作逻辑与的运算符,表示逻辑与(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。
备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。
6、Java中break return continue 区别
continue:跳出本次循环继续下一次循环
break: 跳出循环体,继续执行循环外的函数体
return: 跳出整个函数体,函数体后面的部分不再执行
7、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。
8、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编译器会对它进行特殊处理,因此可以正确编译。
9、Java中的堆和栈
一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。
堆内存用于存放由new创建的对象和数组。
10、用最有效率的方法算出2乘以8等於几?
2 << 3
11、Java中的final关键字
是一个关键字,可以用于修饰类,成员变量,成员方法。
修饰的类不能被继承
修饰的成员变量是一个常量
修饰的成员方法不能被子类重写
修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的(如集合)。
12、==与equals区别?
1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址,如果重写了,就按照重写后的规则进行比较。
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
13、Java类中各成员初始化顺序?
a.静态成员变量按照在类中定义的顺序初始化(包括静态代码块)
b.普通成员初始化按照在类中定义的顺序初始化(包括构造代码块)
c.构造代码块
d.构造函数初始化
14、是否可以从一个static方法内部发出对非static方法的调用?
不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。
15、Integer与int的区别?
int是基本数据类型,Integer是引用数据类型;
Ingeter是int的包装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。
16、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。
17、下面的代码有什么不妥之处?
if(username.equals(“zxx”){}
username可能为NULL,会报空指针错误;改为"zxx".equals(username)
18、重载与重写的区别?
重载:
方法名相同,参数不同(个数或类型或顺序);
返回值类型一样;
异常类型和数目可以不一样
若方法名形同,参数不同,返回值不同,则只是定义了一个新方法,与重载无关
重写:
方法名和参数完全相同
返回值类型相同
抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类
被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖
19、子类是否继承父类构造方法?
java继承中对构造函数是不继承的,只是调用(隐式或显式)。
a.子类的构造过程中必须调用其基类的构造方法。
b.子类可以在自己的构造方法中使用super(argument_list)调用基类的构造方法。
使用this(argument_list)调用本类的另外构造方法。
如果调用super,必须写在子类构造方法的第一行。
c.如果子类的构造方法中没有显示的调用基类的构造方法,则系统默认调用基类的无参数构造方法。
d.如果子类构造方法中既没有显示调用基类构造方法,而基类又没有无参数的构造方法,则编译出错。
20、Java中的多态?
前提:
A:要有继承或者实现关系。
B:要有方法的重写/实现。
C:要有父类引用或者父接口引用指向子类对象。
好处:
可以提高代码的扩展性和可维护性。
21、String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?
没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
22、String F=new String("Microstrong");创建了几个String对象?
答案是两个,一个是字符串字面常数,在字符串池中。一个是new出来的字符串对象,在堆中。
23、StringBuffer与StringBuilder区别?
StringBuffer是同步的,线程安全的;StringBuilder是不同步的,线程非安全的,执行速度快。
24、Java数组与集合的区别?
数组:大小固定,可存储基本类型或引用类型,同一数组只能存储同一类型数据;
集合:大小可变,只能存储引用类型,同一集合可以存储不同类型数据。