java基础知识面试题

1.方法重写和重载的区别:

     重写:子类对父类的方法进行重写,方法名和参数必须相同,返回值范围,抛出异常范围要小于父类,访问修饰符的范围要大于父类。

     重载:同一类中出现,除了方法名相同,其他参数皆可不同,发生于编译期。

2.String,StringBuffer,StringBuilder的区别?为啥String不可变?

    可变性:String类用了final关键字修饰,所以对象是不可变的,而StringBuffer和StringBuilder类都是继承的AbstractStringBuilder类,在这个类并未用final关键字修饰,所以对象可变。

    安全性:StringBuffer类中的方法加了同步锁,用了Synchronized关键字,所以线程安全。

    性能:String不可变,每次对String类型的数据进行改变时都要生成新对象,然后指针指向新对象。其他两个可变是对对象本身进行操作。相同情况下使用StringBuilder相比于使用StringBuffer仅能获得10%~15%的性能提升,却要冒线程不安全的风险。

 3.自动装箱与拆箱

  装箱:将基本类型用它们对应的引用类型包装起来;

       拆箱:将包装类型转换为基本数据类型;  

4.== 与 equals

       == : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是 值,引用数据类型==比较的是内存地址)

       equals() : 它的作用也是判断两个对象是否相等,只能比较引用数据类型。但它一般有两种使用情况:

                情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。

                情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相 等,则返回 true (即,认为这两个对象相等)。

5.Java 中的异常处理

      java异常类层次结构图:

 

            在 Java 中,所有的异常都有一个共同的祖先java.lang包中的 Throwable类。                        Throwable: 有两个重要的子类: Exception(异常) 和 Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大量子类。 

            Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无 关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一 般会选择线程终止。 这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和 处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错 误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。                        Exception(异常):是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。 RuntimeException 异常由Java虚拟机抛出。NullPointerException(要访问的变量没有引用任何对象时,抛出该 异常)、ArithmeticException(算术运算异常,一个整数除以0时,抛出该异常)和 ArrayIndexOutOfBoundsException (下标越界异常)。                注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。                          Throwable类常用方法 :

                    public string getMessage():返回异常发生时的详细信息 

                    public string toString():返回异常发生时的简要描述

                   public string getLocalizedMessage():返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可 以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同

                 public void printStackTrace():在控制台上打印Throwable对象封装的异常信息

           异常处理总结:

                      try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。

                      catch 块:用于处理try捕获到的异常。

                      finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句 时,finally语句块将在方法返回之前被执行。

                    在以下4种特殊情况下,finally块不会被执行:

                                  1. 在finally语句块中发生了异常。

                                  2. 在前面的代码中用了System.exit()退出程序。

                                  3. 程序所在的线程死亡。

                                  4. 关闭CPU。

6.接口和抽象类的区别是什么 ?

          1. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以 有非抽象的方法 

         2. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定

         3. 一个类可以实现多个接口,但最多只能实现一个抽象类

         4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定

         5. 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽 象,是一种模板设计,接口是行为的抽象,是一种行为的规范。       

         备注:在JDK8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现 两个接口,接口中定义了一样的默认方法,必须重写,不然会报错。

 

posted @ 2020-09-01 17:25  南柯旧梦  阅读(42)  评论(0)    收藏  举报