Java 认证问答题, 比较基础的知识点。
1.介绍 Java 中的 Collection Framework?
答:Collection Framework 结构如下:
|- List
||- LinkedList
||- ArrayList
||- Vector
||- Stack
| - Set
||- HashSet
||- TreeSet
|- Map
||- Hashtable
||- HashMap
||- WeakHashMap
Collection 是最基本的集合接口,一个Collection 代表一组 Object,即Collection 的元素。
2.抽象类与接口。
答:抽象类与接口都用于抽象,但是抽象类(Java中)可以有自己的部分实现,而接口则完全是一个标识(同时又多重继承的功能)。
3.Java 中异常处理机制的简单原理和应用。
答:当Java 程序违反了 Java 的语义规则时,Java 虚拟机就会将发生的错误表示为一个异常。违反语义规则包括 2 种情况。
一种是 Java 类库内置的语义检查。例如数组下标越界会引发 IndexOutOfBoundsException;
访问 null 的对象会引发 NullPointerException。另一种情况就是 Java 允许程序员扩展这种语义检查,
程序可以创建自己的异常,并自由选择在何时用 throw 关键字引发异常。所有的异常都是 java.lang.Throwable 的子类。
4.Java 的接口和 C++ 的虚类的相同和不同处?
答: 由于 Java 不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,
现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。
当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下都是 public static,
所有方法默认都是 public。一个类可以实现多个接口。
5.ArrayList 和 Vector的区别,HashMap 和 Hashtable 的区别?
答:ArrayList 和 Vector的区别主要体现在以下两方面:
(1) 同步性:Vector 是线程安全的,是同步的,ArrayList 是线程不安全的,不是同步的。
(2) 数据增长:当需要增长时,Vector默认增长为原来的一倍,而ArrayList 默认为原来的一半。
HashMap 和 Hashtable 的区别主要体现在以下三方面:
(1) 历史原因:Hashtable 是基于陈旧的 Dictionary 类的,HashMap 是 Java 1.2引进的Map接口的一个实现。
(2) 同步性:Hashtable 是线程安全的,是同步的,HashMap 是线程不安全的,不是同步的。
(3) 值:只有 HashMap 可以让你将空值作为一个表条目的key 或 value。
6.char 型变量能不能定义为一个中文?为什么?
答:可以,因为 Java 中以 Unicode 编码,一个 char 占16字节,所以放一个中文是没问题的。
7.多线程有几种表示方法,都是什么?同步有几种实现方法?都是什么?
答:多线程有两种实现方法,分别是继承 Thread 类与实现 Runnable 接口。
同步的实现方式有两种,分别是 synchronized,wait与notify。
8.什么是继承?什么是父类?什么是子类?继承的特性可给面向对象编程带来什么好处?
答:继承(inheritance):是指从已有的类中派生出若干个新类,是子类自动共享父类之间数据和方法的机制。
已有类称为基类或父类,新类称为派生类或子类。子类将自动地获得基类的属性和方法,
从而不需要再重复定义这些属性和方法;子类还可以修改父类的方法或增加新的方法,从而使自己更适合特殊的需要。
类之间的继承关系是现实世界中遗传关系的直接模拟。
如果没有继承机制,则类对象中数据,方法就会出现大量重复。继承不仅支持系统的可重用性,也促进系统的可扩展性。
9.什么是多态?面向对象程序设计为什么要引入多态的特性?
答:多态性:是指不同类的对象收到相同的消息时,得到不同的结果。即允许不同类的对象对同一消息作出各自的响应,
以统一的风格处理已存在的数据及相关的操作。
多态性语言具有灵活,抽象,行为共享,代码共享的优势,较好地解决了应用程序中方法同名的问题。
多态的特点大大提高了程序的抽象程度和简洁性,更重要的是它最大限度地降低了类和程序模块之间的耦合性,
提高了类模块的封闭性,使得它们不需要了解对方的具体细节就可以很好的共同工作。
10.“子类的域和方法的数目一定大于等于父类的域和方法的数目”,这种说法是否正确?为什么?
答:这种说法不对。因为父类的私有方法不能被继承。如果父类有 N 个私有域和方法而只有一个非私有域或方法,
根据继承的原则,子类只能拥有父类的非私有域和方法。这时子类的域和方法就要小于父类。
11.父类对象与子类对象相互转换的条件是什么?如何实现它们的相互转换?
答:一个子类对象可以被合法的视为一个父类对象,即一个父类对象的引用,其指向的内存单元可能实际是一个子类对象。
在这种情况下,可以使用强制类型转换将父类对象的引用转换成实际的子类对象引用。
12.面向对象的软件开发有哪些优点?
答:面向对象设计是一种把面向对象的思想应用于软件开发的过程中,指导开发活动的系统方法,
是建立在“对象”概念基础上的方法学,所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,
来认识,理解,刻画世界和设计,构建相应的软件系统。
从面向过程到面向对象是程序设计技术的一个飞跃。人们之所以要采用面向对象的程序设计技术,
其目的在于:按照人类习惯思维方法一致的原则开发系统;提高代码的可重用性(或者称为复用性);
提升程序开发与运行效率;提高程序的可靠性与可维护性;提高程序可扩展性;增强程序的课控制性。
总之,面向对象的程序设计,能够有效分解,降低问题的难度与复杂性,提高整个求解过程的可控制性,
可监视性和可维护性,从而获得较高的开发效率和可靠效果。
13.什么叫对象?什么叫类?类和对象有什么关系?
答:对象(Object)是一个应用系统中用来描述客观事物的实体,是具有特定属性(数据)和行为(方法)的基本单位,
是类的一个特定状态下的实例。对象是一件事,一个实体,一个名词,一个可以想象为有自己的标识的任何东西。
对象是类的实例化。概括来说:万物皆对象。对象具有状态,一个对象用数据值来描述它的状态。
类(Class)是Java代码的基本组织模块,是用以描述一组具有相同属性和行为的对象的基本原型,是对这组对象的概括,
归纳与抽象表达。类是对象的模板,它定义了本类对象所应拥有的状态属性集及操作这组属性的行为方法集。
是对一组有相同数据和相同操作的对象的定义,一个类所包含的方法和数据描述一组对象的共同属性和行为。
类和对象之间的关系是抽象和具体的关系:类就是一种模板,表达的是一种抽象的概念,它描述了该对象的共同特征,
类是在对象之上的抽象,对象则是类的具体化,是类的实例。对象是模板的实例化,是个性的产物,是一个具体的个体;
类必须通过对象才能使用,而对象中的属性和行为都必须在类中定义;类由属性和行为(方法)组成。
14.什么是包?把一个类放在包里有什么作用?
答:Java 中的包(Package)是一种松散的类的集合,是用来组织与管理类与接口的容器。
包的作用主要是把需要协同工作的不同的类组织在一起,使得程序功能清楚,结构分明。
15.作用域 public,private,protected 以及不写时(default)有什么区别?
答:当用一个类创建了一个对象之后,该对象可以通过 ”.” 运算符访问自己的变量,并使用类中的方法。
但访问自己的变量和使用类中的方法是有一定限制的。通过修饰符public,private,
protected和default 来说明类成员的使用权限。
private(私有的):类中限定为 private 的成员只能在这个类中被访问,在类外不可见。
default(缺省的):如果没有访问控制符,则该类成员可以被该类所在包中的所有其它类访问。
protected(受保护的):用该关键字修饰的类成员可以被同一类,
被该类所在的包中所有其它类或其子类(可以不在同一包中)的实例对象访问。
public:用 public 修饰的类成员可以被其他任何类访问,前提是对类成员所在的类有访问权限。
16.什么是方法?方法的结构是怎样的?设计方法应考虑哪些因素?
答:方法是 Java 类的一个组成部分,通过类的方法改变对象的状态。
方法的结构:[方法修饰符] 返回值类型 方法名([形参列表]) [throws异常列表] {
方法体;
}
设计方法应考虑因素有:
(1) 方法名是 Java 中任意的标识符,按照命名的约定,方法名应该是有意义的动词或动词短语,
它的第一个字母一般要小写,其他有意义的单词的首字母大写,其余字母小写。
(2) 返回值类型可以是任意的Java类型,甚至可以是定义此方法的类。如果方法没有返回值,则用 void 表示。
(3) 形式参数列表是可选的。如果方法没有形式参数,就用一对小括号”()”表示。
形式参数列表的形式如下:(类型 形参名, 类型 形参名, ……)
(4) throws 异常列表规定了在方法执行中可能导致的异常。
17.什么是方法的覆盖?与方法的重载有何不同?方法的覆盖与属性的隐藏有何不同?
答:子类重载定义父类中已经存在的方法,称为方法的覆盖。
方法重载指一个类中有多个方法享有相同的名字,但是这些方法的参数必须不同,或者参数的个数不同,
或者是参数类型不同。返回类型不能用来区分重载的方法。
其实方法重载的最主要的作用就是实现同名的构造方法可以接受不同的参数。
参数类型的区分度一定要足够,例如:不能是同一简单类型的参数,如int与long。
方法的重载不是子类对父类同名的重新定义,而是在一个类中定义了同名的不同方法。
方法覆盖与属性的隐藏不同:子类重新定义父类已有的域,并不能完全取代它从父类那里继承的同名的域,
这个域仍然占用子类的内存空间,在某些情况下会被使用;而当子类重新定义父类的方法时,
从父类那里继承来的方法将被新方法完全取代,不在子类的内存空间中占一席之地。
18.什么是成员变量,局部变量,类变量和实例变量?
答:在方法外但在类声明内定义的变量叫成员变量,作用域是整个类。
在方法体中定义的变量和方法的参数被称为局部变量。
类的成员变量分为类变量和实例变量,类变量是用关键字static声明的变量。
成员变量在整个类内都有效,局部变量只在定义它的方法内有效。
它们的生存期分别是:局部变量在定义该变量的方法被调用时被创建,而在该方法退出后被撤销;
实例变量在创建该类的实例时被创建,而其生存期和该类的实例对象的生存期相同;
类变量在该类被加载时被创建,所有该类的实例对象共享该类变量,其生存期是类的生存期。
任何变量在使用前都必须初始化,但是需要指出的是局部变量必须显式初始化,而实例变量不必,
原始类型的实例变量在该类的构造方法被调用时为它分配的缺省的值,整型是0,布尔型是false,而浮点型是0.0f,
引用类型(类类型)的实例变量的缺省值是null,类变量的规则和实例变量一样,不同的是类变量的初始化是在类被加载时。