zoukankan      html  css  js  c++  java
  • Java面试之Java基础问题答案口述整理

    Java面试之基础问题答案口述整理

    面向对象的理解

    面向对象思想就是在计算机程序设计过程中,把具体事物的属性特性和行为特征抽象出来,描述成计算机事件的设计思想。它区别于面向过程的思想,强调的是通过调用对象的行为来实现功能,而不是自己一步步去操作实现。举个洗衣服的例子,采用面向过程的思想去完成洗衣服这个需求,需要一步步实现,首先把衣服脱下来,再找个盆,加入洗衣粉,加水浸泡,开始洗衣服,然后清洗,再拧干最后晾起来,它强调的是步骤;而采用面向对象的思想去完成这个需求时,我们只需要找到一个对象,然后调用对象的行为来实现需求,而这个对象就是全自动洗衣机,使用这个对象的洗衣功能就能完成需求,它不关注中间步骤,强调的是对象

    对象和类的关系

    类是对一类事物的描述,是抽象的;

    对象是一类事物的实例,是具体的;

    类是对象的模板,对象是类的实体。

    Java语言是一种面向对象的语言,包含了三大基本特征,即封装继承多态

    封装就是把一个对象的属性私有化,对于需要访问的属性提供一些可以被外界访问的公共方法。采用private关键字来完成封装操作,被private关键字修饰的的成员变量和成员方法,只能在本类中访问。适当的封装可以让代码更容易理解和维护,也加强了代码的安全性。

    继承就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性和行为。子类可以直接访问父类中的非私有的属性和行为(共性抽取)。同时子类可以拥有自己的属性和方法实现对父类的扩展,同时子类也可以根据需要重写父类方法实现对父类的增强Java只支持单继承

    多态指的是同一行为具有多个不同的表现形式。比如跑这一行为,猫、狗、马等跑起来是不用一样的。像这样同一行为,通过不同事物可以体现不同形态,这就是多态。在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和实现(实现接口时重写接口中的同一方法)。在Java中多态体现在:父类引用指向子类对象、方法重写。多态的优点在于使程序编写更简单,同时具有良好的扩展性。

    抽象类和接口

    说到抽象类,先说抽象方法,抽象方法就是没有方法体的方法,我们把包含抽象方法的类叫做抽象类。采用格式修饰符 + abstract class + 类名来定义一个抽象类。抽象类方法可以是publicprotecteddefault修饰。

    • 抽象类不能创建对象;
    • 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类;
    • 抽象类的子类必须重写父类中所有的抽象方法,除非该子类也是抽象类;

    接口是Java中的一种引用类型,是方法的集合,接口内部封装了方法,包含抽象方法(JDK7及以前),默认方法和静态方法(JDK8),私有方法(JDK9)。采用修饰符 + interface + 接口名来定义一个接口。接口不能创建对象,可以被实现(implements关键字)。接口方法默认是public修饰。实现接口的类必须实现接口中所有抽象方法,否则必须是一个抽象类。通过对接口中抽象方法进行重写可以进行接口多实现,这是多态的体现。接口的好处在于:1)制定标准。制定标准的目的就是为了让定义和实现分离,而接口作为完全的抽象,是标准制定的不二之选。2)提供抽象。接口的抽象特性得以让接口的调用者和实现者可以完全的解耦。

    类中各部分的初始化顺序

    一个类中的初始化顺序

    类内容(静态变量、静态代码块)==> 实例内容(成员变量、初始化块、构造器)

    具有继承关系的两个类的初始化顺序

    父类静态变量、静态代码块 ==> 子类静态变量、静态代码块 ==> 父类成员变量、初始化块、构造器 ==> 子类成员变量、初始化块、构造器

    Java创建类的实例的几种方法

    • new关键字

      User user = new User();
      
    • 反射

      // 方法1: Class.forName("全类名")
      User u1 = (User) Class.forName("com.chiaki.domain.User").newInstance();
      // 方法2: 已有实例对象.getclass()
      User u = new User();
      User u2 = u.getClass().newInstance();
      // 方法3: 类名.class
      User u3 = User.class.newInstance();
      
    • 调用对象的clone()方法,只限于实现了java.lang.Cloneable接口的类。

      User user = new User();
      User userCopy = (User) user.clone();
      
    • 运用反序列化手段

      序列化指将对象状态转化为可保持或传输的格式的过程,被序列化的对象必须实现java.io.Serializable接口(被statetransient关键字修饰的成员变量不能被序列化)。因此通过反序列化手段可以将流转化成对象,从而完成对象的创建。

    JVM、JDK、JRE的关系

    JVM全称Java Virtual Machine,即Java虚拟机,是运行Java字节码(.class文件)的虚拟机。JVM面对不同的OS会有特定的实现,目的在于使用相同的字节码文件,在不同OS都会给出相同结果(一次编译,处处运行)。

    JDK全程Java Development Kit,即Java开发工具包。JDK = Java开发工具(编译器javac、jar、javadoc等) + JRE。

    JRE是Java运行时环境,用于运行已经编译的Java程序。JRE = JVM + Java核心类库(java.lang包)。

    总结:JDK = Java开发工具 + JRE = Java开发工具 + JVM + Java核心类库

    Java的数据类型

    基本类型:byte[1]、short[2]、int[4]、long[8]、float[4]、double[8]、char[2]、boolean[1]

    引用类型:接口、数组、类

    为什么有了double后还需要long?

    • long与double在java中本身都是用64位存储的,但是他们的存储方式不同,导致double可储存的范围比long大很多;
    • long可以准确存储19位数字,而double只能准备存储16位数字(实际测试,是17位)。double由于有exp位,可以存16位以上的数字,但是需要以低位的不精确作为代价。如果一个大于17位的long型数字存到double上,就会丢失数字末尾的精度;
    • 如果需要高于19位数字的精确存储,则必须用BigInteger来保存,当然会牺牲一些性能。

    重写和重载

    重写(Override)的范围是在继承关中的子类中,发生在运行期,指的是方法名相同,参数列表相同,返回类型相同,异常范围小于等于父类,访问修饰符的范围大于等于父类;

    重载(Overload)的范围是在同一个类中,发生在编译期,指的是方法名相同,参数列表不同(顺序、个数),返回类型、异常以及访问修饰符都可以修改。

    构造方法可以重载,但不能重写。

    String、StringBuffer 和 StringBuilder

    可变性:String类中使用final关键字修饰字符数组,所以String对象不可变;StringBuffer和StringBuilde继承自AbstractStringBuilder类,没有使用final修饰,是可变的。

    线程安全性:String对象不可变,线程安全;StringBuffer类中的方法使用synchronized关键字修饰,是线程安全的;StringBuilder类中的方法没有进行同步处理,线程不安全。

    性能:对String对象进行改变时都会生成新的String对象,然后将引用指向新的String对象。StringBuffer和StringBuilder每次都是对自身对象进行操作,但由于StringBuffer需要进行同步处理,其性能比StringBuilder低。

    == 与 equals()

    == : 判断两个对象的地址是否相等,即判断两个对象是不是同一个对象。当对象为基本数据类型时,比较的是值;当对象为引用数据类型时,比较的是内存地址。

    equals() : 判断两个对象是否相等。分两种情况:

    • 未重写:与 == 等价;
    • 已重写:比较两个对象的内容是否相等。

    hashCode() 与 equals()

    hashCode()用于获取对象的散列码,返回一个int类型整数,散列码可以用于确定对象在哈希表中的索引位置,因此hashCode()在散列表中才有用。

    equals() : 判断两个对象是否相等。分两种情况:

    • 未重写:与 == 等价;
    • 已重写:比较两个对象的内容是否相等。

    hashCode()和equals()的相关规定:

    • 若两个对象A和B相等,那么A.equals(B)和B.equals(A)均返回true;
    • 若两个对象A和B相等,那么A和B的hashCode值也一定相等;
    • hashCode值相同的两个对象,其不一定相等(比如String对象“通话”和“重地”);
    • 基于以上3点,在重写equals()方法后,也必须重写hashCode()方法;
    • 以HashSet为例,先使用hashCode()方法判断,相同再使用equal()方法。如果只重写了equals()方法而不重写hashCode()方法,会造成hashCode()的值不同,而equals()方法判断结果未true的情况,从而违背上述规定。

    进程与线程

    进程是程序的一次执行过程。系统运行一个程序就是一个进程从创建、运行到消亡的过程。

    线程是比进程更小的执行单位,一个进程中可以有多个线程。线程共享进程的堆和方法区的资源,同时线程还有私有的程序计数器、虚拟机栈和本地方法栈。

    线程的基本状态:NEW、RUNNABLE、BLOCKED、WAITING、TIME_WAITING、TERMINATED

    final、finally和finalize

    final关键字可以用于修饰变量、方法和类。final修饰变量时,如果是基本数据类型变量,则该变量一旦初始化后便不能修改,如果是引用类型变量,则改变了初始化后不能再指向另一对象;final修饰方法会将方法锁定,防止任何继承类对方法进行修改;final修饰类时表明该类不能被继承,final修饰的类中的所有成员方法都会被隐式指定为final方法。

    finally常与try-catch代码块一起使用,通常将一定要执行的代码放入finally块中,比如关闭资源的相关代码。无论是否捕获或者处理异常,finally块里的语句都会被执行。

    finally块不被执行的情况:

    • finally块中第一行出现异常;
    • 在前面的代码中使用了System.exit(int)已退出程序。
    • 程序所在的线程死亡;
    • 关闭CPU。

    finalize是属于Object类的方法,该方法一般由垃圾回收器调用。当调用System.gc()时,垃圾回收器会调用finalize()方法判断一个对象是否可以回收。

    Java中的异常处理

    java.lang.Throwable类的两个重要子类:Error和Exception。Error是程序无法处理的错误,主要是JVM出现的问题,比如虚拟机错误(StackOverFlowError和OutOfMemoryError);Exception是程序可以处理的异常,主要有NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException等

    异常处理的方法:

    • 指定方法中抛出指定异常

      throw new ArrayIndexOutOfBoundsException("数组下标越界了!");
      
    • 在方法后声明可能的异常

      throws IOException
      
    • 捕获异常:try-catch-finally

    获取键盘输入(笔试常用)

    通过Scanner:

    Scanner sc = new Scanner(System.in);
    String s = sc.nextLine();
    

    通过BufferedReader:

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

    Java的常用IO流

    字节输入/输出流:FileInputStrean/FileOutputStream

    字符输入/输出流:BufferedReader/BufferedWriter、InputStreamReader/OutputStreamWriter

    浅拷贝与深拷贝

    浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝;

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

    如何实现深拷贝?

    实现Cloneable接口、反序列化方法

  • 相关阅读:
    【C#进阶系列】06 类型和成员基础
    纪中5日T1 1564. 旅游
    纪中17日T1 2321. 方程
    纪中17日T2 2322. capacitor
    纪中10日T1 2313. 动态仙人掌
    纪中14日听课小结 图论 最短路 二分图 差分约束
    一个抓猫的游戏 消遣GAME 持续更新中!
    洛谷P1464 Function  HDU P1579 Function Run Fun
    洛谷P1976 鸡蛋饼
    纪中12日T1 2307. 选择
  • 原文地址:https://www.cnblogs.com/chiaki/p/13692145.html
Copyright © 2011-2022 走看看