Java笔试面试题目(二)

每日一句:人生充满着期待,梦想连接着未来!

        java应届生或自学初学者笔试面试题目总结,希望对大家有帮助,题目来自自己学习总结和老师讲解,网络资源,书籍资料。敲出来大家看,每次更新10+道题目,希望大家能找到一份好工作。

第一部分:基础部分

基础部分的包括:基本语法,类似相关的语法,内部类、继承、异常、线程、集合、IO、虚拟机、其他。

11. “==”和equals方法有什么区别

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

如果一个变量指向的数据是对象类型的,那么,这个时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Object obj = new Object();变量obj是一块内存,new Object()是另一块内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,既要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。

equals方法是用来比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,他比较的两个对象是独立的。例如,对于下面的代码:

String a = new String("tumbler");
String b = new String("tumbler");

两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中的一个对象,这是两个不同的对象,他们的首地址是不同的,即a和b中存储的值是不相同的,所以表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。

在实际开发中,我们经常要比较传递进来的字符串内容是否相等,例如,String input = ...; input.equals("tumbler"); 许多人稍不注意就写成了==进行比较,这是错误的,字符串的比较基本都是用equals方法。

如果一个类没有定义自己的equals方法,那么它将继承Object类的equals方法,Object类的equals方法实现如下:

boolean equals(Object o){
    return this == o;
}

这说明,如果一个类没有自己定义的equals方法,它默认的equals方法就是使用==操作符,也就是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到相同的结果,如果比较两个独立的对象,则总是返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法。

12. 静态变量和实例变量的区别

语法定义区别:静态变量用static关键字修饰,而实例变量则不用。

程序运行时区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用穿件任何实例对象,静态变量就会被分配空间,就可以被使用。总之,实例变量必须创建对象后才可以通过这个对象来使用,而静态变量则可以直接使用类名来使用。

例如:对于下面的代码,无论创建多少个实例对象,永远都只会分配了一个staticVal变量,并且每创建一个实例对象,这个staticVal就会+1;但是,每创建一个实例对象,就会分配一个instanceVal,即可能分配多个instanceVal,并且每个instanceVal的值都只自加了一次。

public class VariantTest{
	public static int staticVal = 0;
	public int instanceVal = 0;
	public VariantTest(){
		staticVal++;
		instanceVal++;
		System.out.println("staticVal="+staticVal+",instanceVal="+instanceVal);
	}
}

13. 是否可以从一个static方法内部发出对非static方法的调用?

不可以。因为非static方法是要与类对象关联在一起使用,必须创建一个对象后,才可以在该对象上进行方法的调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用,那个非static方法是关联到哪个对象上的?逻辑无法成立,所以答案是不可以。

14. Integer与int的区别

int是java提供的8种原始数据类型之一。Java为每一个原始类型提供了封装类,Integer是int的封装类。int的默认值是0,而Integer的默认值是null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,想要表达出没有参加考试和考试成绩为0的区别,则只能用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不太适合作为web层的表单数据的类型。

在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为int类型,还需要在hbm映射文件中设置其unsaved-value属性值为0。

另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值操作。

15. 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.floor(11.6)=11,Math.floor(-11.6)=-12;round表示四舍五入,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,Math.round(11.5)=12,Math.round(-11.5)=-11。

16. 下面的代码有什么错误?

1.if(username.equals("tumbler"){}
2.int x = 1;
  return x = 1?true:false

第一个缺少一个右括号;第二个正确;

17. 说出作用域public、private、protected以及不写时的区别。

作用域 当前类 同一package 子孙类 其他package
public
protected ×
friendly √  × ×
private × × ×

18. Overload和Override的区别,Overload的方法是否可以改变返回值的类型?

Overload是重载的意思,Override是重写覆盖的意思。

重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(参数个数或参数类型不同)。

重写Override表示子类中的方法可以与父类中的方法名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中定义的方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种体现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大不能更小。如果父类的方法时private修饰的,那么,子类则不能覆盖,相当于子类中增加了一个全新的方法。

19. 一个房子里有椅子,椅子有腿和背,房子与椅子是什么关系,椅子与腿和背是什么关系?

如果房子有多个椅子,就是聚合关系,否则就是一种关联关系,当然,聚合是一种特殊的关联。椅子与腿和背是组合关系。

20. 说说is a和has a的区别。

is a表示的是属于的关系。比如猫属于一种动物(继承关系)。

has a表示组合、包含关系。比如猫包含有腿、头等组件。







你可能感兴趣的:(Java)