面试总结之java基础

  • 面向对象的特征:封装、继承和多态
    封装:将数据和操作封装在数据类型内部,只暴露出一定的接口使外界与之交互,外界不需要知道内部的实现细节
    继承:以一个类为基础,并可以添加新的属性或方法来创建一个新类。私有属性无法继承,构造方法无法继承
    多态:指程序中一个变量引用所指向的具体类型和这个变量引用所调用的方法在程序编写时并不确定,只有在程序运行时才能确定。即一个引用变量具体指向哪个类的对象实例以及该引用调用的方法是哪个类的方法只有在运行时才能确定。多态的实现必须满足三个条件:继承、重写以及向上转型。

  • final、finally和finalize的区别
    final:java语言的关键字,可以修饰类、方法和变量,分别表示类不可被继承、方法不可被重写、变量值不可改变
    finally:该关键字是异常处理的最后一步,表示一定会执行,通常用于释放资源
    finalize:是Object类的方法,当jvm对对象进行回收的时候可能会调用此方法,通常用于资源的资源的释放,也是对象避免自己被回收的最后一次机会(在finalize()方法内将该对象赋值给某个引用可以使对象免于回收),此方法只执行一次

  • Exception、Error、运行时异常与一般异常有何异同
    Exception和Error都继承于Throwable类。
    Error表示虚拟机层面的异常,程序无法捕捉无法处理,如StackOverflowError、OutOfMemoryError.
    Exception指程序可以捕捉可以处理的异常,通常又分为受检查异常(普通异常)和非受检查异常(RuntimeException),受检查异常(IOException、SqlException…)程序必须捕捉和处理,而RuntimeException通常是由程序员逻辑错误引起的,程序可以不必处理直接抛出。RuntimeException包括NullPointerException、IllegalArgumentsException、ClassNotFoundException、ArrithmaticException、ArrayIndexOutOfBoundException、UnknownTypeException。

  • int和Integer有什么区别,Integer的值缓存范围
    区别:
    int是基本数据类型,而Integer是一个包装类型
    Integer必须实例化后才能使用,而int不需要
    Integer变量指向的是一个对象,而int变量是值
    Integer变量的初始值为null,而int变量初始值是0
    Integer的值缓存范围是-128-127。因此获取获取两个在-128-127范围内的Integer变量其实是同一个。

  • 包装类,装箱和拆箱
    java是面向对象的语言,但是如果对于很小的变量都创建对象存在堆里会不太高效,因此就产生了基本数据类型,存在栈中(java是面向对象的语言,为什么要设计基本类型?)。同时由于java是面向对象的语言,基本类型不具有对象的特性,因此就有了包装类,使基本类型也具有对象的性质(java有了基本类型,为什么要为基本类型设计包装类?)。jdk为每个基本数据类型都封装了一个对应的包装类。
    装箱:编译器将基本数据类型自动转换为包装类,通过Integer.intValue()方法实现
    拆箱:编译器将包装类自动转换为基本数据类型,通过Integer.parseInt()方法实现

  • String,StringBuilder和StringBuffer的区别
    String是字符串常量,StringBuilder和StringBuffer是字符串变量
    String是不可改变的,StringBuiler和StringBuffer是可以改变的
    StringBuilder是线程不安全的,StringBuffer是线程安全的

  • String类为什么要设计成不可变的
    字符串常量池设计的需要,字符串常量池是jvm的优化手段,如果字符串可变,那么字符串常量池无法实现优化
    安全性的需要,比如数据库的连接使用的是字符串传值,如果字符串可变,那么攻击者可以将数据库连接更改,程序变得不安全
    字符串不可变则对应的hash值也不可变,可以作为hashmap的key使用。

  • 重写和重载的区别
    重写指的是子类重写父类的方法,方法名和参数类型以及参数个数都相同,子类重写的方法访问修饰符不能低于父类
    重载指的是同一类中,方法名相同,参数类型和参数个数不同

  • 抽象类和接口的区别
    抽象类可以又具体的方法,接口中只有抽象方法
    抽象类成员变量可以是各种类型的,而接口中的变量只能是public static final 类型的常量
    抽象类中可以含有静态代码块以及静态方法,接口中不能又静态代码块和静态方法
    一个类只能继承一个抽象类,但是可以实现多个接口
    抽象类是对类的抽象,而接口是对行为的抽象

  • 反射的用途和实现
    反射提供以下功能:运行时判断对象所属的类;运行时创建类的对象实例;运行时调用类的方法;运行时获取类的属性和方法
    反射的主要功能是用于开发各种框架,有aop功能的框架
    实现:
    获取对象所属的类:Class.forName(); xxx.getClass(); xxx.class;
    判断某个对象是否是类的实例:xxx instanceof yyy
    创建某个类的实例:Class.newInstance()方法;获取构造函数对象然后调用它的newInstance()方法
    获取某个类的属性或者方法:getField()、getDeclareField()、getMethod()、getDeclareMethod()
    反射可以忽略权限检查,因此可能会破坏封装性

  • 说说自定义注解的场景和实现方式
    自定义注解一般用于日志管理、权限检查等场景,一般和反射配合使用,比如在标记了日志注解的方法前后通过aop加入打印日志的功能,在标记了权限检查注解的方法执行之前通过aop判断用户是否具有权限
    通过@interface声明一个自定义注解

  • 列出自己常用的jdk包
    java.lang:定义了系统基础类,如String、Integer,是唯一不需要导入就可以使用的类
    java.util:java工具类,提供了各种帮助开发的工具类,如List、Set、Map
    java.io:提供了IO操作需要的类
    java.sql:提供了数据库操作需要的类,如Connection、Statement
    java.net:提供了网络操作需要的类,如URL、Socket

  • MVC设计思想
    MVC是软件开发的一种设计思想,分别指的是模型(Model)、视图(View)、控制器(Controller)。
    模型:处理业务逻辑,为控制层提供数据
    视图:向控制层发送请求,并提供用户使用界面,接收控制层的数据解析呈现给用户
    控制器:接收用户请求并将请求转给合适的模型去处理,同时也将模型层处理得到的数据转发给视图
    优点:解耦合、提高系统的可维护性

  • equals 和 == 的区别
    == 比较的是两个对象的地址值是否相同,也就是判断是否是同一个对象
    equals()方法如果没有被重写,则调用的是Object类的equals方法,此时跟 == 的功能一样,如果对equals方法进行了重写,则比较的是两个对象的值是否相同。
    重写equals方法的原则:
    自反性(x.equals(x) 一定返回true)、
    对称性(x.equals(y),则y.equals(x))、
    传递性(x.equals(y),y.equlas(z),则x.equals(z))、
    一致性(对象未改变的条件下调用equals方法返回值一定相同)、
    非空性(非空x.equals(null)一定返回false)

  • hashcode方法和equals方法的关系
    两个对象equals为true,则它们的hashcode方法返回值一定相同
    相反,如果两个对象的hashcode返回值相同,但是equals方法不一定为true

  • 什么是java序列化和反序列化,如何实现序列化和反序列化?
    序列化就是将对象转换为二进制字节序列的过程
    反序列化就是将二进制字节序列转换为对象的过程
    可以通过让类实现Serializable接口,然后调用ObjectOutputStream.writeObject()方法来序列化,调用ObjectInputStream.readObject()方法来反序列化。
    serialVersionUID是用来验证版本的一致性的,如果某个对象被序列化后,对应的类没有做过修改,类中的serialVersionUID值和对象序列化的serialVersionUID值一致,则认为版本一致,可以反序列化;如果有被修改,则类中的serialVersionUID和对象的serialVersionUID值不一致,不能反序列化

  • Object类中常见的方法,为什么wait和notify方法会放在Object类中
    Object类常见的方法有 hashcode()、equals()、toString()、wait()、notify()、clone()、getClass()、finalize()。
    wait()、notify()方法放在Object类是因为wait和notify方法只有在同步代码中才能调用,而任何对象都可以作为锁,要使任意对象都能调用wait和notify方法就必须将他们设置在Object类中

  • java的平台无关性的如何体现
    java程序编译的class文件在任何安装了jvm的操作系统都能执行,即一次编译处处运行,就是平台无关性的体现,主要是靠不同平台有不同的jvm虚拟机,又因为class文件规范使得不同平台的虚拟机都能读取相同的class文件从而运行程序。

  • jdk和jre的区别
    jdk是java程序开发工具,不仅包含了运行时的环境,还包含了一套编译、运行工具,如javac、java等,而jre仅仅是程序运行时的环境,包括jvm和运行时依赖的核心类库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值