导语
Java面试题集2021版
Java基础部分二
- 14、hashCode方法的作用?
- 15、写clone()方法时,通常都有一行代码,这行代码是什么?
- 16、静态变量和实例变量的区别?
- 17、简单说一下对static关键字的理解
- 18、是否可以从一个static方法内部发出对非static方法的调用
- 19、Integer与int的区别
- 20、Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
- 21、请说出作用域public、private、protected,以及不写时的区别
- 22、public、protected和private这些方法权限修饰词的作用
- 23、Overload 和Override 的区别。Overload的方法是否可以改变原来的返回值类型?
- 24、什么是Override?
- 25、什么是Overload?
14、hashCode方法的作用?
hashCode 这个方法是用来鉴定2个对象是否相等,当然它与equals方法还是有一些区别的。
一般来说,equals() 这个方法是给程序员编写代码的时候进行调用的,如果想判断两个对象是否相等,可以对这个方法进行重写,重写的目的就是可以规定自己判断这两个对象相等的依据。简单的来说,equals方法主要是用来判断从自己定义的角度来判断两个对象是不是相等的。举个例子就是说有一个类有两个属性,当两个属性值相等的时候就可以认为这两个对象是同一个对象。
对于HashCode方法来说在编程的时候一般不会去调用,例如在HashMap中,由于key是不可以重复的,所以在判断Key是否相等的时候就使用到了HashCode方法,而且也用到的equals方法,这里的不可以重复是说,equals方法和HashCode方法只要有一个不相等就可以了,所以简单的来看HashCode更像是给对象编码,也就是像是我们经常提到的MD5这样的操作,hashcode和equals不同就在于它返回的是int类型,所以比较起来不是太直观。一般情况下,在重写equals的时候也会重新编写HashCode方法,这样可以让两个方法的逻辑看上去是一样的。
在有些情况下,需要从物理上判断两个对象是否相等,那么可以直接使用等号 == 进行判断。
15、写clone()方法时,通常都有一行代码,这行代码是什么?
clone()方法就是对对象进行克隆,clone()的默认是super.clone();因为首先需要将父类对象中的成员进行复制,然后才可以复制自己的成员,有点类似于双亲委派机制。
16、静态变量和实例变量的区别?
在语法定义上:静态变量前面需要加上关键字static,而在实例变量前面不需要加;
在程序运行时的区别:实例变量是属于某个对象的属性,必须创建实例对象才可以被分配空间,才能使用这个实例变量。静态变量是不属于这个实例对象,而是属于类,所以也被称为是类变量,也就是说在类的字节码被加载的时候,不需要创建任何的对象,它就被分配了空间,就可以进行使用了。总的来说,实例变量需要创建对象之后才可以通过这个对象来使用,而静态变量在类加载完成之后就可以使用,可以通过类名直接进行使用。
public class VariantTest{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest() {
staticVar++;
instanceVar++;
System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
}
}
例如对于上面代码,无论创建多少个实例对象,永远只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个InstanceVar,也就是可能分配多个InstanceVar,并且每个instanceVar都是独立的。
17、简单说一下对static关键字的理解
通常,在一个类中定义一个方法为static,那就是说明,无需本类的实例对象即可调用这个方法,声明为static的方法有如下的几条限制
- 1、它们仅能调用其他的static方法
- 2、它们只能访问static数据
- 3、它们不能以任何方式引用this或者super
声明为static的变量实际上就是常说的全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类中所有的实例变量共用一个static变量。静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载的时候,只分配一块存储空间,所有此类的对象都可以操控此块存储空间。
18、是否可以从一个static方法内部发出对非static方法的调用
不可以。
因为非static方法是要与对象关联在一起的,必须先创建一个对象之后,才可以在该对象上进行方法的调用,而static方法调用时不需要创建对象,可以直接进行调用。也就是说,当一个static方法被调用的时候,可能还没有创建任何的实例对象,如果从一个static方法中发出一个对非static方法的方法,那么这个非static方法的关联对象是什么呢?所以说这个逻辑无法成立,所以一个static方法内部发出对非static方法的调用是不可以的。
19、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中,如果将对象ID定义为Integer类型,那么Hibernate就可以根据其值是否为null判断一个对象是否是临界的,如果将对象Id定义为一个int类型,还需在hbm映射文件中设置器unsaved-value属性为0。
另外Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数Integer.parseInt(“数字字符串”)。Integer中还定义了对应的int的表数范围的最大值和最小值。
20、Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
Math类中提供了三个与取整有关的方法:ceil、floor、round, 这三个方法的作用与其英文名称对应。例如ceil 意思是天花板,顶棚,所以就表示向上取整也就是向着较大的数靠拢。所以说Math.ceil(11.3)的结果就是12,而对应的-11.3则表示是-11。floor英文的意思是地板,楼层。也就是说该方法是向下取整,所以Math.floor(11.6) 表示的结果是11,而-11.6所得到的值应该是-12。三个方法中最难掌握的就是round()方法,这个方法表示四舍五入,算法应该是Math.floor(x+0.5) 也就是将原来的数据加上0.5之后再向下取整,所以Math.round(11.5)的结果应该是12,而-11.5的结果应该-11。
21、请说出作用域public、private、protected,以及不写时的区别
作用域 | 当前类 | 同一包 | 子孙类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
22、public、protected和private这些方法权限修饰词的作用
- 1、public 修饰的字段、属性可以被所用的访问
- 2、protected 修饰的字段、属性只能被本类、本包以及其子类访问
- 3、private 修饰的字段、属性只可以被本类访问
23、Overload 和Override 的区别。Overload的方法是否可以改变原来的返回值类型?
Overload 是重载的意思,Override是覆盖的意思,也就是传说中的重写。
重载Overload表示同一个类中可以有多个相同名称的的方法,但是这些方法的参数列表个不一样,也就是说类型或者数量都不一样,与这些方法的作用域和返回值类型无关。
重写Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中定义的方法,这个相当于把父类中定义的哪个完全相同的方法给覆盖了,这也是面向对象编程中多态性质的一种表现方式。
子类重写父类的方法时,不能扩大方法的异常范围,即只能比父类抛出的异常更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以完全解决父类的一些问题,不能比父类有更多的问题。
子类重写父类的方法时,不能缩小作用范围,子类方法的访问标识只能比父类的更大,不能更小。如果父类的方法是private类型,那么,此时根本不属于重写方法的概念,相当于子类中增加了一个全新的方法。
扩展
至于Overload的方法是否可以改变返回值的类型这个问题,要看是如何理解的,如果几个Overload方法的参数列表不一样,它们的返回值类型可以不一样,但是如果两个方法的参数列表完全一样,是否可以让他们通过返回值不同来实现Overload,这是不行的,这个就与上面说到的Overload实现方式相违背。参数列表不一样才可以构成重载,如果仅仅是返回值类型不同,那么Java语言就不知道到底要调用哪个方法。
24、什么是Override?
Override 也可以翻译为覆盖,也就是说覆盖了一个方法并且对其进行了重写,从而达到不同的作用。对于我们来说最为熟悉额覆盖就是对于接口方法的实现,一般在接口中只对需要实现的方法进行了定义,不需要实现,而在继承接口之后就需要实现接口中声明的方法。除了这个比较典型的用法还可以通过继承的方式来重写父类中的方法。但是重写时需要注意如下几点
- 1、重写方法的标志必须要和被重写的方法的标志完全匹配,才能达到效果;
- 2、重写的方法的返回值必须和被重写的方法的返回一致;
- 3、重写的方法所抛出的异常必须和被重写的方法抛出的异常一致,或者是其子类;
- 4、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对齐进行重写。
25、什么是Overload?
Overload对于我们来说相对比较熟悉,可以直译为重载,它是指可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后在调用的时JVM就可以根据不同的参数样式来执行合适的方法,当然重载也需要注意以下几点
- 1、在使用重载的时候只能通过不同的参数样式来实现。
- 2、不能通过访问权限、返回类型。抛出的异常不同来实现重载
- 3、方法的异常类型和数目不会对重载造成影响
- 4、对于继承来说。如果某一个方法在父类中的访问权限是private,那么就不能在其子类中进行重载,如果定义的话,也只是新定义了一个方法,而不会达到重载的效果。