Java 基础面试题(一)

在工作专栏包含了数据库,Java,计算机网络,数据结构算法以及JVM相关知识,一步一个脚印,每天学一点,积少成多,加油哦!涉及的知识点只看书资料等会感到枯燥,故找了些视频便于自己理解,我也会分享一下视频链接!希望对大家有所帮助!

1、Switch语句能否作用在byte上,能否作用在long上,能够作用在String上?

在switch(expr) 中,expr 只能是一个整数表达式或者枚举常量,整数表达式可以是int基本类型或Integer包装类型,由于byte,short,char都可以隐含转换为int,所以这些类型以及这些类型的包装类也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以它们不能被作用于switch语句中。
视频讲解链接:switch 语句详解

2、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编译器会对它进行特殊处理(自动类型转换),因此可以正确编译。

3、用最有效率的方法算出2乘以8?

算式表达: 2<<3
因为将一个数左移n位,就相当于乘以了2的n次方,那么一个数乘以8只要将其左移三位即可,而位运算cpu直接支持的,效率最高。
如图所示:

Java 上线前测试 java面试上机测试题_java

4、使用 final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以变的。
代码示例:
final StringBuffer a=new StringBuffer("lucky"); 这样的 a=new StringBuffer("");是不对的 ; 但是 a.append("ok");是可以通过编译的。 视频链接:final 关键字

5、“==” 和 “equals” 方法究竟有什么区别?

在这里先放入一张图便于理解:

Java 上线前测试 java面试上机测试题_算法_02


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


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


equals 方法是用于比较两个独立对象的内容是否相同,它比较的两个对象是独立的。例如 String a=new String(“lucky”); String b=new String(“lucky”); 两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不同的,所以表达式 a == b 返回false,而这两个对象中的内容是相同的,所以,a.equals(b) 将返回true。


补充:在实际开发中,我们经常要比较传递进来的字符串内容是否相等,例如:String input=…; input.equals(“lucky”),需要记住 字符串的比较基本上都是使用equals方法。如果一个类没有自己定义的equals方法,它默认的equals方法(从Object类继承的)就是使用 == 操作符,也是在比较两个变量指向的对象是否是同一个对象,这时候使用equals和 = =会得到同样的结果,如果比较的是两个独立的对象则返回false。如果你希望编写的类能够比较比较该类创建的两个实例对象的内容是否相同,那么必须覆盖equals方法,由你自己写代码来决定在什么情况下即可认为两个对象的内容是相同的。


视频链接:

== 和 equals

6、静态变量和实例变量的区别?

在语法定义上的区别:静态变量前要加static关键字,而实例变量前不加。
在程序运行的区别:实例变量属于某个对象的属性,必须创建实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
视频讲解链接:静态与实例

7、Integer 和 int 的区别?

int是Java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是Java为int提供的封装类。int的默认值为0,而Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如想要表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用EL表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用EL表达式在文本框显示时,结果为0。所以,int 不适合作为web层的表单数据的类型。 另外,Integer提供了多个与整数相关的操作方法,例如将一个字符串转换为整数,Integer中还定义了表示整数的最大值和最小值的常量。
视频讲解链接:拆箱与装箱

8、Math.round(10.3) 等于多少?Math.round(-9.3) 等于多少?

Math类中提供了三个与取整有关的方法:ceil、floor、round。这些方法的作用与它们的英文名称的含义相对应。ceil 天花板:即向上取整,floor 地板:即向下取整;round方法表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整。
如图所示:

Java 上线前测试 java面试上机测试题_算法_03

9、作用域 public,private,protected,以及不写时的区别?

如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。
如图所示:

Java 上线前测试 java面试上机测试题_java_04

10、Overload 与 Override 的区别?

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