1、面向对象的特征
逐字稿:
封装是把对象的属性和行为封装成独立个体,隐藏内部实现细节,只公开必要部分。
继承是子类继承父类的属性和行为,并可添加自己所需的属性和行为。
多态是允许不同对象对同一消息做出不同响应,即同一消息根据发送对象不同有不同处理方式。
详细内容:
面向对象的特征:封装、继承、多态、抽象。
- 封装:就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对
象的内部实现细节,就是把不想告诉或者不该告诉别人的东西隐藏起来,把可以告诉别人的
公开,别人只能用我提供的功能实现需求,而不知道是如何实现的。增加安全性。
- 继承:子类继承父类的数据属性和行为,并能根据自己的需求扩展出新的行为,提高了代码的复用性。
- 多态:指允许不同的对象对同一消息做出相应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。封装和继承几乎都是为多态而准备的,在执行期间判断引用对象的实际类型,根据其实际的类型调用其相应的方法。
- 抽象表示对问题领域进行分析、设计中得出的抽象的概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。在 Java 中抽象用 abstract 关键字来修饰,用 abstract修饰类时,此类就不能被实例化,从这里可以看出,抽象类(接口)就是为了继承而存在的。
2、Java的基本数据类型有哪些?
逐字稿:
Java 的基本数据类型有:
整型:
byte 占 1 个字节。
short 占 2 个字节。
int 占 4 个字节。
long 占 8 个字节。
浮点型:
float 占 4 个字节。
double 占 8 个字节。
字符型:char 占 2 个字节(注:在 Java 中 char 实际占 2 个字节,不是 4 个字节)。
布尔型:boolean,其具体字节数没有明确规定(注:在 Java 规范中并没有明确规定 boolean 占 1 个字节,不同 JVM 实现可能不同)。
3、JDK、JRE、JVM的区别?
逐字稿
JDK(Java Development Kit)是整个 Java 的核心,是 java 开发工具包,包括了 Java 运行环境 JRE、Java 工具和 Java 基础类库。
JRE(Java Runtime Environment)是运行 JAVA 程序所必须的环境的集合,包含 java 虚拟机和 java 程序的一些核心类库。
JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,是整个 java 实现跨平台的最核心的部分,能够运行以 Java 语言写作的软件程序。
4、Java 中==和 equals 的区别
逐字稿:
对于基本类型,双等号(==)比较两边的值是否相同,值相等则返回 true,不等则返回 false。
对于对象类型,双等号(==)比较的是两个对象的地址,即是否是同一个实例,是则返回 true,不是则返回 false。
equals 比较的是对象中的内容,通过重写 equals 方法可以实现内容比较的逻辑。双等号(==)关注对象是否是同一实例,equals 关注对象的值是否相等。
5、接口和抽象类的区别是什么?
逐字稿
抽象类和接口有以下区别:
- 定义关键字不同,抽象类使用 “abstract” 定义,接口使用 “interface” 定义。
- 抽象程度不同,接口比抽象类更抽象、更纯粹。抽象类可以使用 “public”“protected”“private” 这三个访问修饰符,而接口只有 “public”。
- 构造函数方面,抽象类可以有构造函数,接口因为更纯粹所以不能有构造函数。
- 在实际项目中,比如 Spring MVC 里,Service 层通常使用接口来实现。
补充一些其他区别,比如抽象类能有普通方法和成员变量,接口只能有抽象方法和常量等。
- 相同点:
-
- 都是抽象形式,都可以有抽象方法,都不能创建对象
- 都是派生子类形式,抽象类是被子类继承使用,接口是被实现类实现
- 继承抽象类或者实现接口,都必须重写完他们的抽象方法,否则自己要称为抽象类或者报错!
- 都能支持多态,实现解耦合
- 不同点
-
- 抽象类中可以定义类的全部普通成员,接口只能定义常量,抽象方法(jdk8新增的三种方式)
- 抽象类只能被类单继承,接口可以被类多实现。一个类继承抽象类,不能再继承其他类,一个类实现接口,还可以继续继承其他类或者实现其他接口
- 抽象类体现模板思想,更利于做父类,实现代码的复用性(最佳实践)
- 接口更适合做功能的解耦合,解耦合性更强更灵活。(最佳实践)
- 抽象类可以有构造函数;接口不能有。
- 抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
6、什么是单例模式?有几种?
逐字稿:
Java 的单例模式是指在多线程环境下,一个类的实例只会被创建一次。单例模式主要有以下几种类型:
- 懒汉式
-
- 特点:非线程安全,延迟初始化。
- 原理:将构造器私有化,这样就不能通过
new
关键字来创建对象。在类中定义一个方法,当调用这个方法时才在方法内通过new
创建对象。这种方式是在需要使用对象时才去创建它,所以叫延迟初始化。
- 饿汉式
-
- 特点:线程安全,在类加载时就完成初始化。
- 原理:在类中直接定义并初始化单例对象,在类加载时就创建了对象,而不是在使用方法时才创建,这就是与懒汉式的区别。
- 双检锁(双重检查锁定)
-
- 特点:线程安全,延迟初始化。这种方式结合了懒汉式的延迟初始化优点和饿汉式的线程安全优点。在多线程环境下能高效地保证单例的创建。
单例模式:某个类的实例在 多线程环境下只会被创建一次出来。
- 懒汉式:非线程安全,延迟初始化。
- 饿汉式:线程安全,一开始就初始化。
- 双检锁:线程安全,延迟初始化。
7、重载与重写的区别?
逐字稿:
- 重载是对象的方法之间,它们方法名相同,但方法的参数列表不同
- 重写是父子类(包括接口与实现类)中两个同名方法,它们方法名相同,且方法的参数列表相同
- 重载是编译时由编译器来区分方法,而重写是运行时由解释器来区分方法
- 有没有发生重写,可以使用 @Override 来检查
P.S.
- 括号内的说明是为了严谨,自己知道就行,回答时不必说出,这样比较简洁
- 个人觉得,在回答方法重载时,不必去细说什么参数的类型、个数、顺序,就说参数列表不同就完了
- 个人觉得,重点在于点出:重载是编译时由编译器来区分方法,而重写是运行时由解释器来区分方法
- 语法细节,问了再说,不问不必说
-
- 重写时,子类方法的访问修饰符要 >= 父类方法的访问修饰符
- 重写时,子类方法抛出的检查异常类型要 <= 父类方法抛出的检查异常类型,或子类不抛异常
- 重写时,父子类的方法的返回值类型要一样,或子类方法返回值是父类方法返回值的子类