基础面试题(一)

1. JAVA跨平台原理

由于各操作系统(windowlinux)支持的指令集,不是完全一致的。就会让我们的程序在不同的操作系统上要执行不同程序的代码。Java开发了适用于不同操作系统及位数的JAVA虚拟机来屏蔽各个系统之间的差异,提供统一的接口。

Java 程序从源代码到运行一般有下面3步:

所以只需要在不同的系统上安装对应的Java虚拟机(JVM),就可以运行java代码。

Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。

 

2. 面向对象的特征有哪些方面

  有四大基本特征:封装、抽象、继承、多态

  封装:将对象封装成一个高度自治和相对封闭的个体(private)。对象的状态(属性)由这个对象自己的行为(方法)来读取和改变(get/set)。例如:自己的名字自己改。

  抽象:抽象就是找出一些事务的相似和共性之处,然后将这些事务归为一个类,这个类只考虑这些事务的相似和共性之处。就是把现实生活中的对象,抽象为类。例如:张三李四都有很多共同之处,年龄、发量等。

  继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础上来进行。把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法(重写override)使之更适合特殊的需要。例如:遗产的继承

  多态:同一个接口,使用不同的实例而执行不同操作。

    在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。

3.抽象类和接口的区别

 第一,概念上不一样。

  接口是对动作的抽象,抽象类是对本质的抽象。通俗一点来说就是,接口表示这个对象能做什么,抽象类表示这个对象是什么。举例,抽象类是人,说明他们都是人。人可以吃东西,狗也可以吃东西。可以定义“吃东西”是一个接口,让这些类去实现它。所以,在Java里面,一个类就只能继承一个类(抽象类),而可以实现多个接口(动作)。

 第二,使用不一样。

  抽象类可以有构造方法,接口中不能有构造方法。

  抽象类中可以有普通成员变量,接口中没有普通成员变量

  抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

  抽象类中的抽象方法的访问类型可以是public,protected和默认类型(虽然

eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

  抽象类中可以包含静态方法,接口中不能包含静态方法

  抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

  一个类可以实现多个接口,但只能继承一个抽象类。

4.重写和重载

  重写:发生在父子类中。方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。如果父类为private,则子类就不能重写该方法。

  重载:发生在同一个类中。方法名必须相同,参数类型、个数、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。

5.==和equals的区别

  == 用来判断两个变量之间的值是否相等。变量可以分为基本数据类型变量,引用类型。如果是基本数据类型的变量直接比较值,引用类型要比较对应的引用的内存首地址。

  equals用来比较两个对象是否长得一样,判断两个对象某些对象是否一样。实际上就是调用对象的equals方法进行比较。

    在网上看到有人这样说“

    equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

  • 情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
  • 情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

      ”

    其实意思是一样的。例如基本数据类型(int,string等)是重写了object的equals()方法,所以比较的是值,类似“==”的作用。

6.String、StringBulider、StringBuffer。

  在java中提供三个类(String、StringBulider、StringBuffer)来表示和操作字符串,字符串就是多个字符的集合。

  String是内容不可变的字符串,底层使用了一个不可变的字符数组(final),源码可查(private final char value[];),可以使用append 追加字符串,重新开辟空间组成新的字符串(新的中间对象),麻烦不推荐。

  StringBuilder 和 StringBuffer 是内容可以改变的字符串,底层使用可变的字符数组(没有使用final)修饰。

  StringBuilder 和 StringBuffer 的区别是:

    StringBuffer是线程安全的,但是效率较低。StringBuilder是线程不安全的,但是效率较高。

 7.Java 中 IO 流分为几种?

  按功能来分:输入流(input)、输出流(output)。

  按类型来分:字节流和字符流。

  字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

8. BIO、NIO、AIO 有什么区别?

  • BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
  • NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
  • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
原文地址:https://www.cnblogs.com/fzzzjjj/p/11260003.html