日期:2014-05-20  浏览次数:20746 次

Java面试题之八

四十一、面向对象的特征有哪些方面

四大特征大家都知道:抽象、继承、封装、多态。这是个理解性表述题,每个人的表述方式可能都不一样。下面仅选择一种作为参考:

1.抽象:

抽象——就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。(就是把现实世界中的某一类东西,提取出来,用程序代码表示,抽象出来一般叫做类或者接口) 抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是数据抽象,二是过程抽象。

数据抽象——就是用代码的形式表示现时世界中一类事物的特性,就是针对对象的属性。比如建立一个鸟这样的类,鸟都有以下属性:一对翅膀、两只脚、羽毛等。抽象出来的类都是鸟的属性,或者成员变量。

过程抽象——就是用代码形式表示现实世界中事物的一系列行为,就是针对对象的行为特征。比如鸟会飞、会叫等。抽象出来的类一般都是鸟的方法。

2.继承:

继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。因此可以说,继承是为了重用父类代码,同时为实现多态性作准备。

3.封装:

封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下保护类的内部结构,同时保护了数据。

4. 多态性(相同的行为,不同的实现方式):

多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。总的来说,方法的重写、重载与动态链接构成多态性。Java引入多态的概念原因之一就是弥补类的单继承带来的功能不足。(为规避C++中多继承造成的复杂继承问题,java采用单继承。)

动态链接——对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态链接。

 

四十二、&和&&的区别?

相同点:它们都可以作为逻辑与的运算符,当表达式两边的结果都为true时结果才为true,只要一方为false,结果就为false

不同点:

 ①&&具有短路功能,即第一个表达式为false时,就不再计算第二个表达式了,所以更高效一些。

 ②&还可以作为位运算符,当表达式两边不是boolean类型时,&表示按位与操作。

 

四十三、heap 和stack有什么区别?

堆栈常常连起来说,其实它们的区别挺多的,下面列举一些主要的:

1.stack是栈,heap是堆

2.stack的空间由操作系统自动分配和释放,地址是由高向低减少的;heap的空间是手动申请和释放的,地址是由低向高增长的,heap常用new关键字来分配。

3.stack空间有限,heap的空间是很大的自由区。

4.栈是一种线形集合,是一块连续的内存区域,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。堆是向高地址扩展的数据结构,是不连续的内存区域,堆采用链表方式来存储空闲内存地址。所以堆获得的空间比较灵活。

5.效率比较:栈由系统自动分配,速度快,但程序员无法控制,灵活性差。

堆一般由new分配内存,速度比较慢,而且容易产生碎片,不过使用方便。

6.在Java中,若只是声明一个对象,则先在栈内存中为其分配地址空间,若再new一下,实例化它,则在堆内存中为其分配地址。

 

四十四、Static Nested Class 和Inner Class 的不同?

(1)Nested Class(嵌套类) 一般是C++的说法,Inner Class(内部类) 一般是JAVA的说法。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。

(2)一般情况下,Nested Class可分为Static Nested Class和Inner Class。

区别是:

Static Nested Class对象的创建不依赖于外部类的对象。静态内部类只能访问外部类的静态成员。

而Inner Class则不同,它的对象的创建依赖于外部类的对象。其既可以访问外部类的静态成员也可以访问非静态成员。

使用内部类优点:

⒈ 内部类对象可以访问创建它的对象的实现,包括私有数据;

⒉ 内部类不为同一包的其他类所见,具有很好的封装性;

⒊ 使用内部类可以很方便的编写事件驱动程序;

⒋ 匿名内部类可以方便的定义运行时回调;

 

四十五、什么时候用assert?

1.概念:assert (断言)在软件开发中是一种常用的调试方式,很多开发语言中都支

持这种机制。所以assert 只在调试版本起作用,对发布版本失效。

2.机制断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true,那么,如果出现了false,说明该程序处于不正确的状态,系统将会给出警告会退出。所以常作调试用。

3.形式

      assert Expression1 ;
      assert Expression1 : Expression2 ;
   Expression1 应该总是产生一个布尔值。
   Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。