面试八股文(1)

文章目录

      • 1.面向对象与面向过程区别
      • 2.重载和重写的区别
      • 3.面向对象编程三大特性:封装、继承、多态
      • 4.String、StringBuffer、StringBuilder区别
      • 5.自动装箱和自动拆箱
      • 6.接口和抽象类区别
      • 7.==和equals区别
      • 8.获取用键盘输入常用的两种方法
      • 9.深拷贝和浅拷贝区别
      • 10.final、finally、finalize区别

1.面向对象与面向过程区别

  • 面向过程:面向过程性能比面向对象高。因为类调用需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素时,一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。
  • 面向对象:面向对象易维护、易复用、易扩展。因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,面向对象性能比面向过程低。

2.重载和重写的区别

  • 重载:同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理。
  • 重写:当子类继承父类的相同方法,输入数据一样,但是要做出区别于父类的响应,覆盖父类方法。

重载
Java允许重载任何方法,不只是构造器方法。因此,要完整描述一个方法,需要指出方法名以及参数类型。这叫做方法的签名。例如,String类有四个称为indexOf()的公有方法。它们的签名是:
indexOf(int)
indexOf(int,int)
indexOf(String)
indexOf(String,String)
注意:返回类型不是方法签名的一部分。也就是说,不能有两个名字相同、参数类型页相同却返回不同类型值的方法。
重写
重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。

  1. 方法名、参数列表、返回值必须相同,抛出异常必须小于等于父类,访问修饰符范围大于等于父类。
  2. 如果父类方法修饰符为privatfinalstatic,则子类就不能重写该方法,但是被static`修饰的方法能够被再次声明。
  3. 构造方法无法被重写。
区别点 重载方法 重写方法
发生范围 同一个类中 子类中
参数列表 必须修改 一定不能修改
返回类型 可修改 一定不能修改
异常 可修改 可以减少或删除,一定不能抛出新的或者更广的异常
访问修饰符 可修改 不能做更严格的限制,可以减低限制
发生阶段 编译器 允许期

3.面向对象编程三大特性:封装、继承、多态

封装
封装把一个对象的属性私有化,同时提供一些可以被外界访问属性的方法,如果属性不想被外界访问,我们可以不提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义。
继承
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便的复用以前的代码。

  • 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问的,只是拥有。
  • 子类可以拥有自己的属性和方法,即子类可以给父类进行扩展。
  • 子类可以用自己的方式实现父类的方法。

多态
多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
在Java中两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。

4.String、StringBuffer、StringBuilder区别

可变性
String类中使用final关键字修饰字符串数组来保存字符串,private final char value[],所以String对象是不可变的。
StringBuilderStringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组来保存字符串char[] value,但是没有使用final关键字修饰,所以这两种对象都是可变的。

线程安全性
String中的对象是不可变的,也就可以理解为常量,线程安全。
AbstractStringBuilder是StringBuilder和StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或对调用的方法加了同步锁,所以是线程安全的StringBuilder并没有对方法加同步锁,所以是非线程安全的

性能
每次对String类型进行改变的时候, 都会生成一个新的String对象,然后将指针指向新的String对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StringBuilder相比于StringBuffer仅能获得10%-15%左右的性能提升,但却要冒着线程不安全的风险。

三者总结:

  1. 操作少量数据:适用String
  2. 单线程操作字符串缓冲区下操作大量数据:适用StringBuilder
  3. 多线程操作字符串缓冲区下操作大量数据:适用StringBufer

5.自动装箱和自动拆箱

  • 装箱:将基本类型用它们对应的引用类型包装起来
  • 拆箱:将包装类型转换为基本数据类型
    装箱拆箱解析
    基本数据类型:intfloatdoublebooleancharbyte不具备对象特征,不能调用方法。

为什么要引入自动装箱和自动拆箱?
主要用于Java集合中,List list = new new ArrayList();
list集合如果要放整数的话,只能放对象,不能放基本类型,因此需要将整数自动装箱。

int和Integer区别?

  • Integer是int的包装类,int则是Java的一种基本数据类型。
  • Integer变量必须实例化才能适用,而int变量不需要。
  • Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针向此对象;而int则是直接存储数据值。
  • Integer的默认值是null,int的默认值是0。

6.接口和抽象类区别

  1. 接口默认是public,所有方法在接口中不能有实现(Java8开始接口方法可以有默认实现),而抽象类可以有非抽象方法。
  2. 接口中除了staticfinal变量,不能有其它变量,而抽象类中则不一定。
  3. 一个类可以实现多个接口,但只能实现一个抽象类。接口本身可以通过extends关键字扩展多个接口。
  4. 接口默认修饰符是public,抽象方法可以有publicprotecteddefault这些修饰符。
  5. 从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为规范。

7.==和equals区别

==:它的作用是判断两个对象的地址是否相等。即判断两个对象是不是同一个对象。

  • 如果比较的是基本数据类型,那么比较的是变量的值。
  • 如果比较的是引用数据类型,那么比较的是地址的值。(两个对象是否指向同一块内存)

equals:它的作用是判断两个对象是否相等。

  • 如果类没有覆盖equals()方法,则通过equals()比较该类的两个对象时,等价于通过==比较两个对象。
  • 如果类覆盖了equals()方法,一般比较两个对象的内容是否相等。

8.获取用键盘输入常用的两种方法

方法一:通过Scanner

Scanner input = new Scanner(System.in);
String s = input.textLine();
input.close();

方法二:通过BufferedReader

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String s = input.readLine();

9.深拷贝和浅拷贝区别

深拷贝和浅拷贝就是指对象的拷贝,一个对象中存在两种类型的属性,一种是基本数据类型,一种是实例对象的引用。

  • 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝。
  • 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容。

10.final、finally、finalize区别

  • final:修饰符(关键字)有三种用法:修饰类、变量和方法。修饰类时,意味着它不能再派生出新的子类,既不能被继承,因此它和abstract是反义词。修饰变量时,该变量使用中不被改变,必须在声明时给定初值,在引用中只能读取不可修改,即为常量。修饰方法时,也同样只能使用,不能在子类中被重写。
  • finally:通常放在try…catch的后面构造最终执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,通常可以将释放外部资源的代码写在finally块中。
  • finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器中将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或执行其他清理工作。

你可能感兴趣的:(面试八股文,面试,java)