面试: Java 基本概念

1. Java 语言有哪些优点?

  1. 纯面向对象

  2. 平台无关性

  3. 内置很多类库

  4. 提供 Web 应用开发支持

  5. 具有较好的安全性和健壮性

  6. 去除了 C++ 语言中难以理解、容易混淆的特性

2. Java 与 C/C=++ 的区别

  1. Java 为解释性语言,编译器先编译为字节码,再由JVM解释执行;跨平台

  2. Java 纯面向对象,所有代码都在类中实现,除了基本类型都是类,无全局变量、函数;C++面向对象和面向过程兼具

  3. Java 没有指针概念

  4. Java 不支持多重继承,引入接口概念,能实现多个接口

  5. Java 不需要手动管理内存,有垃圾回收器自动回收垃圾;Java 没有析构函数,但有个 finalize() 方法在回收垃圾之前先被调用

3. 关于 public static void main()

  1. public 和 static 没有先后顺序

static public void main(String[] args)
  1. main() 方法可以定义为 final

public static final void main(String[] args)
  1. 可以用 synchronized 修饰

static public synchronized void main(String[] args)

4. 如何在 main() 方法执行前输出 “Hello World”


public class Test{

public static void main(String args[]){

System.out.println("Hello World2");

}

static {

System.out.println("Hello World1");

}

}



// 先输出 1, 再输出2,不管 static 代码块与 main 函数的顺序

5. Java 程序初始化顺序

  1. 静态对象(变量)优先于非静态对象

  2. 父类优先于子类初始化

  3. 按成员变量定义的顺序初始化(在任何方法调用之前先初始化,即使变量定义在方法定义之中)

6. 变量作用域

7. 一个 Java 文件中是否可以定义多个类

一个 Java 文件中可以定义多个类,但是最多只能有一个类被 public 修饰,并且这个类名必须与文件名相同,如果文件中没有 public 类,则文件名可以是里面随便一个类的名字。

编译文件时,会把里面的类都生成一个对应的 .class 文件:


javac Derived.java

会生成两个字节码文件:Base.classDerived.class

8. 什么是构造函数

9. 为什么 Java 中有些接口没有任何方法

接口中城院的作用于修饰符都是 public

接口中的常量值默认用 public static final 修饰

一个接口没有声明任何方法,被叫做 标识接口,对实现它的类没有任何语义上的要求,仅仅充当标识作用。

Java 类库中已存在的标识接口有 Cloneable 和 Serializable,在使用时候通常会用 instanceof来判断实例对象的类型是否实现了一个给定的标识接口。

10. Java 中的 clone 方法有什么用

Java 取消了指针概念,编程中经常忽略对象和引用的区别。

Java 处理基本类型都是按值传递,而其他类型都是按引用传递。

对象除了在函数调用时是引用传递,在使用 = 赋值时也是采用引用传递。

如果只是想创建一个与 A 具有相同状态的对象 B,并且 B 的吸怪不会影响到 A,例如 Prototype 原型模式中,就需要 clone 一个对象的实例。

Object 类已经提供了一个 clone 方法,返回一个对象的复制。

使用 clone 方法的步骤:

  1. 类要实现 Cloneable 接口(实质只是一个接口,没有任何方法)

  2. 类汇总重写 Object 类的 clone() 方法

  3. 在 clone 方法中调用 super.clone()

  4. 把浅复制的引用指向原型对象新的克隆体


class Obj implements Cloneable{

private int aInt =0 ;

// ...

public Object clone(){

Object o = null;

try{

o = (Obj)super.clone();

}

catch (CloneNotSupportedException e){

e.printStackTrace();

}

return o;

}

}

深复制


class Obj implements Cloneable{

private Date birth = new Date();

// ...

public Object clone(){

Object o = null;

try{

o = (Obj)super.clone();

}

catch (CloneNotSupportedException e){

e.printStackTrace();

}

// bith 成员也克隆一份

o.birth= (Date) this.getBirth().clone();

return o;

}

}

即检查类有无非基本类型的成员,无返回 super.clone() 即可,有的话 o.attr=this.getAttr().cone,最后返回 o

注意 clone 在 Object 中被声明为 protected,因此只有在 User 类里面才能克隆 User 对象。

但是子类是可以重载修饰符的,比如上面就变成了 public

11. 什么是反射机制

反射机制在 Java 中是一个重要特性,允许程序在运行时进行自我检查,同时允许对其内部成员进行操作。

反射机制提供的功能主要有:

  1. 得到一个对象所属类;

  2. 获取一个类的所有成员变量和方法;

  3. 在运行时创建对象;

  4. 在运行时调用对象的方法。

在反射机制中,class 是一个非常重要的类,如何获取 class 类?

  1. class.forName("类路径")

  2. 类名.class

  3. 实例.getClass()

常见笔试题:Java 创建对象的方式有几种

  1. 通过 new 实例化一个对象

  2. 通过反射机制创建对象

  3. 通过 clone() 方法创建一个对象

  4. 通过反序列化的方式创建对象

12. package 有什么作用

package (包)是比较抽象的逻辑概念,宗旨是把 .java 文件、.class文件以及其他 resource 文件有条理地进行组织,以供使用。

作用有两个:

  1. 提供多层命名空间,解决命名冲突(不同package种的类可以存在相同的名字)

  2. 对类按功能进行分类,使项目组织更清晰

如何实现类似于 C 语言中函数指针的功能

C++ 中的重要概念:函数指针,其最重要的 功能是实现 回调函数

即函数先在某处注册,在稍后某个需要的时候被调用。

在 Windows 中,程序员想让系统动态链接库 DLL 调用自己编写的一个方法,于是利用 DLL 中的回调函数的接口来编写程序,通过传递一个 函数指针 来被调用,这个过程称为回调。

回调函数一般用于截获信息、获取系统信息或处理异步事件。比如程序员张三写了程序 a,其中预留有回调函数接口,并封装好了该程序,程序员李四让 a 程序调用自己 b 程序中的一个方法,于是通过 a 的接口回调了 b 的一个方法。

函数指针一般作为函数的参数来使用,程序员可以在使用时根据自己的需求传递自定义函数来实现指定功能。

例如,实现排序算法时候,可以传递函数指针来决定两个数的先后顺序,从而决定算法是按升序还是降序。

Java 中没有指针的概念,但是可以利用接口与类实现同样的效果。

首先定义一个接口,然后不同的类实现这个接口(代表了不同的回调方法),然后这些实现类的一个对象作为参数传递给程序,程序去调用这个参数来调用指定函数,从而实现回调函数功能。