java基础面试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础面试相关的知识,希望对你有一定的参考价值。

1、使用final关键词修饰一个变量时,是引用不能变,还是引用的变量不能变?

   使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:final StringBuffer a=new StringBuffer("immutable");

执行如下语句将报告编译错误:a=new StringBuffer("");

但是执行如下则可以通过编译:a.append("lallaal");

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:

public void method(final StringBuffer param){},实际上,这是办不到的,该方法在内部依旧可以修改对象参数。

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

   在语法定义上的区别:静态变量需要static修饰,而实例变量则不需要。

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

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

  不可以,因为非static方法是要和被创建对象关联在一起的, 必须创建一个对象 后才可对非静态方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个静态方法被调用的时候,可能还没创建任何实例对象,如果从static方法中发出对非static方法的调用,那非static方法无法确认是关联到哪一个对象上。所以答案是不可以。

4、Integer和int的区别

   int是java提供的8中原始数据类型之一。java为每一个原始数据类型提供了封装类。Integer就是int的封装类。int默认值为0,Integer默认值为null。前者无法表达出未赋值的状态,后者可以区分。

5、Overload和Override的区别?Overloaded的方法是否可以改变返回值的类型?

  Overload是重载,Overrid是覆盖,也就是方法的重写。

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

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

  至于Overloaded的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。

  覆盖需要注意一下几点:

  a、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

  b、覆盖的方法的返回值必须和被覆盖的方法的返回一致;

  c、覆盖的方法所抛出的异常必须和被覆盖方法所抛出的异常一致,或者是其子类;

  d、被覆盖的方法不能是被private修饰的方法,否则在其子类中只是定义了一个名字相同的新方法;

  Overload需要注意的几点:

  

  1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));

        2、不能通过访问权限、返回类型、抛出的异常进行重载;

        3、方法的异常类型和数目不会对重载造成影响;

6、abstractclass和interface语法上有什么区别?

  1.抽象类可以有构造方法,接口中不能有构造方法。

  2.抽象类中可以有普通成员变量,接口中没有普通成员变量

  3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

  4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然

  eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

  5. 抽象类中可以包含静态方法,接口中不能包含静态方法

  6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是publicstatic final类型,并且默认即为publicstatic final类型。

  7. 一个类可以实现多个接口,但只能继承一个抽象类。

7、String、StringBuffer、StringBuilder的区别?

  String字符串常量(final修饰,不可被继承),String是常量,当创建之后即不可更改。

  StringBuffer字符串变量,线程安全,也是final修饰,不允许被继承,其中的绝大数方法都进行了同步处理,包括常用的appen方法也进行了同步处理(Synchronized),其toString方法会进行对象缓存,以减少元素的开销。

1 public synchronized String toString() { 
2 if (toStringCache == null) { 
3 toStringCache = Arrays.copyOfRange(value, 0, count); 
4 } 
5 return new String(toStringCache, true); 
6 }

  StringBuilder字符串变量(非线程安全的)与StringBuffer一样都继承和实现了相同的接口和类,方法除了没有进行同步处理(synchronize)以外基本一致,不同之处在于toString方法会返回一个对象

1 public String toString() { 
2 // Create a copy, don’t share the array 
3 return new String(value, 0, count); 
4 }

8、ArrayList和LinkedList有什么区别?

  两者都实现了list的接口,主要不同之处:

  1、ArrayList是基于索引的数据接口,它的底层是数组,可以以O(1)的时间复杂度对元素进行随机访问,LinkedList是以元素列表的形式存储它的数据,每一行元素否和它的前一个和后一个元素连接在一起,这种情况下查找的复杂度为O(n)。

  2、相对ArrayList,LinkedList的插入、添加和删除操作的速度快,因为元素被添加到集合中的任意位置是,不需要想数组那样重新计算大小或者更新索引。

  3、LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用个,一个指向前一个元素,一个指向后一个元素。

9、讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候, 他们的执行顺序

父类的静态变量-->父类的静态代码段-->子类的静态变量-->子类的静态代码段-->父类的非静态变量-->父类的构造函数-->子类的非静态变量-->子类的构造函数。

10、

以上是关于java基础面试的主要内容,如果未能解决你的问题,请参考以下文章

面试常用的代码片段

面向面试编程代码片段之GC

经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!

JAVA基础面试题

Java语言基础之方法的设计

Java面试题Java基础