Java常见经典面试题(一)

Java常见经典面试题(一)

1.谈谈对面向对象的理解?
答:在我理解,面向对象是向现实世界模型的自然延伸,这是一种“万物皆对象”的编程思想。在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动,所以程序=对象+消息。

说到面向对象就不得不提,他的三大特性,封装、继承和多态。
封装就是将一类事物的属性和行为抽象成一个类,使其属性私有化,行为公开化,提高了数据的隐秘性的同时,使代码模块化。这样做使得代码的复用性更高。
继承则是进一步将一类事物共有的属性和行为抽象成一个父类,而每一个子类是一个特殊的父类–有父类的行为和属性,也有自己特有的行为和属性。这样做扩展了已存在的代码块,进一步提高了代码的复用性。
如果说封装和继承是为了使代码重用,那么多态则是为了实现接口重用。简单来说,多态就是允许父类引用(或接口)指向子类(或实现类)对象。

2.Java语⾔和其他语⾔区别?
答:这就得从java语言的特点说起了。
1.⼀处编译,多处运⾏(Java 虚拟机实现平台⽆关性)。
2.⾃带内存管理机制。
3.⽀持多线程(C++ 语⾔没有内置的多线程机制,因此必须调⽤操作系统的多线程功能来进⾏多线程程序设计)。
4.属于解释型语言(C语言是编译型语言,C中有指针的概念,java取消了指针的概念)

3.JRE、JDK、JVM区别?
答:首先看他们各自的概念:
JVM:Java 虚拟机,是运⾏ Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),⽬的是使⽤相同的字节码,它们都会给出相同的结果。
JRE: 运⾏时环境。它是运⾏已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的⼀些基础构件。
JDK:是功能⻬全的 Java SDK。它拥有 JRE 所拥有的⼀切,还有编译器(javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序。
简单理解:JDK=JRE(包含JVM+核心类库(JavaAPI))+开发工具

4.什么是字节码?采⽤字节码的好处是什么?
答:在 Java 中,JVM 可以理解的代码就叫做 字节码 (即扩展名为 .class 的⽂件),它不⾯向任何特定的处理器,只⾯向虚拟机;
Java 语⾔通过字节码的⽅式,在⼀定程度上解决了传统解释型语⾔执⾏效率低的问题,同时⼜保留了解释型语⾔可移植的特点

5.配置classpath的作⽤?
答:这是java系统环境变量,我们编译.java是通过javac命令来实现,运⾏是通过java来实现。这2个命令是在JDK包中存放的,如果我们的.java⽂件不放在javac命令所在的⽬录下系统就会报找不到javac,配置classpath是为了在系统的任意⽬录下都可以运⾏javac java命令

6.JDK1.8之前和JDK1.8之后接口不同?
答:先来回顾一下什么是接口,接口指系统对外提供的所有服务(Interface定义的实实在在的接口,即接口类型)【只能有抽象方法】 的入口,是一个抽象类型。一个类通过实现接口的方式,从而继承接口的抽象方法;一个类只能继承一个类,但可以继承多个接口一个接口不能实现另一个接口,但可以继承多个其他接口
JDK1.8之前:
1.接口中的变量都是静态变量(public static final),必须显式初始化
2.接口中所有方法默认都是public abstract
3.接口没有构造方法,不可以被实例化,但可以被实现(常作为类型使用,也就是父类引用指向子类对象)
4.实现类必须实现接口的所有的方法
5.实现类可以实现多个接口(java中的多继承)
JDK1.8之后:
1.接口里可以有(default关键字修饰的)默认方法(方法体)了
默认方法可以被继承,通过实例调用,可以有多个。如果一个类实现了多个接口,多个接口都定义了多个同样的默认方法时就需要实现类覆盖重写接口中的默认方法,不然会报错,可以使用super来调用指定接口的默认方法。
2.接口里可以声明(并且可以提供实现)的静态方法
接口中的静态方法必须是public的,public修饰符可以省略,static修饰符不能省略,静态方法不能被继承即覆盖,所以只被具体所在的接口调用,接口中静态方法可以有多个。
简单来说:JDK1.8之前接口只能有抽象⽅法,JDK1.8之后接口中可以有不同⽅法,但是⽅法必须⽤static或者default来修饰

7.接口和抽象类区别?
答:相同点:都代表系统的抽象层;都不能被实例化;都能包含抽象方法(用于描述系统提供的服务,不必提供具体实现)
不同点:一个类只能继承一个直接父类,但可以实现多个接口;
抽象类有构造器 接口没有构造器;抽象类中可以有普通⽅法 接口中有没有要区 分JDK版本;
抽象类中成员变量⾃⼰定义权限修饰 接口成员变量默认为public static final;
从设计层⾯来说,抽象是对类的抽象,是⼀种模板设计,⽽接⼝是对⾏为的抽象,是⼀种⾏为的规范

8.Java 应⽤程序与⼩程序之间有哪些差别?
答:简单说应⽤程序是从主线程启动(也就是 main() ⽅法)。applet ⼩程序没有 main() ⽅法,主要是嵌在浏览器⻚⾯上运⾏(调⽤ init() 或者 run() 来启动)

9.Java中的常用容器有哪些?
答:数据容器主要分为了两类,Collection:(存放独立元素的序列)和Map(存放key-value型的元素对)常用的容器有:
ArrayList:其数据结构采用的是线性表,此种结构的优势是访问和查询十分方便,但添加和删除的时候效率很低。
LinkedList :其数据结构采用的是链表,此种结构的优势是删除和添加的效率很高,但随机访问元素时效率较ArrayList类低。
HashSet: Set类不允许其中存在重复的元素(集),无法添加一个重复的元素(Set中已经存在)。HashSet利用Hash函数进行了查询效率上的优化,其contain()方法经常被使用,以用于判断相关元素是否已经被添加过
HashMap: 提供了key-value的键值对数据存储机制,可以十分方便的通过键值查找相应的元素,而且通过Hash散列机制,查找十分的方便。

10.线程和进程有什么区别?
答: 什么是进程?
进程是程序的⼀次执⾏过程,是系统运⾏程序的基本单位,因此进程是动态的。系统运⾏⼀个程序即是⼀个进程从创建,运⾏到消亡的过程。在 Java 中,当我们启动 main 函数时其实就是启动了⼀个 JVM 的进程,⽽ main 函数所在的线程就是这个进程中的⼀个线程,也称主线程。
什么是线程?
线程与进程相似,但线程是⼀个⽐进程更⼩的执⾏单位。⼀个进程在其执⾏的过程中可以产⽣多个线程。与进程不同的是同类的多个线程共享进程的堆和⽅法区资源,但每个线程有⾃⼰的程序计数器、虚拟机栈和本地⽅法栈,所以系统在产⽣⼀个线程,或是在各个线程之间作切换⼯作时,负担要⽐进程⼩得多,也正因为如此,线程也被称为轻量级进程。
两者的区别?
地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。
执行过程:每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
线程是处理器调度的基本单位,但是进程是系统运⾏程序的基本单位。

猜你喜欢

转载自blog.csdn.net/Z3068236782/article/details/114703047