1、(Java)程序员面试-9 及答案解析(总分:100.00,做题时间:90 分钟)一、论述题(总题数:25,分数:100.00)1.Java 语言有哪优点 (分数:4.00)_2.Java 与 C/C+有什么异同 (分数:4.00)_3.为什么需要 public static void main (Stringargs)这个方法 (分数:4.00)_4.如何实现在 main()方法执行前输出“Hello World” (分数:4.00)_5.Java 程序初始化的顺序是怎样的 (分数:4.00)_6.Java 中的作用域有哪 (分数:4.00)_7.一个 Java 文件中是否可以定义多个类 (
2、分数:4.00)_8.什么是构造函数 (分数:4.00)_9.为什么 Java 中有接口没有任何方法 (分数:4.00)_10.Java 中的 clone 方法有什么作用 (分数:4.00)_11.什么事是反射机制 (分数:4.00)_12.package 有什么作用 (分数:4.00)_13.如何实现类似于 C 语言中函数指针的功能 (分数:4.00)_14.面向对象与面向过程有什么区别 (分数:4.00)_15.面向对象有哪特征 (分数:4.00)_16.面向对象的开发方式有什么优点 (分数:4.00)_17.什么是继承 (分数:4.00)_18.组合和继承有什么区别 (分数:4.00)_
3、19.多态的实现机制是什么 (分数:4.00)_20.重载和覆盖有什么区别 (分数:4.00)_21.抽象类 (分数:4.00)_22.内部类有哪 (分数:4.00)_23.如何获取父类的类名 (分数:4.00)_24.this 与 super 有什么区别 (分数:4.00)_25.变量命名有哪规则 (分数:4.00)_(Java)程序员面试-9 答案解析(总分:100.00,做题时间:90 分钟)一、论述题(总题数:25,分数:100.00)1.Java 语言有哪优点 (分数:4.00)_正确答案:()解析:Sun Microsystems 公司对 Java 语言的描述如下:“Java is
4、 a simple, object-oriented, distributed, interpreted, robust, secure, architecture neutral, portable, high-performance, multithreaded, and dynamic language”。具体而言,Java 语言具有以下几个方面的优点: 1) Java 为纯面向对象的语言。Java 编程思想提到 Java 语言是一种“Everything is object”的语言,它能够直接反应现实生活中的对象,例如火车、动物等,因此通过它,开发人员编写程序更为容易。 2)平台无关性
5、。Java 语言可以“一次编译,到处运行”。无论是在 windows 平台还是在 Linux、MacOS 等其他平台上对 Java 程序进行编译,编译后的程序在其他平台上都可以运行。由于 Java 为解释型语言,编译器会把 Java 代码变成“中间代码”,然后在 Java 虚拟机(Javavirtual Machine, JVM)上解释执行。由于中间代码与平台无关,因此,Java 语言可以很好地跨平台执行,具有很好的可移植性。 3)Java 提供了很多内置的类库,通过这些类库,简化了开发人员的程序设计工作,同时缩短了项目的开发时间,例如,Java 语言提供了对多线程的支持,提供了对网络通信的支
6、持,最重要的是提供了垃圾回收器,这使得开发人员从对内存的管理中解脱出来。 4)提供了对 Web 应用开发的支持,例如,Applet、Servlet 和 JSP 可以用来开发 Web 应用程序;Socket、RMI 可以用来开发分布式应用程序的类库。 5)具有较好的安全性和健壮性。Java 语言经常被用在网络环境中,为了增强程序的安全性,Java 语言提供了一个防止恶意代码攻击的安全机制(数组边界检测和 Bytecode 校验等)。Java 的强类型机制、垃圾回收器、异常处理和安全检查机制使得用 Java 语言编写的程序有很好的健壮性。 6)去除了 C+语言中难以理解、容易混淆的特性,例如头文件
7、、指针、结构、单元、运算符重载、虚拟基础类、多重继承等,使得程序更加严谨、简洁。 常见笔试题: Java 语言是由_语言改进并重新设计而来的。 AAda BC+ CPascal DBASIC 答案:B。Ada 语言是美国军方为了整合不同语言开发的系统而发明的一种语言,其最大的特点是实时性,在 Ada95 中已加入面向对象内容。Pascal 语言是为提倡结构化编程而发明的语言。BASIC 语言为了让大学生容易地控制计算机开发的语言,其特点是简单易懂,且可以用解释和编译两种方法执行。C+语言是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言,它支持过程化程序设计、数据抽象、面向对象程序设
8、计、泛型程序设计等多种程序设计风格。Java 语言是一种面向对象语言,从语法结构上看,与 C+类似。2.Java 与 C/C+有什么异同 (分数:4.00)_正确答案:()解析:Java 与 C+都是面向对象语言,都使用了面向对象思想(例如封装、继承、多态等),由于面向对象有许多非常好的特性(继承、组合等),因此二者都有很好的可重用性。 需要注意的是,二者并非完全一样,下面主要介绍它们的不同点: 1)Java 为解释性语言,其运行过程为:程序源代码经过 Java 编译器编译成字节码,然后由 JVM 解释执行。而 C/C+为编译型语言,源代码经过编译和链接后生成可执行的二进制代码。因此,Java
9、 的执行速度比 C/C+慢,但是 Java 能够跨平台执行,而 C/C+不能。 2)Java 为纯面向对象语言,所有代码(包括函数、变量等)必须在类中实现,除基本数据类型(包括int、float 等)外,所有类型都是类。此外,Java 语言中不存在全局变量或全局函数,而 C+兼具面向过程和面向过程编程的特点,可以定义全局变量和全局函数。 3)与 C/C+语言相比,Java 语言中没有指针的概念,这有效防止了 C/C+语言中操作指针可能引起的系统问题,从而使程序变得更加安全。 4)与 C+语言相比,Java 语言不支持多重继承,但是 Java 语言引入了接口的概念,可以同时实现多个接口。由于接口
10、也具有多态特性,因此在 Java 语言中可以通过实现多个接口来实现与 C+语言中多重继承类似的目的。 5)在 C+语言中,需要开发人员去管理对内存的分配(包括申请与释放),而 Java 语言提供了垃圾回收器来实现垃圾的自动回收,不需要程序显式地管理内存的分配。在 C+语言中,通常都会把释放资源的代码放到析构函数中,Java 语言中虽然没有析构函数,但却引入了一个 finalize()方法,当垃圾回收器将要释放无用对象的内存时,会首先调用该对象的 finalize()方法,因此,开发人员不需要关心也不需要知道对象所占的内存空间何时会被释放。 C+语言支持运算符重载,而 Java 语言不支持运算符
11、重载。C+语言支持预处理,而 Java 语言没有预处理器,虽然不支持预处理功能(包括头文件、宏定义等),但它提供的 import 机制与 C+中的预处理器功能类似。C+支持默认函数参数,而 Java 不支持默认函数参数。C/C+支持 goto 语句,而 Java 不提供 goto语句(但 Java 中 goto 是保留关键字)。C/C+支持自动强制类型转换,这会导致程序的不安全;而 Java 不支持自动强制类型转换,必须由开发人员进行显式地强制类型转换。C/C+中,结构和联合的所有成员均为公有,这往往会导致安全性问题的发生,而 Java 根本就不包含结构和联合,所有内容都封装在类里面。Java
12、 具有平台无关性,即对每种数据类型都分配固定长度,例如,int 类型总是占据 32 位,而 C/C+却不然,同一个数据类型在不同的平台上会分配不同的字节数。 Java 提供对注释文档的内建支持,所以源码文件也可以包含它们自己的文档。通过一个单独的程序,这些文档信息可以提取出来,并重新格式化成 HTML。 Java 包含了一些标准库,用于完成特定的任务,同时这些库简单易用,能够大大缩短开发周期,例如,Java 提供了用于访问数据库的 JDBC 库,用于实现分布式对象的 RMI 等标准库。C+则依靠一些非标准的、由其他厂商提供的库。 常见笔试题: 下列说法中,错误的有_。 AJava 面向对象语言
13、容许单独的过程与函数存在 BJava 面向对象语言容许单独的方法存在 CJava 语言中的方法属于类中的成员(member) DJava 语言中的方法必定隶属于某一类(对象),调用方法与过程或函数相同 答案:A、B、C。见上面讲解。3.为什么需要 public static void main (Stringargs)这个方法 (分数:4.00)_正确答案:()解析:public static void main (Stringargs)为 Java 程序的入口方法,JVM 在运行程序时,会首先查找 main()方法。其中,public 是权限修饰符,表明任何类或对象都可以访问这个方法,sta
14、tic 表明main()方法是一个静态方法,即方法中的代码是存储在静态存储区的,只要类被加载后,就可以使用该方法而不需要通过实例化对象来访问,可以直接通过类名. main()直接访问,JVM 在启动时就是按照上述方法的签名(必须有 public 与 static 修饰,返回值为 void,且方法的参数为字符串数组)来查找方法的入口地址,若能找到,就执行;找不到,则会报错。void 表明方法没有返回值,main 是 JVM 识别的特殊方法名,是程序的入口方法。字符串数组参数 args 为开发人员在命令行状态下与程序交互提供了一种手段。因为 main 是程序的入口方法,所以当程序运行时,第一个执行
15、的方法就是 main()方法。通常来讲,要执行一个类的方法,先必须实例化一个类的对象,然后通过对象来调用这个方法。但由于 main 是程序的入口方法,此时还没有实例化对象,因此在编写 main()方法时就要求不需要实例化对象就可以调用这个方法,鉴于此,main()方法需要被定义成 public 与 static。下例给出了在调用 main()方法时传递参数的方法。 public class Test public static void main(Stringargs) for(int i=0;iargs. length;i+) System.out.println(argsi); 在控制台下
16、,使用 javac Test java 指令编译上述程序,使用 java Test arg1 arg2 arg3 指令运行程序,程序运行结果为: arg1 arg2 arg3 引申: 1main()方法是否还有其他可用的定义格式? 1)由于 public 与 static 没有先后顺序关系,因此下面的定义也是合理的。 static public void main (Stringargs) 2)也可以把 main()方法定义为 final。 public static final void main (String args) 3)也可以用 synchronized 来修饰 main()方法。
17、 static public synchronized void main (Stringargs) 不管哪种定义方式,都必须保证 main()方法的返回值为 void,并有 static 与 public 关键字修饰。同时由于 main()方法为程序的入口方法,因此不能用 abstract 关键字来修饰。 2同一个 java 文件中是否可以有多个 main()方法? 虽然每个类中都可以定义 main()方法,但是只有与文件名相同的用 public 修饰的类中的 main()方法才能作为整个程序的入口方法。如下例所示,创建了一个名为 Test.java 的文件。 class T public
18、static void main(Stringargs) System.out.println(“T main“); public class Test /程序入口函数 public static void main(Stringargs) System.out.println(“Test main“); 程序运行结果为: Test main 常见笔试题: Java 程序中程序运行入口方法 main 的签名正确的有_。 Apublic static void main (Stringargs) Bpublic static final void main (Stringargs) Cstati
19、c public void main (Stringargs) Dstatic public synchronized void main (Stringargs) Estatic public abstract void main (Stringargs) 答案:A、B、C、D。见上面讲解。4.如何实现在 main()方法执行前输出“Hello World” (分数:4.00)_正确答案:()解析:众所周知,在 Java 语言中,main()方法是程序的入口方法,在程序运行时,最先加载的就是main()方法,但这是否意味着 main()方法就是程序运行时第一个被执行的模块呢? 答案是否定的。
20、在 Java 语言中,由于静态块在类被加载时就会被调用,因此可以在 main()方法执行前,利用静态块实现输出“Hello World”的功能,以如下代码为例。 public class Test static System.out.println(“Hello World1“); public static void main(String args) System.out.println(“Hello World2“); 程序运行结果为: Hello World1 Hello World2 由于静态块不管顺序如何,都会在 main()方法执行之前执行,因此,以下代码会与上面的代码有同样的输
21、出结果。 public class Test public static void main(String args) System.out.println(“Hello World2“); static system.out.println(“Hello World1”); 5.Java 程序初始化的顺序是怎样的 (分数:4.00)_正确答案:()解析:在 Java 语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。 Java 程序的初始化一般遵循 3 个原则(优先级依次递减):静态对象(变量)优先于非静态对
22、象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次。父类优先于子类进行初始化。按照成员变量的定义顺序进行初始化。即使变量定义散布于方法定义之中,它们依然在任何方法(包括构造函数)被调用之前先初始化。 Java 程序初始化工作可以在许多不同的代码块中来完成(例如静态代码块、构造函数等),它们执行的顺序如下:父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数。下面给出一个不同模块初始化时执行顺序的一个例子。 class Base static System
23、.out.println(“Base static block“); System.out.println(“Base block“); public Base() System.out.println(“Base constructor“); public class Derived extends Base static System.out.println(“Derived static block“); System.out.println(“Derived block“); public Derived() Systemoutprintln(”Derived constructor”
24、); public static void main(String args) new Derived(); 程序运行结果为: Base static block Derived static block Base block Base constructor Derived block Derived constructor 常见笔试题: 下面代码的运行结果是什么? class B extends Object static System.out.println(“Load B1“); public B() System.out.println(“Create B“); static Sys
25、tem.out.println(“Load B2“); class A extends B static System.out.println(“Load A“); public A() System.out.println(“Create A“); public class Testclass public static void main(Stringargs) new A(); ALoad B1 Load B2 Create B Load A Create A BLoad B1 Load B2 Load A Create B Create A CLoad B2 Load B1 Creat
26、e B Create A Load A DCreate B Create A Load B1 Load B2 Load A 答案:B。见上面讲解。6.Java 中的作用域有哪 (分数:4.00)_正确答案:()解析:在计算机程序中,声明在不同地方的变量具有不同的作用域,例如局部变量、全局变量等。在Java 语言中,作用域是由花括号的位置决定的,它决定了其定义的变量名的可见性与生命周期。 在 Java 语言中,变量的类型主要有 3 种:成员变量、静态变量和局部变量。类的成员变量的作用范围与类的实例化对象的作用范围相同,当类被实例化时,成员变量就会在内存中分配空间并初始化,直到这个被实例化对象的生
27、命周期结束时,成员变量的生命周期才结束。被 static 修饰的成员变量被称为静态变量或全局变量,与成员变量不同的是,静态变量不依赖于特定的实例,而是被所有实例所共享,也就是说,只要一个类被加载,JVM 就会给类的静态变量分配存储空间。因此,就可以通过类名和变量名来访问静态变量。局部变量的作用域与可见性为它所在的花括号内。 此外,成员变量也有 4 种作用域,它们的区别见下表。 作用域的对比 作用域与可见性 当前类 同一 package 子类 其他 package public private protected default 1)public。表明该成员变量或方法对所有类或对象都是可见的,所
28、有类或对象都可以直接访问。 2)private。表明该成员变量或方法是私有的,只有当前类对其具有访问权限,除此之外的其他类或者对象都没有访问权限。 3)protected。表明成员变量或方法对该类自身,与它在同一个包中的其它类,在其它包中的该类的子类都可见。 4)default。表明该成员变量或方法只有自己和与其位于同一包内的类可见。若父类与子类位于同一个包内,则子类对父类的 default 成员变量或方法都有访问权限;若父类与子类位于不同的 package(包)内,则没有访问权限。 需要注意的是,这些修饰符只能修饰成员变量,不能用来修饰局部变量。private 与 protected 不能用
29、来修饰类(只有 public、abstract 或 final 能用来修饰类)。 常见笔试题: 下列说法中,正确的是_ A实例方法可直接调用超类的实例方法 B实例方法可直接调用超类的类方法 C实例方法可直接调用其他类的实例方法 D实例方法可直接调用本类的类方法 答案:D。当超类的实例方法或类方法为 private 时,是不能被子类调用的。同理,当其他类的实例方法为 private 时,也不能被直接调用。7.一个 Java 文件中是否可以定义多个类 (分数:4.00)_正确答案:()解析:一个 Java 文件中可以定义多个类,但是最多只能有一个类被 public 修饰,并且这个类的类名与文件名必
30、须相同,若这个文件中没有 public 的类,则文件名随便是一个类的名字即可。需要注意的是,当用 javac 指令编译这个.java 文件时,它会给每一个类生成一个对应的.class 文件,如下例定义Derived.jave 为: class Base public void print() System.out.println(“Base“); public class Derived extends Base public static void main(Stringa) Base c=new Derived(); c.print(); 使用 javac Derived.java 指令编
31、译上述代码,会生成两个字节码文件:Base.class 与 Derived.class,然后使用 java Derived 指令执行代码,此时,控制台的输出结果为:Base。8.什么是构造函数 (分数:4.00)_正确答案:()解析:构造函数是一种特殊的函数,用来在对象实例化时初始化对象的成员变量。在 Java 语言中,构造函数具有以下特点。 1)构造函数必须与类的名字相同,并且不能有返回值(返回值也不能为 void)。 2)每个类可以有多个构造函数。当开发人员没有提供构造函数时,编译器在把源代码编译成字节码的过程中会提供一个没有参数默认的构造函数,但该构造函数不会执行任何代码。如果开发人员提
32、供了构造函数,那么编译器就不会再创建默认的构造函数了。 3)构造函数可以有 0 个、1 个或 1 个以上的参数。 4)构造函数总是伴随着 new 操作一起调用,且不能由程序的编写者直接调用,必须要由系统调用。构造函数在对象实例化时会被自动调用,且只运行一次;而普通的方法是在程序执行到它时被调用,且可以被该对象调用多次。 5)构造函数的主要作用是完成对象的初始化工作。 6)构造函数不能被继承,因此,它不能被覆盖,但是构造函数能够被重载,可以使用不同的参数个数或参数类型来定义多个构造函数。 7)子类可以通过 super 关键字来显式地调用父类的构造函数,当父类没有提供无参数的构造函数时,子类的构造
33、函数中必须显式地调用父类的构造函数。如果父类提供了无参数的构造函数,此时子类的构造函数就可以不显式地调用父类的构造函数,在这种情况下编译器会默认调用父类提供的无参数的构造函数。当有父类时,在实例化对象时会先执行父类的构造函数,然后执行子类的构造函数。 8)当父类和子类都没有定义构造函数时,编译器会为父类生成一个默认的无参数的构造函数,给子类也生成一个默认的无参数的构造函数。此外,默认构造器的修饰符只跟当前类的修饰符有关(例如,如果一个类被定义为 public,那么它的构造函数也是 public)。 引申:普通方法是否可以与构造函数有相同的方法名? 可以,示例如下。 public class T
34、est public Test() System.out.println(“construct“); public void Test() System.out.println(“call Test“); public static void main(Stringargs) Test a=new Test(); /调用构造函数 a.Test(); /调用 Test 方法 程序运行结果为: construct call Test 常见笔试题: 1下列关于构造方法的叙述中,错误的是_。 AJava 语言规定构造方法名与类名必须相同 BJava 语言规定构造方法没有返回值,但不用 void 声明
35、CJava 语言规定构造方法不可以重载 DJava 语言规定构造方法只能通过 new 自动调用 答案:C。可以定义多个构造函数,只要不同的构造函数有不同的参数即可。 2下列说法中,正确的是_。 Aclass 中的 constructor 不可省略 Bconstructor 必须与 class 同名,但方法不能与 class 同名 Cconstructor 在一个对象被 new 时执行 D一个 class 只能定义一个 constructor 答案:C。见上面讲解。9.为什么 Java 中有接口没有任何方法 (分数:4.00)_正确答案:()解析:由于 Java 不支持多重继承,即一个类只能有一
36、个父类,为了克服单继承的缺点,Java 语言引入了接口这一概念。接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类。接口中只包含方法的定义,没有方法的实现。接口中的所有方法都是抽象的。接口中成员的作用域修饰符都是public,接口中的常量值默认使用 public static final 修饰。由于一个类可以实现多个接口,因此通常可以采用实现多个接口的方式来间接达到多重继承的目的。 在 Java 语言中,有些接口内部没有声明任何方法,也就是说,实现这些接口的类不需要重写任何方法,这些没有任何方法声明的接口又被叫做标识接口,标识接口对实现它的类没有任何语义上的要求,它仅仅
37、充当一个标识的作用,用来表明实现它的类属于一个特定的类型。这个标签类似于汽车的标志图标,每当人们看到一个汽车的标志图标时,就能知道这款汽车的品牌。Java 类库中已存在的标识接口有 Cloneable和 Serializable 等。在使用时会经常用 instanceof 来判断实例对象的类型是否实现了一个给定的标识接口。 下面通过一个例子来详细说明标识接口的作用。例如要开发一款游戏,游戏里面有一个人物专门负责出去寻找有用的材料,假设这个人物只收集矿石和武器,而不会收集垃圾。下面通过标识接口来实现这个功能。import Java. util. ArrayList; interface Stuf
38、f /矿石 interface Ore extends Stuff /武器 interface Weapon extends Stuff /垃圾 interface Rubbish extends Stuff /金矿 class Gold implements Ore public String toString( ) return “Gold“; /铜矿 class Copper implements Ore public String toString( ) return “Copper“; /枪 class Gun implements Weapon public String toString( ) return “Gun“; /榴弹 class Grenade implements Weapon public String toString( ) return “Grenade“; class Stone implements Rubbish public String toString( ) return “Stone“; public class Test public static ArrayListStuf
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1