Java知识整理——基础知识

来源:互联网 发布:天涯明月心捏脸数据 编辑:程序博客网 时间:2024/05/16 01:08
  1. 什么是JVM? 为什么称Java为跨平台的编程语言?
    Java虚拟机(Java Virtual Machine)是可以执行Java字节码的虚拟机,每个Java源文件将被编译成字节码文件,然后在JVM中执行。Java之所以被设计成可以在任意的平台运行,而不需要重写或者在不同的平台下重新编译,这些都要归功于Java虚拟机(JVM),因为JVM非常了解特定的指令的长度以及底层硬件平台的特殊性。
  2. JDK和JRE之间的差异是什么?
    Java运行环境(Java Runtime Enviroment) 是运行Java程序的基本的Java虚拟机,包括执行applet的浏览器插件。JDK (Java Development Kit) 是为了开发,编译和执行Java应用程序,针对Java的全功能的软件开发包,包含了JRE,编译器和工具(比如说 JavaDoc 和Java Debugger)。
  3. “static” 关键字是什么意思?在Java里可以 override private 或 static 的方法吗?
    static 关键字表示,访问这个成员变量或方法时,不必获取它属于的类的实例。
    Java 里的 static 方法不能被 override,因为 override 的机制是运行时(runtime)的动态绑定,而 static 方法是在编译时静态绑定的。static 方法并不与任何类的具体实例有关,因此无法应用继承的概念。
  4. 在静态方法里可以访问非静态变量吗?
    Java 中的 static 变量归相应的类所有,它的值对于类的所有实例都是相同的。static 变量是在 JVM 加载类的时候初始化的。如果代码试图访问非静态的变量,而且不是通过类的实例去访问,编译器会报错,因为这些非静态变量还没有被创建呢,并且它们没有与实例相关联。
  5. Java 支持哪些数据类型?什么是 Autoboxing 和 Unboxing?
    Java语言支持的8个基本数据类型如下:
    byte short int long float double boolean char
    Autoboxing 是指在基本数据类型和对应的包装(wrapper)类之间Java 编译器所做的自动转换。例如,编译器将 int 转换为 Integer,将 double 转换为 Double ,等等。逆向的转换称为 unboxing。
  6. 在Java中什么是方法的 Override(覆盖) 和 Overload(重载)?
    Java中方法的 overload 发生的条件是,同一个类里,有两个或以上的方法名称完全相同,但参数列表不同。另一方面,方法的 override 是指,子类重定义了父类里的同一个方法。Override 的方法必须方法名、参数列表和返回类型都完全相同。Override 的方法不会限制原方法的访问权限。
  7. Java中构造函数、构造函数重载的概念和拷贝构造函数
    当类的对象被创建的时候,调用它的构造函数。每个类都有一个构造函数。如果程序员没有为类编写构造函数,Java编译器自动为类创建一个缺省的构造函数。
    构造函数重载和Java中函数重载类似,可以为同一个类创建不同的构造函数,每个构造函数必须拥有唯一的参数列表。
    Java与C++不同,它不支持拷贝构造函数,但是区别仅仅是,如果你没有编写类的拷贝构造函数,Java不会自动创建它。
  8. Java支持多继承吗?
    Java不支持多继承,每个类只允许继承一个类,但是可以实现多个接口。
  9. 接口和抽象类有什么不同?
    Java同时提供和支持抽象类和接口,它们的实现有一些共同的特点,也有如下不同:
    接口中所有的方法默认都是抽象的,而抽象类可以同时包含抽象和非抽象的方法。
    一个类可以实现多个接口,但它只能继承一个抽象类。
    一个类要实现某个接口,必须实现这个接口声明的所有方法。而一个类不需要实现抽象父类中声明的所有方法,不过,这时候这个类也必须声明为抽象类。
    抽象类可以实现接口,而且不需要实现接口中的方法。
    接口中声明的变量默认是final的,而抽象类可以包含非final的变量。
    接口中的成员默认是public的,而抽象类的成员可以是private,protected,或public的。
    接口是绝对抽象的,不可实例化,抽象类也不可以实例化,但可以在main方法中触发实例化(注:通过匿名类实现)。
  10. 传引用和传值
    当对象通过传值调用时,传递的是这个对象的一个拷贝。因此,即使函数修改这个对象,也不会影响原对象的值。
    当对象通过传引用调用时,对象本身没有被传递,而传递的是对象的一个引用。因此,外部函数对这个对象的修改,也会反映到任何出现这个对象的地方。
  11. 浅谈equals和hashcode
    先谈equals。equals是Object类提供的方法之一,只有当一个实例等于它本身的时候,equals()才会返回true值。
    要想正确改写equals()方法,你必须要遵守它的通用约定。下面是约定的内容,来自java.lang.Object的规范,equals方法实现了等价关系,以下是要求遵循的5点:
    1. 自反性:对于任意的引用值x,x.equals(x)一定为true。
    2. 对称性:对于任意的引用值x 和 y,当x.equals(y)返回true时,y.equals(x)也一定返回true。
    3. 传递性:对于任意的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)也一定返回true。
    4. 一致性:对于任意的引用值x 和 y,如果用于equals比较的对象信息没有被修改,多次调用x.equals(y)要么一致地返回true,要么一致地返回false。
    5. 非空性:对于任意的非空引用值x,x.equals(null)一定返回false。
      了解了equals重写,我们再看hashCode()这个方法,hashcode()这个方法也是从object类中继承过来的,在object类中定义如下:
      public native int hashCode();
      说明是一个本地方法,它的实现是根据本地机器相关的。再看它比较“官方”的详细说明:hashCode()返回该对象的哈希码值,该值通常是一个由该对象的内部地址转换而来的整数,它的实现主要是为了提高哈希表(例如java.util.Hashtable提供的哈希表)的性能。
      你可以对它的这样“官方式”的定义漠视,但以下这一点你必须铭记:在每个重写了equals方法的类中,你必须也要重写hashCode方法。如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法与所有基于散列值(hash)的集合类结合在一起正常运行。
      hashCode()的返回值和equals()的关系如下:
      如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。
      如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。
  12. 什么是面向对象编程
    Java是支持并发,基于类的以及面向对象的一种计算机编程语言. 以下列举了面向对象编程的优势:
    1)模块化编程,使维护和修改更加容易
    2)代码重用
    3)提高代码的可靠性以及灵活性
    4)提高代码可读性
    面向对象编程有其非常明显的特性,比如说封装,继承,多态和抽象. 下面我们来分析一下每种特性.
    封装(Encapsulation)
    封装,提供的对象隐藏内部特性和行为的一种能力,每个对象提供了一些方法,其他的对象可以访问并改变其内部数据。在Java中,提供了三种访问修饰符: 公有的,私有的以及保护的。每个修饰符都设定了不同的访问权限,这个权限设置不会因为包的不同而有差异。
    下面是使用封装的一些优点:
    1)通过隐藏属性来保护对象的内部信息
    2)因为可以独立的修改或者扩展对象的行为,从而提高代码的可用性以及维护性
    3)隔离,通过阻止对象使用不希望的互动方式来交互,以此来提高模块化程度。
    你可以通过链接访问我们的教程查看关于封装更多的细节和实例.
    多态(Polymorphism)
    多态就是针对不同的基础数据类型呈现相同接口的一种能力,多态类型就是其操作可以适用于不同类型值的一种类型。
    继承(Inheritance)
    继承提供了一个对象从基类获取字段和方法的一种能力.继承提供了代码的重用性,并且在不更改现有类的情况下,对现有类增加额外的功能。
    抽象(Abstraction)
    抽象是从具体的实例中分离想法的过程,根据他们各自的功能而非具体的实现来开发类. Java中支持创建和存在暴露接口的抽象类, 而没有包括方法的具体实现。抽象方法的宗旨就是将类的行为和具体实现分离开。
    抽象和封装的异同
    抽象和封装是个互补的概念。一方面,抽象专注在对象的行为上,而另外一方面,封装专注于对象的行为的具体实现。封装是通过隐藏对象的内部信息来实现的,因此也可以被看做是抽象的一种策略。
0 0
原创粉丝点击