面试(四)Java面试题

前言

本章为java面试宝典中的题目,我在线下已刷一遍,为了加强理解及记忆
进行线上记录及记忆,并且对相关问题答案简化为自己的归纳总结

一、面试题

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

可以,但是只能包含一个public修饰的类,并且这个类的类名必须和文件名相同

2)java中有没有goto?

1.java中的goto是保留字,还没有在java中使用

2.goto有在C语言中使用,通常与循环、条件语句等一起使用,用于跳转。但是不建议使用它,因为它可以在同一个作用域中任意跳转,可能会导致程序的流程错乱。

3)说说&和&&的区别

1.二者都可以用作逻辑与使用,当前后两表达式都为真时,结果都为true。当前后两表达式其中有一个为假时,则结果为false。

2.但是&&有短路的功能,前一个表达式为假时会短路,不会再执行后一个表达式,直接返回false。

例如:
if(str !=null && !str.equals(" ")){} 当str等于null时,判断第一个表达式为假,短路,直接返回false

if(str !=null & !str.equals(" ")){} 当str等于null时,判断第一个表达式为假后,仍旧执行第二个表达式,会抛出NullPointException

4)在java中如何跳出当前的多重嵌套循环

在外层循环中定义一个标志,在内层循环里面直接break 标志即可

5)switch语句能否作用在byte上,作用在long上和String上呢?

可以作用在byte上,不可以作用在long和String上

1.swith(expr) :其中表达式expr只能使用枚举或者整数类型

2.其中byte,char,short会隐式转换为整数类型int 所以byte可以
long和String都不符合条件

6)short s1 = 1;s1 = s1+1 有什么错?short s1 = 1;s1+=1;呢?

1.前者编译错误 s1为short类型,s1+1在运算中转换为了int类型,高等级的数据类型int不可以直接转换为低等级的short,否则编译错误,必须实行强转。如 s1 = (short)s1+1;

2.后者可正常编译,s1+=1;其实执行的是s1 = (short) (s1 + 1); 其中会有一个强制转换的过程。

7)使用final关键字修饰一个变量时,是引用不可变还是引用的对象不可变?

引用不可变,引用的对象可变
尤其是使用append()方法时

例如:

final String a = new String("makasa");

a = new String("levi"); #编译报错,因为修改了引用

a.append("levi"); #正常编译 引用内容可变

8)“==”和equals方法的区别

1.==比较的是地址值和值,equals比较的是值

2.当一个类没有重写equals方法,而是直接使用的Object类下的equals方法,则和 ==作用一样,因为Object下的equals方法底层原理就是用 ==来比较的。

3.String类中重写了equals方法,所以equals比较的是值

9)静态变量和实例变量的区别

1.静态变量有关键字static修饰

2.静态变量随类加载而加载,当类一加载就为其分配存储空间
而实例变量依赖于实例对象,必须先创建实例对象,通过实例对象调用才为其分配存储空间

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

不可以

static方法只能调用方法外部的静态成员变量和方法,因为静态方法随类加载而加载,当一类加载就为其分配了存储空间

如果去调用一个非静态方法,当这个非静态方法还未被实例对象调用并分配存储空间,则会返回NullPointException

11)Integer和int的区别

1.所属范畴不同:int是java八大基本数据类型之一、Integer是int的包装类型

2.初始值不同:int的初始值为0,Integer初始值为null

12)请说出作用于public、protected、friendly、private的区别

public:可以访问所有包下的类及其子孙类

protected:可访问同一个包下的类及其子孙类

friendly(即无修饰符):可访问同一包下的类

private:只可访问当前类

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

1.含义不同
Override:重写 ,即子类重写父类方法,覆盖父类原来方法

  • 其中需遵循
  • 方法名、参数列表相同
  • 子类的访问权限必须大于等于父类访问权限
  • 子类的异常必须小于等于父类的异常
  • 当父类中的某方法为private时,子类无法访问到该方法,所以子类中同样的方法不是进行覆盖,而仅仅是子类中定义的新的方法

OverLoad:重载,即同一个类中包含两个及两个以上的方法名相同,参数列表不同的方法

2.如果参数列表相同的话,返回值类型是可以改变的
如果参数列表不同,即使改变了返回值类型,也不是重载

14)构造器Constructor 是否可以被Override?

不可以
构造器不可以被重写,但是可以重载,只需要参数列表不同即可

15)接口是否可以继承接口?抽象类中是否可以实现接口?抽象类是否可以继承具体类?抽象类中是否可以有静态的main方法?

都可以
抽象类和普通类的区别仅仅在于:含有abstract修饰的方法就为abstract类,抽象类中不可以创建实例对象

16)抽象类和接口的区别(七大区别)?

1.抽象类中可以有普通成员变量,接口中不可以
2.抽象类中可以有构造方法,接口中不可以
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的
4.抽象类中可以包含静态方法,接口中不可以
5.抽象类中可以包含静态成员变量,且静态成员变量的访问类型可是任意
接口中定义的变量只能是public static final类型的
6.抽象类的抽象方法的访问类型可以是public和protected,接口中的方法都默认为public abstract
7.一个类可以实现多个接口,但是只能继承一个抽象类

17)abstract类的method是否可同时是static的?是否可同时是native?是否可同时是被synchronize修饰?

1.不可以同时static,因为抽象方法需要被子类重写,而static修饰的方法不可以重写
2.不可以同时是native,因为本地方法是由本地代码实现的方法,抽象方法是没有实现的
3.不可以同时被synchronize修饰,因为synchronize和方法实现的细节有关,而抽象方法不涉及方法实现

18)什么是内部类?静态内部类和内部类的区别?

1.内部类即在一个类内部定义的类,内部类中不能定义静态成员

  • 成员内部类:可以调用外部所有资源,不可以定义静态资源
  • 局部内部类:相当于一个方法,不可被访问修饰符及static修饰,只能访问其内部代码块及方法中被定义为final的局部变量
  • 匿名内部类:是特殊的局部内部类,局部类的条件都需满足,且必须继承一个类或者实现一接口

2.静态内部类:只可以调用外部的静态成员,不可以访问外部的非静态资源

19)内部类可以引用包含它的类的成员吗?有没有什么限制?

可以
但是如果是静态内部类的话,只能调用外部的静态成员

20)String与StringBuffer、StringBuilder的区别?

1.String类被final修饰,是不可变的

2.StringBuffer和StringBuilder是可变的

  • 其中StringBuffer同步安全,但效率低
  • StringBuilder不同步,不安全,效率高

21)final,finally,finalize的区别

1.final可修饰类,方法,变量

  • 修饰类,类不可被继承
  • 修饰方法,方法不可被重写
  • 修饰变量,变量变常量

2.finally:属于try,catch异常处理语句中的一部分,finally中的代码必须执行

3.finalize:是Object中的一个方法,用于垃圾回收

22)请写出你最常见到的5个异常

NullPointException
ClassCastException
ConnectionExpetion
ArrayIndexOutOfBoundException

23)sleep()和wait()的区别

1.sleep是Thread中的方法,wait是Object类中的方法

2.本质区别:sleep不释放锁,只是让当前线程进入休眠阶段,等待休眠时间完后,自动醒来进入可运行状态,不会马上进入运行状态。
wait方法释放锁,然后进入等待此对象的等待锁定池,只有调用notyfy()方法唤醒该线程后才进入可运行状态。

3.sleep可在任何地方使用,wait只能在同步方法或者同步代码块中使用

4.sleep需要捕获or抛出异常,而wait/notify不需要

你可能感兴趣的:(面试)