1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
- 一个Java源文件中可以定义多个类,但最多只能定义一个public的类,并且public类的类名必须与源文件名一致。
- 一个文件中可以只有非public类,而且这些类的类名可以跟Java源文件名不同。例如一个Java源文件名中只定义了一个非public类MyClass,而源文件名为Other.java,编译后只会生成一个MyClass.class文件,不会生成Other.class文件。
2.switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
可以作用在
byte、short、char、int
,这四种基本类型的封装类对象和枚举
,其它基本数据类型及引用数据类型都不能做为case的条件。
基本数据类型可以这样简单记忆,能自动加宽到int类型的简单类型和封装类,再加一个enum类型。
在JDK 7以后,String类型也可以做为switch的case条件。
3.short s1 = 1; s1 = s1 + 1; 有什么错? short s1 = 1; s1 += 1; 有什么错?
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,因为s1是short类型,1是int类型,所以结果自动提升为int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1; 因为 += 是java语言的内置的运算符,是一种特殊的运算,不会有编译错误,不会出错。
3.请设计一个一百亿的计算器
面试者是不是知道Java中的大数字运算类的使用。
如果只是大整数运算,使用BigInteger就可以
如果有浮点数据参与运算,就需要使用BigDecimal了
Java中基本类型的浮点数运算是不精确的,需要使用BigDecimal运算,尤其是金融、会计方向的软件
4.使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
引用变量不能重新赋值,但是引用指向的对象的内容可以改变
5、"=="和equals方法究竟有什么区别?
他们的
区别主要存在在引用数据类型上
==为比较两侧的对象是否同一对象,是用内存地址来比较的
== 的作用
比较基本数据类型:比较的是具体的值
比较引用数据类型:比较的是对象地址值
equals是对象的方法,默认是用内存地址比较,重写后,主要是用来比较两侧的对象的值是否相同,和equals方法中的实现有关
==是运算符,可以两侧都为null,但equals左侧的引用指向的对象不能空,不然有NullPointerException
除非需要比较两个引用指向的对象是同一对象,一般都使用equals方法进行比较。尤其是String之类的值对象,另外,常量尽量放在比较的左侧
6.静态变量和实例变量的区别?
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象
,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类
,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。
总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
7.是否可以从一个static方法内部发出对非static方法的调用?
不可以
。非static方法即实例对象方法,是属于某个对象的,必须在对象被创建后才能被调用,成员方法的内部其实隐藏着一个this引用;而static方法是属于类对象的,不属于实例对象,因此static方法在执行时,不能获得当前对象的this引用,从而不能直接调用实例对象的方法
。
8.Integer与int的区别
int是java提供的8种原始数据类型之一,占用4个字节,直接存值;
Integer是引用数据类型,是int的封装类。
- 默认值:int的默认值为0,Integer的默认值为null。
- JSP开发中,Integer的默认值为null, 在EL表达式时,文本框显示的值为空白;如果使用int默认值为0,文本框显示的值是0。int不适合在展示层使用。
- 在Hibernate中,如果将自增ID字段设置成Integer类型,如果值为null,则表示临时对象,保存时,会自动升成ID值。而使用int类型,则需要在hbm映射文件中,设置unsaved-value属性的值为0。
- Integer提供了许多跟整数运算相关的操作方法,例如与字符串的转换,还定了一些整数的最大值和最小值的转换。
9.请说出作用域public,private,protected,以及不写时的区别
不写修饰符也是一种特殊的修饰符,在java中叫做默认修饰符、default修饰符或friendly修饰符,只是说法不同。
四种修饰符的访问权限可以下表:
作用域 | 当前类 | 同package | 子孙类 | 其他package |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
friendly/default | √ | √ | × | × |
private | √ | × | × | × |
从以上表中数据可以看出,访问权限的范围自下向上依次增大。特别强调一点,protected修饰符,在同一包内,即使两个类没有继承关系,依然可以互相访问其protected成员属性和成员方法。
10.构造器Constructor是否可被override?
构造器不能被重写Override,但可以被重载Overload。如果类没有显示定义构造器,此类也会有一个系统默认的无参构造器,只是方法体是空的。
11.抽象类、普通类、接口
接口可以继承接口;
抽象类可以实现(implements)接口;
抽象类可以继承具体类;
抽象类中可以有静态的main方法;
抽象类可有以内部类;
接口可以有内部类,但必须是static内部类,但不一定是final的。
抽象类与普通类的区别有以下两点
- 不能创建实例对象
- 允许有abstract方法
抽象类再补充几点:
- 抽象类可以没有抽象方法
- 抽象类可以只有私有构造器
- 抽象类的修饰符不能使用final
接口补充几点:
- 可以没有任何抽象方法
- 接口可以有属性,但必须是public static final类型的
- 接口中可以定义内部类,但内部类必须是public static类型的(可以是抽象类,不要求是final类型的)
- 接口类定义不能使用final修饰符
- 接口类都是abstract的,即使定义类时,没有显示声明
12.写clone()方法时,通常都有一行代码(不是必须有),是什么?
super.clone()
- super.clone()是浅度克隆,只是把原对象的对象属性的引用复制一份,基本数据类型的属性是完全复制的。
- 要想深度clone,就需要把对象中的引用类型的属性递归复制。