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

时间:2022-09-12 16:17:16

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出现的问题,比如虚拟机错误(*Error和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接口、反序列化方法

Java面试之Java基础问题答案口述整理的更多相关文章

  1. [Java面试三]JavaWeb基础知识总结.

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

  2. [Java面试二]Java基础知识精华部分.

    一:java概述(快速浏览): 1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒.PDA等的微处理器: 1994年将Oak语言更名 ...

  3. java面试题目偏基础

    一.JAVA基础篇-概念1.简述你所知道的Linux:Linux起源于1991年,1995年流行起来的免费操作系统,目前, Linux是主流的服务器操作系统, 广泛应用于互联网.云计算.智能手机(An ...

  4. Java面试常问问题及答案(非常详细)

    一:java基础1.简述string对象,StringBuffer.StringBuilder区分string是final的,内部用一个final类型的char数组存储数据,它的拼接效率比较低,实际上 ...

  5. JAVA面试常见问题之基础篇

    一.  面向对象的特征:继承.封装.(抽象).多态 继承:继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性. 封装:封装是保证软件部件具有优良的模块性的基础 ...

  6. Java面试大纲-java面试该做哪些准备,java开发达到这样的水平可以涨工资

    Java培训结束,面临的就是毕业找工作.在找工作时,就要针对性地做充分的面试准备.准备不充分的面试,完全是浪费时间,更是对自己的不负责. 上海尚学堂Java培训整理出Java面试大纲,其中大部分都是面 ...

  7. java面试2(java技术栈和Hollis面试内容分享)

    1.什么是java虚拟机? java虚拟机(JVM)是一个可执行java字节码的虚拟机进程,java源文件被编译成能被java虚拟机可执行的字节码文件. 2.什么是平台无关性,java是如何做到平台无 ...

  8. Java 面试前的基础准备 - 01

    使用这个在线网页编辑真的是不习惯,还是 windows live writer 好. 下面列一个清单用于最近的面试:( 清单是网上down的 ) static,final,transient 等关键字 ...

  9. 【Java面试】java基础篇

    总结个人的面试经历以及一些网上的的面试题,以供以后面试与巩固java基础. 1.String.StringBuilder和StringBuffer的区别 String用于存储不可变字符串的类,Stri ...

随机推荐

  1. [WPF实用技巧]如何使WPF的TreeView节点之间有连线

    示例代码:TreeViewEx.zip 原文地址:http://www.codeproject.com/Tips/673071/WPF-TreeView-with-WinForms-Style-Fom ...

  2. Codeforces4D - Mysterious Present(LIS)

    题目大意 给你一张宽为w,长为h的的贺卡,然后给你n个信封,每个信封宽为wi,长为hi,问你最多能在贺卡上嵌套多少个信封,如果某个信封i如果能够装在信封j里,当且仅当w[i]<w[j]& ...

  3. Android四大图片缓存(Imageloader&comma;Picasso&comma;Glide&comma;Fresco)原理、特性对比

    四大图片缓存基本信息 Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用. Picasso 是 Square 开源的项目,且他的主导者是 JakeWharton,所 ...

  4. CSS——图片替换方法比较

    图片替换主要是指将文字替换成图片的技术,即在html语句中使用文字,浏览器显示时用对应的图片显示.其意义在于便于做网站优化(SEO),文字才是搜索引擎寻找的主要对象. 经典的替换方法: Fahrner ...

  5. HSQLDB相关信息及用法汇总

    运行模式 说明 启动命令 JDBC例 内存(Memory-Only)模式 所有数据都在内存里操作.应用程序退出后则数据被销毁.无需另外启动HSQLDB Server 启动方式1:通过程序中首次调用Co ...

  6. Java并发(一)——线程安全的容器(上)

    Java中线程安全的容器主要包括两类: Vector.Hashtable,以及封装器类Collections.synchronizedList和Collections.synchronizedMap: ...

  7. 我们为什么不用 Select &ast; 吗?

    应用程序慢如牛,原因多多,可能是网络的原因.可能是系统架构的原因,还有可能是数据库的原因. 那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们 ...

  8. 移动端1px的解决办法之styled

    做项目的时候总结了一个styled中解决移动端项目1px像素线的问题,封装了一个函数,大家可以直接使用,很方便. 1 import styled from 'styled-components' co ...

  9. 关于Unity中的Input输入事件

    截获鼠标,键盘的消息 监听事件我们都是在Update里面监听的. Unity的虚拟轴打开:Edit-->Project Settings-->Input,打开的各个Name就是双引号里面要 ...

  10. 【cs231n】神经网络学习笔记1

    神经网络推荐博客: 深度学习概述 神经网络基础之逻辑回归 神经网络基础之Python与向量化 浅层神经网络 深层神经网络 前言 首先声明,以下内容绝大部分转自知乎智能单元,他们将官方学习笔记进行了很专 ...