面试相关的技术问题---java基础

时间:2022-02-07 10:21:34

最近在准备秋季校招,将一些常见的技术问题做一个总结!希望对大家有所帮助!

1.面向对象和面向过程的区别是什么?

面向对象是把构成问题的事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。(描述的是行为)

面向过程是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用。(描述的是步骤)

2.Java的四个基本特性(抽象、封装、继承,多态)

抽象,是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。

封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

继承,是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

多态有两种表现形式:重载(方法名相同,参数不同)和覆盖(发生在子类中,用于重写父类方法的行为)

3.Overload和Override的区别

overload:重载,java中的方法重载指的是在一个类中(或者接口中)可以定义多个具有相同方法名和不同参数的函数。重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。

无法以返回型别作为重载函数的区分标准。

Override:覆盖(重写),父类与子类之间的多态性,对父类的函数进行重新定义。一般发生在子类中,用于扩展子类的行为(子类不想原封不动的继承父类的方法,通过覆盖父类方法来实现其自身特有行为)。

 4.构造器Constructor是否可被override

java中构造器是不能被子类继承的,所以当然也不能被override,但是类的构造器可以overload,通过我们会看到一个类有几个不同的构造器。

5.访问控制符public,protected,private,以及默认的区别

面试相关的技术问题---java基础

default:对于同一包中其他类相当于公开。不是同一个包中的其他类相当于私有。

protected:类本身、同包中的任何类、子类都可访问

6. 是否可以继承String类

不可以,String类是final的,不可以被继承。

public final class String implements java.io.Serializable, Comparable<String>, CharSequence

7. String和StringBuffer、StringBuilder的区别

String:字符串常量,长度不可变。

StringBuffer:字符串变量(Synchronized,即线程安全)。如果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString()方法。

StringBuilder:字符串变量(非线程安全)。在内部,StringBuilder对象被当作是一个包含字符序列的变长数组。

String 类型和StringBuffer的主要性能区别:String是不可变的对象, 因此在每次对String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。

使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

StringBuilder一般使用在方法内部来完成类似"+"功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer主要用在全局变量中。

性能:StringBuilder>StringBuffer >String

8. hashCode和equals方法的关系

一般重写equals方法的时候要重写hashCode方法,为的是遵循一种约定:两个在equals的意义下相等(equal)的对象应该有相等的hash code(但并没有说hash code相等就一定equals)。这些约定都是一些实践的需要,java语言规范并没有要求equals和hashCode两个方法一定要有什么关系或满足什么条件。

 9. 抽象类和接口的区别

抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。

  包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:

  1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

  2)抽象类不能用来创建对象;

  3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

  在其他方面,抽象类和普通的类并没有区别。

接口泛指供别人调用的方法或者函数,它是对行为的抽象。

接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。

从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;

2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

5)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象

6)抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。

10. 自动装箱与拆箱

简单一点说,装箱就是  自动将基本数据类型转换为包装器类型;拆箱就是  自动将包装器类型转换为基本数据类型。