Java常考面试题(二)

      序言

         昨天刚开始的”每日5题面试“这类文章,感觉还不错,把一些平常看似懂了的东西,弄清楚了。就像什么是虚拟机?这个问题,看起来知道,但是要说出个所以然来,又懵逼了,经常回过头来看看做过的面试题,试着用自己的话说出来,看会不会,不会的话就继续看看,理解理解。

                

                                                                                  ------WZY

一、Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

       自己解答:

            覆盖:又称作重写, 前提条件:继承。   子类将父类中的某个方法,原封不动的抄下来,方法体中就自己写

                   注意:子类重写父类的方法,访问修饰符的权限不能低于父类方法的访问修饰符, 其它返回值、方法名、参数,必须一样。

            重载:不需要继承,在自己类中,和自己本类中的某个方法名相同,参数不同,其他没有限制, 这就是方法的重载。

    

       参考答案: 

            Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。


       自我评价:
            大概的要点已经答道,语言上面有点欠缺,不精炼。一看就是个菜鸟~

            1、重载:方法名相同、参数不相同。 修饰符、返回值无所谓。 

            2、重写:方法名、参数、返回值都必须相同、修饰符 >= 父类方法修饰符

                注意:重写是为了进行多态的使用,多态的好处就是能让代码的维护性能更高。而重载是为了一个方法能根据参数的不同,选择更多的功能。

           

     

二、Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?            

        自己解答:

            构造函数:方法名和类名相同,并且没有返回值。每个类中默认有一个无参构造函数。

            构造函数重载:在构造函数中,参数不同,其他相同, 作用,做一些初始化的操作。

            复制构造函数:这个不知道。。。 没遇到过这种需要复制构造函数的情况。

 

        参考答案:

            当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。
            Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。
            Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。

            

        自我评价:

            总体也答道点上了,复制构造函数那个概念,对C++的学习不深,其实没怎么学,所以不知道

            1、构造函数在新对象被创建的时候会调用。每一个类都有构造函数,构造函数的名字跟类名相同,没有返回值,每个类有一个默认的无参构造函数,

            2、构造函数的重载:跟方法的重载类似,唯一的不同就是功能不一样,构造函数的重载,增加不同参数,来达到初始化属性的目的。

 

3、Java支持多继承么?

        自己解答:

            这个问题,有点傻,学了java的人都知道, 肯定不知道多继承啊,java是只支持单继承,多实现。我记得C++中就支持多继承。

        

        参考答案:

            Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。

 

        自我评价:   

            只说出表面答案来,不能更深入的讲解,说明自己所储备的知识不够多,而且自己确实不知道接口可以多继承。这个可以记住。

            1、java 是支持单继承、多实现

            2、实现说的就是一个类实现某个接口,接口中只申明方法,但是没有方法体,接口可以多继承。一个接口继承多个接口,说明该接口扩展更多的功能。

 

4、接口和抽象类的区别是什么?

        自己解答:

             接口:接口中只定义方法,方法中没有方法体, 也就是说只是声明有哪些功能,功能具体的实现要靠实现该接口的类去做。关键字interface

             抽象类:对一类事物相同的部分抽取出来,可以有具体的方法,也可以有不写方法体的方法。特点,关键字 abstract

             区别:

                关键字  interface  abstract

                接口中全是方法的声明,没有方法体   抽象类中可以有方法体,也可以只申明方法,还可以有成员变量。

                接口需要实现 implements   抽象类需要继承 extends

                实现接口,需要实现接口中所有的方法,  继承抽象类,需要重写抽象类中所有的抽象方法,如果不重写,则该类也还是抽象类。抽象类不能new 对象。

 

        参考答案:

             Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
             接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
             类可以实现很多个接口,但是只能继承一个抽象类
               类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
               抽象类可以在不提供接口方法实现的情况下实现接口。
             Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
             Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
               接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
               也可以参考JDK8中抽象类和接口的区别 

 

        自我评价

              看起来好像知道,其实不明白他们两个其中的联系和区别。还有一个理解错了,接口中也能有属性,但是每个变量都声明为 public static final 。也就是常量了

              1、接口是最顶级的抽象,抽象类次之。

              2、接口中所有的变量都市 public static final  而抽象类中能包含任意类型的变量  接口中所有的方法都是abstract。

              3、接口是最顶级的抽象,所以它只声明方法,而没有方法体,而抽象类既可以有方法体的方法,也可以没有,

              4、一个类中有抽象方法,则该类一定要是抽象类。而且继承该类的类必须重写抽象方法,

              5、abstract只能修饰类和方法,不能修饰属性。

              6、一个方法被abstract修饰了,则该方法只能声明,没有方法体。

            

        重新解答:

              区别: 三个方面、 关键字、方法、成员变量、其他。

                关键字: 接口 interface    抽象类 abstract

                接口是最顶级的抽象 抽象类次之

                接口中所有的方法都市抽象的,且接口只能被实现,不能被继承,而抽象类中的方法可以是抽象的,也可以不是,抽象的方法都没有方法体

                接口的成员变量都市public static final 修饰的 是常量   而抽象类则可以是各种类型。

      

五、什么是值传递和引用传递?

        自己解答:

              值传递:针对的是基本数据类型,是把自己的值进来传递

              引用传递:针对的是引用数据类型,传递的是地址值,

                注意:有一个话说,java中所有的都是值传递,没有引用传递,其实说的是真正的值和引用值(地址值)。

 

        参考答案:

              值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.

              引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 所以对引用对象进行操作会同时改变原对象.一般认为,java内的传递都是值传递
          
            这样可能更容易理解。
              public void add(int a) { int b = a; } 这个可以看作是值传递,a是基本数据类型,他把他的值传给了b public void add(Object obj) { Object objTest = obj; } 这个可以看作是址传递,obj是引用数据类型,是把他栈中指向堆中的对象的地址值赋值给了objTest. 这时候就同时有两个引用指向了堆中的某个Object对象 其实这样看来,java应该只有值传递的。如果是基本数据类型,传递的就是实际的值. 如果是引用数据类型,传递的就是该引用的地址值.

 

        自我评价:

              自己解答的不够深入,只是表面上的解答

              1、值传递是针对基本引用类型,如果将值赋予另一个a变量,改变a变量的值,原先变量的值并不会因此改变

              2、引用传递针对的是引用基本类型,如果将a变量的值赋给b变量,改变b变量的的值,a变量的值也会因此改变,因为传递的是一个地址,一个地址中的值改变了,所有指向该地址的对象的值也会相应的改变

 

posted @ 2016-11-09 19:25  有梦想的老王  阅读(1984)  评论(0编辑  收藏  举报