Java教程

Java基础面试

本文主要是介绍Java基础面试,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1. 谈谈对面向对象理解

1.1 封装

  • 将数据和操作数据的方法封装起来,一个类对外只暴露功能接口,而不对外提供实现的细节
  • 尽可能使得类中的成员变量和成员方法的可访问权限达到最小

1.2 继承

  • 子类继承父类,实现对父类功能的拓展及增强
  • 方法重写修改方法:可能引发线程不安全问题,所以string设计成final
  • 组合优先于继承:父类修改,子类也要修改

1.3 多态

  • 指允许不同子类型的对象对同一消息作出不同的响应
  • 多态基于继承
  • 一般多态用的比较多的是接口,这样可以通过接口定义规则,客户端负责具体的实现

2. 修饰符

  • default: 当前包下
  • protected: 当前包下及子类

3. 基本类型数据

  • 基本类型:byte,char,short,int,long,double,float,boolean

4. 谈谈自动装箱和自动拆箱

  • 装箱就是自动将基本数据转换为包装类型,拆箱就是自动将包装器类型转换为基本数据类型
  • 在使用集合类的时候,只能使用引用类型,以及使用一些引用类型的操作,java5引入新特性
  • 避免无意识的类型转换: 比如for循环中对包装类型的自增操作,会影响性能

5. 解释JVM存储

  • 一个java进程启动后,就会开辟一个jvm虚拟机
  • 栈内存: 基本类型数据,引用类型的引用
  • 堆内存:new出来的对象

6. equals和==的区别

  • 基本类型: 只能使用==,比较字面量
  • 引用类型: ==比较地址值, 调用equals的对象如果不重写,就是调用 ==操作

7. String可以被继承吗?

  • 不能,是被final修饰的,所有的属性都是final修饰的,也就是不可变类
  • 线程安全: 多个线程可以同时访问,但不允许修改字符串
  • 常量池:不可变才能实现常量池。如果可变,那么两个指向同一个常量池的数据,其中一个发生改变,其他的都会变化

在这里插入图片描述

8. String和StringBuilder、StringBuffer的区别?

  • 都是用来操作字符串的
  • String: 不可变类,在拼接时候每次都是创建新的对象,+ 实际也是用的StringBuilder,复杂操作时候,会创建多个StringBuilder对象,从而效率低
  • StringBuffer:不会创建新对象,直接拼接,线程安全
  • StringBuilder:线程不安全,但是效率高

9. 重载和重写的区别

  • 重载:一个类中,同一个方法名,不同参数个数或类型,和返回值无关(JVM无法判定是否用了返回值)
  • 重写:子父类,方法的扩展

10. 抽象类和接口

# 1. 来源
将相同类的属性抽取,形成抽象类,进一步抽取,形成接口,提供规范
子类通过继承或者实现的方式,实现具体的细节
多态的前提

# 2. 概念
抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用(对象的某些方法必须子类完善,
所以不能直接new)
抽象类指包含一个抽象方法的,接口中都是抽象方法
抽象类遵守类的单一继承,接口可以进行多实现

# 3. 接口的不良使用
不应该定义常量: 接口应该只暴露使用规范,即导出api,而不是对外暴露
1.1 单纯在一个类中使用的,就定义为一个类的私有变量
1.2 如果一些固定值,就使用枚举(内部枚举或者公共枚举)
1.3 公共的常量,不可实例化的class的常量

11. 静态方法能否调用非静态方法

  • 静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存
  • 非静态方法是属于对象的,对象是在类加载之后创建的

12. String s = new String(“xyz”)

  • 创建了两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象。

13. 聊聊异常

  • Error: 不可恢复的异常, Exception: 用于用户处理的异常
  • RuntimeException, Checked Exception
  • 尽可能少的去自定义异常,假如原来的异常能够说明问题

14. sleep和wait的区别

答: sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态,请参考第66题中的线程状态转换图)。wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态

这篇关于Java基础面试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!