本篇总结的是Java基础知识相关的面试题,后续也会更新其他相关内容
文章目录
- 1、JVM、JRE和JDK的关系?
- 2、Java语言有哪些特点?
- 3、Java和C++的区别有哪些?
- 4、Java有哪些数据类型?
- 5、访问修饰符 public、private、protected,以及不写(默认)时的 区别?
- 6、面向对象和面向过程的区别?
- 7、面向对象的三大特征是什么?
- 8、抽象类和接口有哪些区别?
- 9、成员变量与局部变量的区别有哪些?
- 10、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
1、JVM、JRE和JDK的关系?
答:JDK里面包含了JRE和JVM,JRE里面包含了JVM,它们分别是:
- JVM:全名为
Java Virtual Machine
,是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。 - JRE:全名为
Java Runtime Environment
,是Java的运行环境,里面包括了Java虚拟机和Java程序所需的核心类库,核心类库主要就是java.lang包,里面包含了运行Java程序必不可少的系统类。 - JDK:全名为
Java Development Kit
,它是提供给Java开发人员使用的,其中包含了Java的开发工具和JRE,所以说安装了JDK,就不需要单独再去安装JRE了。其中的开发工具有:编译工具(javac.exe),打包工具(jar.exe)等。
2、Java语言有哪些特点?
答:Java有以下七个特征:
- 简单易学(Java语言的语法与C语言和C++语言很接近)
- 面向对象(封装,继承,多态)
- 平台无关性(Java虚拟机实现平台无关性)
- 支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的)
- 支持多线程(多线程机制使应用程序在同一时间并行执行多项任务)
- 健壮性(Java语言的强类型机制、异常处理、垃圾的自动收集等)
- 安全性
3、Java和C++的区别有哪些?
答:Java和C++的区别有:
- Java与C++都是面向对象的语言,都支持封装、继承和多态。
- C++中有指针,但是Java中不提供指针来直接访问内存,程序内存更加安全。
- Java的类是单继承的,C++支持多重继承(虽然Java的类不可以多继承,但是接口可以多继承)。
- Java有自动内存管理机制,不需要程序员手动释放无用内存。
4、Java有哪些数据类型?
答:Java语言是强类型语言,对于每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间,数据类型又分为基本数据类型和引用数据类型:
基本数据类型:
- 整数类型:byte,short,int,long
- 浮点数据类型:float,double
- 字符型:char
- 布尔型:boolean
引用数据类型:
- 类:class
- 接口:interface
- 数组:[]
- 字符串(特殊):String
这里给字符串类型加了个特殊,为什么说他特殊呢?详见:还在问String属于什么数据类型
一般来说,引用类型在堆里,基本类型在栈里
5、访问修饰符 public、private、protected,以及不写(默认)时的 区别?
private
- 同类内可见
- 使用对象:变量、方法
default
- 同包内可见,不使用任何修饰符。
- 使用对象:类、接口、变量、方法。
protected
- 同包内的类和所有子类可见。
- 使用对象:变量、方法。
public
- 所有类可见。
- 使用对象:类、接口、变量、方法。
6、面向对象和面向过程的区别?
答:面向过程是具体化、流程化的,解决一个问题,你需要一步一步地分析,一步一步地实现。面向对象是模型化的,你只需要抽象出一个类,类就像一个封闭的盒子一样,这个盒子里面有一些解决问题的方法,我们在解决问题时直接去调用这个盒子里面的方法就行了,至于这些方法是怎么实现的我们就不需要管了,我们只需要会调用就行。
面向过程
- 优点:性能比面向对象高,因为面向对象在创建对象时开销比较大,比较消耗资源。
- 缺点:没有面向对象的易维护,易复用,易扩展。
面向对象
- 优点:易维护,易复用,易扩展,由于面向对象有封装、继承、多态的特性,我们可以设计出来低耦合的系统,使系统更加灵活,更加易于维护。
- 缺点:性能比面向过程底。
7、面向对象的三大特征是什么?
答:面向对象的三大特征是封装、继承和多态,分别是:
- 封装:封装将同一类事物的特征和功能包装在一起,只对外暴露需要调用的接口。封装也称为信息的隐藏,在Java中接口是体现封装最常用的方法,在接口中我们没有任何功能的实现(具体实现都交给实现类),只是定义了一系列抽象的方法声明用于外部调用。
- 继承:继承是Java中面向对象最显著的一个特征,继承是从已有的类中派生出新的类,新的类可以吸收已有的属性、行为,并扩展新的能力。Java中不支持多继承,但是支持实现多接口。
- 多态:封装和继承都是为多态来服务的,多态是指同一个行为具有多个不同的表现形式。在Java中方法的重载和重写是实现多态的2种方式。
- 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载。方法重载体现了编译时的多态性。
- 重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,重载对返回类型没有特殊的要求。方法重写体现了运行时的多态性。
多态的三要素:继承 、重写、父类指向子类引用
8、抽象类和接口有哪些区别?
答:抽象类是用来捕捉子类的通用特性的,接口是抽象方法的集合。
从设计层面来讲,抽象类是对类的抽象,是一种模板设计;接口是行为的抽象,是一种行为的规范;
相同点
- 接口和抽象类都不能被实例化。
- 都位于继承的顶端,用于被实现或继承。
不同点
9、成员变量与局部变量的区别有哪些?
答:成员变量:方法外部,类内部定义的变量 ;局部变量:类的方法中的变量。 成员变量和局部变量的区别如下:
1. 作用域
- 成员变量:针对整个类内有效。
- 局部变量:只在某个范围内有效(一般指的就是方法,语句体内)。
2. 存储位置
- 成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。
- 局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。当方法调用完,或者语句结
束后,就自动释放。
3. 生命周期
- 成员变量:随着对象的创建而存在,随着对象的消失而消失
- 局部变量:当方法调用完,或者语句结束后,就自动释放。
4. 初始值
- 成员变量:有默认初始值。
- 局部变量:没有默认初始值,使用前必须赋值。
使用原则
在使用变量时需要遵循的原则为:就近原则,首先在局部范围找,有就使用;接着在成员位置找(由小变大)。
10、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不 同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父
类,访问修饰符大于等于父类(里氏代换原则);
如果父类方法访问修饰符为private则子类中就不是重写。