您的位置:首页 > 编程语言 > Java开发

Java 基础知识(二)之面向对象技术

2016-05-10 10:00 381 查看

1. 面向对象与面向过程的区别

面向对象把数据及对数据的操作方法放在一起,作为一个互相依存的整体,即对象。对同类对象抽象出其共性,即类,类中的大多数数据,只能被本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。

面向过程是一种以事件为中心的开发方法,就是自顶向下顺序执行,逐步求精,其程序结构是按功能划分为若干个基本模块,这些模块形成一个树状结构,各模块之间的关系也比较简单,在功能上相对独立,每一模块内部一般是由顺序、选择和循环3种基本结构组成,模块化实现的具体方法是使用子程序,而程序流程在写程序时就已经决定。

面向对象与面向过程主要有以下几个方面的不同之处:

1)出发点不同。面向对象强调把问题域的要领直接映射到对象及对象之间的接口上,而面向过程强调过程的抽象化与模块化。

2)层次逻辑关系不同。面向对象时用类的层次结构来体现类之间的继承和发展,而面向过程用模块的层次结构概括模块或模块间的关系与功能。

3)数据处理方式与控制程序方式不同。面向对象方法的对象修改只能由自身的成员函数完成,控制程序的方式是通过“事件驱动”来激活和运行程序。而面向过程方法是直接通过程序来处理数据,在控制方式上是按照设计调用或返回程序,模块之间存在着控制与被控制、调用与被调用的关系。

2. 面向对象的特征

1)抽象。抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面:一是过程抽象;二是数据抽象。

2)继承。继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。子类可以从父类那里继承方法和实例变量,并且子类可以修改或增加新的方法使之更适合特殊的需要。

3)封装。封装是指将客观事物抽象成类,每个类对自身的数据和方法实行保护。类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

4)多态。多态是指允许不同类的对象对统一消息作出响应。

3. 组合和继承的区别

组合和继承是面向对象中两种代码复用的方式。组合是指新类里面创建原有类的对象,重复利用已有类的功能。继承是面向对象的主要特性之一,它允许设计人员根据其他类的实例来定义一个类的实现。组合和继承都允许在新的类中设置子对象,只是组合是显式的,而继承则是隐式的。

class Verhicle{}  //交通工具
class Tire{}  //轮胎
class Car extends Verhicle{  //is-a关系
private Tiret = new Tire();   //has-a关系
}


注意:

1) 除非两个类是“is-a”的关系,否则不要轻易地使用继承,不要单纯地为了实现代码的重用而使用继承,从而导致类之间的耦合度过高,影响程序维护难度。

2) 设计模式中的策略模式说明,如果类之间没有过“is-a”的关系,采用接口与组合的方式比采用继承的方式具有更好的可拓展性。

4. 多态的实现机制

见编译时多态和运行时多态

5. 抽象类(abstract class)与接口(interface)的异同

只要包含一个抽象方法的类就必须被声明为抽象类,抽象类可以声明方法的存在而不去实现它,被声明为抽象的方法不能包含方法体。抽象类的子类为父类中所有抽象方法提供具体的实现,否则它们也是抽象类。

接口可以被看作抽象类的变体。接口中所有的方法都是抽象的,可以通过接口来简洁地实现多重继承。接口中的成员变量默认为public static final类型。

接口与抽象类的相同点:

1)都不能被实例化

2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能被实例化。

不同点:

1)接口只有定义,其方法不能再接口中实现,只有实现接口的类才能实现接口中定义的方法,而抽象类可以有定义与实现,即其方法可以在抽象类中被实现,

2)接口需实现(implements),抽象类需继承(extends)。一个类可实现多个接口,但只能继承一个抽象类。

3)接口强调特定功能的实现,设计理念是“has-a”关系;而抽象类强调所属关系,设计理念为“is-a”关系

4)接口成员方法只能被public、abstract修饰;抽象类可以包含自己的数据成员变量和非抽象的成员方法。

5)接口被运用于实现比较常用的功能,便于日后维护或者添加删除方法;而抽象类更倾向于充当公共类的角色,不适用于日后重新对里面的代码进行修改

6. 内部类

在Java中,可以把一个类定义到另一个类的内部,在类里面的这个类就叫做内部类,外面的叫外部类。在这种情况下,这个内部类可以看作外部类的一个成员。

Java中共有4种内部类,分别如下:

class outerClass{
staticclass innerClass1{}    //静态内部类

class innerClass2{}     //成员内部类

public voidmemberFunction(){
class innerClass3{}   //局部内部类
}
publicoutClass{    //外部类
addListener(new Listener){}   //匿名内部类,一般应用于GUI
}
}


注意:

非静态内部类中不能定义静态成员;静态内部类不能访问外部类的非静态成员;非静态内部类只有在外部类被实例化后才能被实例化。

7. 获取父类的类名

Java语言提供了获取类名的方法:getClass().getName(),开发人员可以调用这个方法来获取类名。

getClass()方法在Object类中被定义为final与naticve,子类不能覆盖该方法,因此只能返回此Object的运行时类。若要在子类中得到父类的名字,可以通过Java的反射机制,使用getClass().getSuperclass().getName()获取。

8. this与super的区别

在Java语言中,this用来指向当前实例对象,它的一个非常重要的作用就是用来区分对象的成员变量与方法的形参。

super可以用来访问父类的方法或成员变量。当子类的方法或成员变量与父类有相同名字时也会覆盖父类的方法或成员变量,要想访问父类的方法或成员变量只能通过super关键字访问。

参考文献:

《Java程序员面试笔试宝典》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: