Java高频面试题—Java基础
1. 面向对象可以解释下吗?都有哪些特性?
答:面向对象是一种思想,可以将复杂的问题简单化,让我们从执行者变为指挥者。面向对象的三大特征:封装、继承和多态。
- 封装:将事务封装成一个类,减少耦合,隐藏细节。保留特定的接口与外界联系,当接口内部发生改变时,不影响外部的调用方。
- 继承:从一个已知的类中派生出另一个新的类,但新的类拥有已知类的属性和方法,并且可以通过覆盖/重写来增强已知类的能力。
- 多态:多态的本质就是一个程序中出现多个同名的不同方法,主要通过三种方式体现:
- 通过子类对父类的覆盖来实现
- 通过一个类中对方法的重载来实现
- 通过将子类对象作为父类对象使用来实现
关于封装
封装主要是为了增加程序的可读性,解耦合并隐藏部分实现细节。
关于继承
首先要明确的是Java中只存在单继承,是不允许多继承的。
另外Java中的构造函数是不能被继承的,如果构造函数被私有化(即被private修饰),是不可以被继承的。
具体原因需要我们先理解子类实例化时的执行顺序:
1.初始化父类的静态成员变量和静态代码块
2.初始化子类的静态成员变量和静态代码块
3.初始化父类的普通成员变量和代码块,在执行父类的构造方法
4.初始化子类的普通成员变量和代码块,在执行子类的构造方法
从这个执行顺序可以看出来,如果父类的构造方法被private修饰后,子类初始化是不可以被执行的,因此被private修饰的构造函数的类是不可以被继承的。
子类是其父类派生产生的,子类有什么特点呢?
1.子类拥有父类非private的属性和方法
2.子类可以添加自己的属性和方法,即对父类进行扩展
3.子类可以重新定义父类的方法,即方法的覆盖/重写
子类可以通过方法的覆盖/重写以及方法的重载来重新定义父类中的方法,那覆盖/重写与重载又有什么区别呢?
覆盖(Override):
覆盖也叫重写,是指父类与子类之间方法的一种关系,子类可以重新声明定义父类中的存在的同名方法,并重写方法体,我们就可以称子类覆盖/重写了父类中的方法,父类中的方法叫做被重写方法,子类中的方法叫做重写的方法。其中子类中重写的方法的方法名、返回值类型以及形参列表必须与父类中完全相同,且权限修饰符不小于父类中被重写的方法·。
重载:
重载是指在一个类中(包括父类)存在多个同名的不同方法,且这些方法的参数个数、顺序以及类型不同,均可以构成方法的重载。
关于多态
通过方法的覆盖/重写和重载可以实现多态,同时也可以通过将子类对象当做父类对象使用来实现多态。
把不同的子类对象都当做父类对象来看,可以屏蔽不同子类对象之间的差异,写出通用代码,做出通用的编程。
对象的引用型变量具有多态性,因为一个引用型变量可以指向不同形式的对象,即子类的对象作为父类的对象来使用。在这里涉及到了向上转型和向下转型。
向上转型
子类对象转为父类对象
向下转型:
父类对象转为子类对象
2. JDK、JRE和JVM的区别与联系有哪些?
答:三者的基本概念如下:
- JDK(Java Development Kit):Java开发工具包,是Java开发环境核心组件,并且提供编译、调试和运行一个Java程序需要的所有工具。
- JRE(Java Runtime Environment):Java运行时环境,是JVM的实现,提供了运行Java程序的平台。JRE包括JVM,但是不包括Java编译器/调试器之类的开发工具
- JVM(Java Virtual Machine):Java虚拟机,当我们运行一个Java程序时,JVM负责将字节码转换为特定的机器代码,JVM提供了内存管理/垃圾回收和安全机制等。
区别与联系
- JDK是开发工具包,用来开发Java程序,而JRE是Java的运行时环境。
- JDK和JRE中都包含了JVM。
- JVM是Java编程的核心,独立于硬件和操作系统,具有平台无关性。而这也是Java一次编译,多出执行的原因。
Java语言的平台无关性是如何实现的?
- JVM屏蔽了操作系统和底层硬件的差异
- Java面向JVM编程,先编译成字节码文件,然后交给JVM解释称机器码执行
- 通过规定基本数据类型的取值范围和行为
Java是编译型语言还是解释性语言?
Java的执行经历了编译和解释的过程,是一种先编译,后解释执行的语言。不可以简单的归到编译型或解释型语言的类别中。