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

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程序员面试笔试宝典》

时间: 2024-08-28 13:54:07

Java 基础知识(二)之面向对象技术的相关文章

java基础知识回顾之面向对象

一 . 抽象类 什么是抽象类?很简单,就是用abstract关键字修饰,并允许包含未实现方法的类. 什么时候定义抽象类?在有些情况下,可能有些方法无法确定要怎么实现,这时就可以定义抽象类,无法实现的方法定义成抽象方法. 抽象类的特性: 1. 不能实例化,即不能创建对象,只能作为父类被继承. 2. 子类继承一个抽象类后,必须实现父类的抽象方法. 3. 抽象类中可以有抽象方法,也可以不包含抽象方法,但如果包含抽象方法,就必须定义成抽象类. public abstract class Shaoe{ p

Java基础知识(二)

1,字符串 new String("abc")创建了几个对象? 一个或两个,如果常量池中原来有"abc",则只创建一个对象:如果常量池中原来没有字符串"abc",那么就会创建两个对象. String s="abc"; String s1="ab"+"c"; System.out.println(s==s1); 输出 true ,因为"ab"+"c"

Java基础知识二次学习-- 第一章 java基础

基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一章  JAVA简介 时间:2017年4月24日10:23:32 章节:01章_02节 内容:jdk的配置与安装 完成情况:已经完成,cmd中javac提示出相关命令 时间:2017年4月24日10:30:39 章节:01章_04节 内容:输出HelloWorld 完成情况: 已经完成 javac先将

Java基础知识二次学习-- 第二章 基础语法与递归补充

第二章 基础语法与递归补充   时间:2017年4月24日10:39:18 章节:02章_01节,02章_02节 视频长度:49:21 + 15:45 内容:标识符,关键字与数据类型 心得:由字母,下划线,$,数字组成,应该由字母,下划线$开头,同时应该避开java保留字符 变量是内存中的一小块区域,使用变量名来访问这块区域 执行过程中的内存管理(疑问:这里的内存和Jvm的一样吗?) code segment 存放代码 data segment 静态变量 字符串常量 stack 栈 局部变量 h

Java基础知识整理(一) 面向对象程序设计——封装整理

1 类中的属性又叫成员变量(member variable),属性用英文(property)或者attribute 2 对象(Object) 又叫做实例(Instance).生成一个对象的过程叫做对象的实例化 3 面向对象编程中命名的约定:  (a) 类:首字母大写,如果一个类名由多个单词构成,那么每个单词的首字母都要大写,中间不使用仍何连接符,比如Person类 ,MemberTest类     (b)方法:首字母小写,如果一个方法由多个单词构成,那么第一个单词的所有字母全都小写,从第二个单词

Java基础知识二次学习--第五章 数组

第五章 数组 时间:2017年4月26日15:11:30~2017年4月26日15:15:54 章节:05章_01节  视频长度:09:30 内容:一维数组的内存分析 心得: Java中数组是引用类型 栈里面存的数组的引用 实际对象在堆内存里面 (C与C++是分配在栈里的) 内存图: 元素为引用数据类型的数组 引用类型的数组如上图 时间:2017年4月26日15:16:22~2017年4月26日15:19:00 章节:05章_02节  视频长度:05:25 内容:数组元素的创建与使用 心得: 首

Java基础知识二次学习--第四章 异常

第四章 异常处理 时间:2017年4月26日11:16:39~2017年4月26日11:28:58 章节:04章_01节 04章_02节 视频长度:20:46+01:16 内容:异常的概念 心得: Java异常是JAVA提供的用于处理程序中错误的一种机制 实在运行的过程中发生的一些异常事件(比如除0溢出,数组越界,要读取的文件不存在) 设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果 JAVA程序的执行过程中 如果出现异常事件,可以生成异

Java基础知识二次学习--第八章 流

第八章 流   时间:2017年4月28日11:03:07~2017年4月28日11:41:54 章节:08章_01节 视频长度:21:15 内容:IO初步 心得: 所有的流在java.io包里面 定义了多个流类型(类或抽象类)来实现输入/输出功能 可以从不同的角度对其进行分类 按数据流的方向不同可以分为输入流和输出流 按处理数据单位不同可以分为字节流和字符流 按照功能不同可以分为节点流和处理流 jdk中所提供的的所有流类型位于包Java.io内都分别继承自以下四种抽象流类型 输入流 Input

java基础知识(二)

1.关于static关键字总结: 1.不能在static修饰的方法中引用this变量,只能引用一些静态变量或方法,或new新的对象(可以定义局部变量). 简言之,静态方法或块中,只能引用静态的方法或变量. 2.类中的成员变量(static修饰)有缺省值,而类的定义的方法中的局部变量没有缺省值. 3.在类的构造器中,可以引用任何的静态或非静态的变量和方法,可以在非static方法中调用static方法. 4.static{}块中的代码在类装载中仅执行一次. 5.在7-7,A staticmetho