离线下载
PDF版 ePub版

极客学院团队出品 · 更新于 2018-11-28 11:00:43

Java 基本概念

1. Java 语言的优点?

简单、高效

Java 语言与 C++ 类似,如果用户了解 C++ 和面向对象的概念,就可以很快编写出 Java 程序;此外,Java 又不同于诸如 C++ 语言提供的各种各样的方法,它只提供了基本的方法,这样就减少了编程的复杂性,例如去掉了头文件、指针变量、结构、运算符重载、多重继承等复杂特性。Java 语言虽然简单,却很高效,它可以用面向对象的方法来描述用户的每一个动作。

面向对象

Java 语言是一种新的面向对象的程序设计语言,它除了几种基本的数据类型外,大都是类似 C++ 中的对象和方法,程序代码大多体现了类机制,以类的形式组织,由类来定义对象的各种行为。Java 同样支持类继承,这样也减少了程序设计的复杂性。

平台无关性

所谓一处编译处处运行。Java 语言经编译后生成与计算机硬件结构无关的字节代码( Bytecode ),这些字节代码被定义为不依赖任何硬件平台和操作系统。当 Java 程序在运行时,需要由一个解释程序对生成的字节代码解释执行。这体现了Java语言的与平台无关性,使得 Java 程序可以在任何平台上运行,如 MS-DOS , Windows,Unix 等,因此具有很强的移植性。

交互式特性

Java 是面向对象的网络编程语言,由于它支持 TCP/IP 协议,使得用户可以通过浏览器访问到 Internet 上的各种动态对象。并且在网络上用户可以交互式地进行各种动作,而多线程技术的引入使得这种交互式操作更为容易。

多线程机制

Java 语言支持多线程机制,多线程机制使得 Java 程序能够并行处理多项任务。Java 程序可以设计成具有多个线程,例如让一个线程负责数据的检索、查寻,另一个线程与用户进行交互,这样,两个线程得以并行执行。多线程机制可以很容易地实现网络上的交互式操作。

动态的内存管理机制

Java 语言采用了自动垃圾回收机制进行内存的管理。在 C++ 语言中,程序员在编写程序时要仔细地处理内存的使用,例如当某个内存快使用完毕时,要及时释放,以供其它程序使用,一旦内存管理不当,就有可能造成内存空间浪费或程序运行故障。 在 Java 系统中包括了一个自动垃圾回收程序,它可以自动、安全地回收不再使用的内存块,这样,程序员在编程时就无需担心内存的管理问题,从而使 Java 程序的编写变得简单,同时也减少了内存管理方面出错的可能性。

安全性

在类似 Internet 的这种分布式网络环境中,安全性是个不容忽视的问题。Java 语言在安全性方面引入了实时内存分配及布局来防止程序员直接修改物理内存布局;通过字节代码验证器对字节代码的检验,以防止网络病毒及其它非法代码侵入。此外,Java 语言还采用了许多面向对象的异常处理机制,负责对一些异常事件进行处理,如内存空间不够,程序异常中止等的处理

Java 是解释型的 运行 Java 程序需要一个解释器。Java 程序编译成 Java 虚拟机编码,这种编码称为字节码。字节码是独立于计算机的,他能在所有具有 Java 解释器的机器上运行,Java 解释器也是 JVM 的一部分。

Java 的效率

早期 Sun 发现 JVM 的用户注意到了 Java 运行很慢,但是新的 Java 虚拟机显著加快。新的虚拟机使用了一种称为实时编译的技术,他把字节码编译并储存成本机的机器码。当执行字节码时,重调本地码。

2. 什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”?

Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。

Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

3. Java 和 C++ 有何区别?

Java 和 C++ 都是面向对象语言。也就是说,它们都能够实现面向对象思想(封装,继乘,多态)。而由于 C++ 为了照顾大量的 C 语言使用者,而兼容了 C ,使得自身仅仅成为了带类的 C 语言,多多少少影响了其面向对象的彻底性!Java 则是完全的面向对象语言,它句法更清晰,规模更小,更易学。它是在对多种程序设计语言进行了深入细致研究的基础上,据弃了其他语言的不足之处,从根本上解决了 C++ 的固有缺陷。

Java 和 C++ 的相似之处多于不同之处,但两种语言问几处主要的不同使得Java更容易学习,并且编程环境更为简单。我在这里不能完全列出不同之处,仅列出比较显著的区别:

指针

Java 语言让编程者无法找到指针来直接访问内存无指针,并且增添了自动的内存管理功能,从而有效地防止了 C/C++ 语言中指针操作失误,如野指针所造成的系统崩溃。但也不是说 Java 没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于 Java 程序的安全。

多重继承

C++ 支持多重继承,这是 C++ 的一个特征,它允许多父类派生一个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。Java 不支持多重继承,但允许一个类继承多个接口 (extends+implement) ,实现了 C++ 多重继承的功能,又避免了 C++ 中的多重继承实现方式带来的诸多不便。

数据类型及类

Java 是完全面向对象的语言,所有函数和变量部必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。而 C++ 允许将函数和变量定义为全局的。此外,Java 中取消了 C/C++ 中的结构和联合,消除了不必要的麻烦。

自动内存管理

Java 程序中所有的对象都是用 new 操作符建立在内存堆栈上,这个操作符类似于 C++ 的 new 操作符。下面的语句由一个建立了一个类Read的对象,然后调用该对象的 work 方法:

Read r=new Read();
r.work();

语句 Read r=new Read() ;在堆栈结构上建立了一个 Read 的实例。Java 自动进行无用内存回收操作,不需要程序员进行删除。而 C++ 中必须由程序员释放内存资源,增加了程序设计者的负担。Java 中当一个对象不被再用到时,无用内存回收器将给它加上标签以示删除。Java 里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。

操作符重载

Java 不支持操作符重载。操作符重载被认为是 C++ 的突出特征,在Java 中虽然类大体上可以实现这样的功能,但操作符重载的方便性仍然丢失了不少。Java 语言不支持操作符重载是为了保持 Java 语言尽可能简单。

预处理功能

Java 不支持预处理功能。C/C++ 在编译过程中都有一个预编泽阶段,即众所周知的预处理器。预处理器为开发人员提供了方便,但增加了编译的复杂性。Java 虚拟机没有预处理器,但它提供的引入语句 (import) 与 C++ 预处理器的功能类似。

Java不支持缺省函数参数,而C++支持

在 C 中,代码组织在函数中,函数可以访问程序的全局变量。C++ 增加了类,提供了类算法,该算法是与类相连的函数,C++ 类方法与 Java 类方法十分相似,然而,由于 C++ 仍然支持 C ,所以不能阻止 C++ 开发人员使用函数,结果函数和方法混合使用使得程序比较混乱。

Java 没有函数,作为一个比 C++ 更纯的面向对象的语言,Java 强迫开发人员把所有例行程序包括在类中,事实上,用方法实现例行程序可激励开发人员更好地组织编码。

字符串

C 和 C++ 不支持字符串变量,在 C 和 C++ 程序中使用 Null 终止符代表字符串的结束,在 Java 中字符串是用类对象 ( string 和stringBuffer )来实现的,这些类对象是 Java 语言的核心,用类对象实现字符串有以下几个优点:

(1)在整个系统中建立字符串和访问字符串元素的方法是一致的; (2)Java 字符串类是作为 Java 语言的一部分定义的,而不是作为外加的延伸部分; (3)Java 字符串执行运行时检查,可帮助排除一些运行时发生的错误; (4)可对字符串用“+”进行连接操作。

goto 语句

“可怕”的 goto 语句是 C 和 C++ 的“遗物”,它是该语言技术上的合法部分,引用 goto 语句引起了程序结构的混乱,不易理解,goto 语句子要用于无条件转移子程序和多结构分支技术。鉴于以广理由,Java 不提供 goto 语句,它虽然指定 goto 作为关键字,但不支持它的使用,使程序简洁易读。

类型转换

在 C 和 C++ 中有时出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例如,在 C++ 中可将一浮点值赋予整型变量,并去掉其尾数。Java 不支持 C++ 中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。

异常

Java 中的异常机制用于捕获例外事件,增强系统容错能力

try{

   //可能产生意外的代码
}catch(exceptionType name){
    //处理
}

其中 exceptionType 表示异常类型。而 C++ 则没有如此方便的机制。

4. JDK 和 JRE 的区别是什么?

Java 运行时环境( JRE )是将要执行 Java 程序的 Java 虚拟机。它同时也包含了执行 Applet 需要的浏览器插件。Java 开发工具包( JDK )是完整的 Java 软件开发包,包含了 JRE ,编译器和其他的工具(比如: JavaDoc,Java 调试器),可以让开发者开发、编译、执行 Java 应用程序。

5. Java 支持的数据类型有哪些?什么是自动拆装箱?

Java 语言支持的 8 中基本数据类型是:

  • byte
  • short
  • int
  • long
  • float
  • double
  • boolean
  • char

自动装箱是 Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把 int 转化成 Integer ,double 转化成 Double,等等。反之就是自动拆箱。

6. 什么是值传递和引用传递?

对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。

对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。

7. 一个 ".java" 源文件中是否可以包括多个类(不是内部类)?有什么限制?

可以有多个类,但只能有一个 public 的类,并且 public 的类名必须与文件名相一致。

8. 静态变量和实例变量的区别?

在语法定义上的区别:静态变量前要加 static 关键字,而实例变量前则不加。

在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个 staticVar 变量,并且每创建一个实例对象,这个 staticVar 就会加 1 ;但是,每创建一个实例对象,就会分配一个 instanceVar ,即可能分配多个 instanceVar ,并且每个instanceVar 的值都只自加了 1 次。

 public class VariantTest{   
    public static int staticVar = 0;    
    public int instanceVar = 0;    
    public VariantTest(){    
        staticVar++;    
        instanceVar++;    
        System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);   
        } 
 }    

9. 不通过构造函数也能创建对象吗?

A. 是
B. 否

答案:A

解析:Java 创建对象的几种方式(重要):

(1) 用 new 语句创建对象,这是最常见的创建对象的方法。 (2) 运用反射手段,调用 java.lang.Class 或者 java.lang.reflect.Constructor 类的 newInstance() 实例方法。 (3) 调用对象的 clone() 方法。 (4) 运用反序列化手段,调用 java.io.ObjectInputStream 对象的 readObject() 方法。

(1)和(2)都会明确的显式的调用构造函数 ;(3)是在内存上对已有对象的影印,所以不会调用构造函数 ;(4)是从文件中还原类的对象,也不会调用构造函数。

10. 静态变量和实例变量的区别?

答:静态变量是被 static 修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。在 Java 开发中,上下文类和工具类中通常会有大量的静态成员。

11. 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,因此在调用静态方法时可能对象并没有被初始化。

12. 如何实现对象克隆?

答:有两种方式:

1.实现 Cloneable 接口并重写 Object 类中的 clone() 方法;

2.实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

13. 一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?

答:可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。

14. Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?

答:可以继承其他类或实现其他接口,在Swing编程中常用此方式来实现事件监听和回调。

15. 内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?

答:一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员

16. 列出自己常用的 jdk 包.

答:JDK 常用的 package

java.lang:这个是系统的基础类,比如 String 等都是这里面的,这个 package 是唯一一个可以不用 import 就可以使用的 Package

java.io: 这里面是所有输入输出有关的类,比如文件操作等

java.net: 这里面是与网络有关的类,比如 URL,URLConnection 等。

java.util: 这个是系统辅助类,特别是集合类 Collection,List,Map 等。

java.sql: 这个是数据库操作的类,Connection, Statememt,ResultSet 等

17. JDK, JRE 和 JVM 的区别?

JDK, JRE 和 JVM 是 Java 编程语言的核心概念。尽管它们看起来差不多,作为程序员我们也不怎么关心这些概念,但是它们是不同的针对特定目的的产品。这是一道常见的 Java 面试题,而本文则会一一解释这些概念并给出它们之间的区别。

Java 开发工具包 (JDK)

Java 开发工具包是 Java 环境的核心组件,并提供编译、调试和运行一个 Java 程序所需的所有工具,可执行文件和二进制文件。JDK 是一个平台特定的软件,有针对 Windows,Mac 和 Unix 系统的不同的安装包。可以说 JDK 是 JRE 的超集,它包含了 JRE 的 Java 编译器,调试器和核心类。目前 JDK 的版本号是 1.7,也被称为 Java 7。

Java 虚拟机(JVM)

JVM 是 Java 编程语言的核心。当我们运行一个程序时,JVM 负责将字节码转换为特定机器代码。JVM 也是平台特定的,并提供核心的 Java 方法,例如内存管理、垃圾回收和安全机制等。JVM 是可定制化的,我们可以通过 Java 选项(java options)定制它,比如配置 JVM 内存的上下界。JVM 之所以被称为虚拟的是因为它提供了一个不依赖于底层操作系统和机器硬件的接口。这种独立于硬件和操作系统的特性正是 Java 程序可以一次编写多处执行的原因。

Java 运行时环境(JRE)

JRE 是 JVM 的实施实现,它提供了运行 Java 程序的平台。JRE 包含了 JVM、Java 二进制文件和其它成功执行程序的类文件。JRE 不包含任何像 Java 编译器、调试器之类的开发工具。如果你只是想要执行 Java 程序,你只需安装 JRE 即可,没有安装 JDK 的必要。

JDK, JRE 和 JVM 的区别

JDK 是用于开发的而 JRE 是用于运行 Java 程序的。
JDK 和 JRE 都包含了 JVM,从而使得我们可以运行 Java 程序。
JVM 是 Java 编程语言的核心并且具有平台独立性。

即时编译器(JIT)

有时我们会听到 JIT 这个概念,并说它是 JVM 的一部分,这让我们很困惑。JIT 是 JVM 的一部分,它可以在同一时间编译类似的字节码来优化将字节码转换为机器特定语言的过程相似的字节码,从而将优化字节码转换为机器特定语言的过程,这样减少转换过程所需要花费的时间。

上一篇: 关于 下一篇: 面向对象编程