1. JVM、JRE、JDK的关系
- JVM。Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此 Java语言可以实现跨平台。
- JRE。Java Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核 心类库主要是java.lang 包:包含了运行Java程序必不可少的系统类,如基本数 据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
- JDK。Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发 工具,也包括了JRE。所以安装了JDK,就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等
2. Java语言特点
- 简单易学 (Java语言的语法与C语言和C++语言很接近)
- 面向对象 (封装,继承,多态)
- 平台无关性 (Java虚拟机实现平台无关性)
- 网络编程 (Java语言诞生本身就是为简化网络编程设计的)
- 多线程 (多线程机制使应用程序在同一时间并行执行多项任)
- 健壮性 (Java语言的强类型机制、异常处理、垃圾的自动收集等)
- 安全性
3. Java与C++的区别
- 面向对象。都支持封装、继承和多态
- Java 不提供指针来直接访问内存,程序内存更加安全
- Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
- Java 有自动内存管理机制,不需要程序员手动释放无用内存
4. Java数据类型
- 基本数据类型
- 数值型
- 整数类型(byte,short,int,long)
- 浮点类型(float,double)
- 字符型(char)
- 布尔型(boolean)
- 数值型
- 引用数据类型
- 类(class)
- 接口(interface)
- 数组([])
5. 访问修饰符区别
修饰符 | 当前类 | 同包 | 子类 | 其他包 |
---|---|---|---|---|
private | ✅ | |||
default | ✅ | ✅ | ||
protected | ✅ | ✅ | ✅ | |
public | ✅ | ✅ | ✅ | ✅ |
6. Final、finally、finalize区别
- final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
- finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
- finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最后判断。
7. this、super 区别
-
super:它引用当前对象的直接父类中的成员
用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
-
this:它代表当前对象名
在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名
-
super()和this()类似,区别是,super()在子类中调用父类的构造方法,this()在本类内调用本类的其它构造方法。
-
super()和this()均需放在构造方法内第一行。
-
this只能调用一个构造器。
-
this和super不能同时出现在一个构造函数里面
因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
-
this()和super()都指的是对象,所以,均不可以在static环境中使用。包括: static变量,static方法,static语句块。
-
从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
8. static用法
- 修饰成员变量
- 修饰成员方法
- 静态代码块
- 修饰类【只能修饰内部类也就是静态内部类】
- 静态导包
9. 面向对象、面向过程区别
-
面向对象易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
-
面向过程性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源
10. 面向对象的三大特性
-
封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
-
继承:继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承可以提高代码复用性。继承是多态的前提。
关于继承如下 3 点请记住:
- 子类拥有父类非 private 的属性和方法。
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
-
多态:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性
-
方法重载(overload)
编译时的多态性(也称为前绑定),发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回 类型进行区分。
-
方法重写(override)
运行时的多态性(也称为后绑定)。发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。
-
Java实现多态有三个必要条件:继承、重写、向上转型。
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的 方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
-
11. 面向对象五大基本原则
-
单一职责原则
SRP(Single Responsibility Principle)
类的功能要单一
-
开放封闭原则
OCP(Open-Close Principle)
一个模块对于拓展是开放的,对于修改是封闭的。
-
里式替换原则
LSP(the Liskov Substitution Principle LSP)
子类可以替换父类出现在父类能够出现的任何地方。
-
依赖倒置原则
DIP(the Dependency Inversion Principle DIP)
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
-
接口分离原则
ISP(the Interface Segregation Principle ISP) 设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。
12. 抽象类、接口
-
抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。
-
从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
-
相同点:
- 接口和抽象类都不能实例化
- 都位于继承的顶端,用于被其他实现或继承
- 都包含抽象方法,其子类都必须覆写这些抽象方法
-
不同点:
抽象类 接口 声明 abstract interface 实现 extends,如果子类不是抽象方法,需要提供抽象类中所有声明方法的实现 implements,需要提供接口中所有声明方法的实现 构造器 可以有 不可以有 访问修饰符 任意 默认public,不允许private、protected 继承 单继承 多继承 字段声明 任意 static、final
13. 成员变量、局部变量区别
成员变量 | 局部变量 | |
---|---|---|
作用域 | 整个类 | |
存储位置 | 堆 | 栈 |
生命周期 | 随对象 | 方法/语句结束 |
初始值 | 有 | 无,使用前需赋值 |
14. 静态变量、实例变量 区别
- 静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间。被所有的对象所共享,它当且仅当在类初次加载时会被初始化,初始化顺序按照定义的顺序进行初始化。
- 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
15. 静态方法 实例方法 区别
- 调用静态方法可以无需创建对象
- 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法)
16. 静态内部类、成员内部类、局部内部类、匿名内部类
- 匿名内部类还有以下特点:
- 匿名内部类必须继承一个抽象类或者实现一个接口。
- 匿名内部类不能定义任何静态成员和静态方法。
- 当所在的方法的形参需要被匿名内部类使用时,必须声明为 final。
- 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
- 内部类的优点
- 一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据!
- 内部类不为同一包的其他类所见,具有很好的封装性;
- 内部类有效实现了“多重继承”,优化 java 单继承的缺陷。
- 匿名内部类可以很方便的定义回调
- 内部类应用场景
- 一些多算法场合
- 解决一些非面向对象的语句块。
- 适当使用内部类,使得代码更加灵活和富有扩展性。
- 当某个类除了它的外部类,不再被其他的类使用时。
public class Outer {
private int age = 12;
class Inner {
private int age = 13;
public void print