Java 基础部分面试题目补充(1)

1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

  1. 一个Java源文件中可以定义多个类,但最多只能定义一个public的类,并且public类的类名必须与源文件名一致。
  2. 一个文件中可以只有非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的封装类。

  1. 默认值:int的默认值为0,Integer的默认值为null。
  2. JSP开发中,Integer的默认值为null, 在EL表达式时,文本框显示的值为空白;如果使用int默认值为0,文本框显示的值是0。int不适合在展示层使用。
  3. 在Hibernate中,如果将自增ID字段设置成Integer类型,如果值为null,则表示临时对象,保存时,会自动升成ID值。而使用int类型,则需要在hbm映射文件中,设置unsaved-value属性的值为0。
  4. 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的。

抽象类与普通类的区别有以下两点

  1. 不能创建实例对象
  2. 允许有abstract方法

抽象类再补充几点:

  1. 抽象类可以没有抽象方法
  2. 抽象类可以只有私有构造器
  3. 抽象类的修饰符不能使用final

接口补充几点:

  1. 可以没有任何抽象方法
  2. 接口可以有属性,但必须是public static final类型的
  3. 接口中可以定义内部类,但内部类必须是public static类型的(可以是抽象类,不要求是final类型的)
  4. 接口类定义不能使用final修饰符
  5. 接口类都是abstract的,即使定义类时,没有显示声明

12.写clone()方法时,通常都有一行代码(不是必须有),是什么?

super.clone()

  1. super.clone()是浅度克隆,只是把原对象的对象属性的引用复制一份,基本数据类型的属性是完全复制的。
  2. 要想深度clone,就需要把对象中的引用类型的属性递归复制。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

?abc!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值