《之面向对象编程》由会员分享,可在线阅读,更多相关《之面向对象编程(53页珍藏版)》请在金锄头文库上搜索。
1、李雪莉李雪莉 2009.03.01J2SE 之之 面向对象编程面向对象编程编程语言的发展编程语言的发展 机器语言直接由计算机的指令组成,指令、数据、地址都以“0” 和“1”的符合串组成;可以被计算机直接执行。 汇编语言用容易理解和记忆的符号表示指令、数据以及寄存器等, 抽象层次很低,程序员需要考虑大量的机器细节。 高级语言屏蔽了机器细节,提高了语言的抽象层次接近于人的自 然语言,60年代出现的结构化编程语言提出了结构化数据和语句, 数据和过程抽象等概念。 面向对象的语言与已往的各种语言的根本不同是,它的设计出发 点就是为了更能直接的描述问题域中客观存在的事物。语言的发展是朝着人类更容易理解的方
2、向前进面向对象编程语言三大特征面向对象编程语言三大特征 隐藏/封装 继承 多态面向过程的设计思想和面向对象的设计思想面向过程的设计思想和面向对象的设计思想 我要回老家 面向过程 我开车,我挂档,我踩油门,我过无锡,我过南京 面向对象 我命令车去新疆 车怎么去不关我事 信息封装在车这个类的内部 我不用去了解车整个开动的过程面向对象的优点面向对象的优点 首先,面向对象符合人类看待事物的一般规律。首先,面向对象符合人类看待事物的一般规律。 对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节。对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节。 注意区分:对象(本身)、对象的实现者、对
3、象的调用者。注意区分:对象(本身)、对象的实现者、对象的调用者。 分析对象主要从方法开始。分析对象主要从方法开始。 我们通过类来看待对象,类是对象的抽象。我们通过类来看待对象,类是对象的抽象。面向对象的优点面向对象的优点 其次,采用面向对象方法可以使系统各部分各司其职、各尽所能。其次,采用面向对象方法可以使系统各部分各司其职、各尽所能。 对象之间的耦合性一定要低(比如不同硬盘和不同主板之间的关系)。对象之间的耦合性一定要低(比如不同硬盘和不同主板之间的关系)。这样才能使每个对象本身做成最好的。这样才能使每个对象本身做成最好的。 对于对象的要求:高内聚、低耦合,这样容易拼装成为一个系统。对于对象
4、的要求:高内聚、低耦合,这样容易拼装成为一个系统。 实现高内聚就是要最大限度低提高复用性(复用性好是因为高内聚)。实现高内聚就是要最大限度低提高复用性(复用性好是因为高内聚)。 可复用性是可复用性是OOP的基础。的基础。 对象的功能越简单,复用性就越好。(对象的耦合性弱,复用性就比对象的功能越简单,复用性就越好。(对象的耦合性弱,复用性就比较强)较强) 可扩展性可扩展性 系统的可插入性,是在系统中加入新的对象之后的系统稳定性。系统的可插入性,是在系统中加入新的对象之后的系统稳定性。 对象的可替换性,是在系统中替换原有的对象之后的系统的稳定性。对象的可替换性,是在系统中替换原有的对象之后的系统的
5、稳定性。Java与面向对象与面向对象 对象是Java程序的核心,在Java程序中“万事万物皆对象”。 类是用来创建同一类型的对象的“模板”,在一个类中定义了该类 对象所应具有的成员变量以及方法。 类可以看成是静态属性(成员变量)和动态属性(方法)的封 装体。 J2SDK提供了很多类供编程人员使用,编程人员也可定义自己的类。为什么用对象?为什么用对象? 面向对象的编程一组对象互相配合配合通过沟通沟通完成特定功能 所有的paradigm都是对现实问题的抽象 汇编是对机器语言的抽象 面向过程的语言是对汇编的抽象 对象更加符合对于现实问题的抽象 对象都有对外服务的接口 通过继承可以复用 对象隐藏内部服
6、务的实现 通过聚合可以复用 面向对象更加容易使我们达到这些年来苦苦追求的境界 Reusability、Extensibility、Maintainablity维护和替换更加方便、. 组件比对象更高的层次上的抽象(二进制级别) EJB、Web Service、CORBA、COM、.Java Java 类的定义,成员变量的声明,方法的声明类的定义,成员变量的声明,方法的声明 用用 class 关键字定义一个类,例如:关键字定义一个类,例如: class Person /成员变量定义 private int id; private int age = 20; /方法定义 public int get
7、Age() return age; public void setAge(int i) age = i; public int getId() return id; 类的定义主要由两方面组成 成员变量成员变量和方法方法。 声明成员变量声明成员变量的格式为: type =defaultValue ; 例如:private int id; private int age = 20; 声明方声明方法的格式为: () 例如: public int getAge() return age;对象的创建和使用对象的创建和使用 必须使用 new 关键字创建对象。 Person person= new Pers
8、on (); 使用对象(引用) . 成员变量来引用对象的成员变量。 person.age 使用对象(引用) . 方法(参数列表)来调用对象的方法。 person. setAge(23) 同一类的每个对象有不同的成员变量存储空间。 同一类的每个对象共享该类的方法。Java访问控制访问控制修饰符修饰符同一个类中的方法同一个类中的方法同一个包中的类同一个包中的类子类子类全局全局privateprivateYes (可以被本类中方法访 问)No(不能被其它类 访问)No (不能被其它 类访问)Nodefaultdefault (package)(package)Yes(可以被本类中方法访 问)Yes(
9、可以被包内的 类访问)No(不能被包外 的子类继承访问)NoprotectedprotectedYes (可以被本类中方法访 问)Yes (可以被包内的 类访问)Yes(可以被包外 的子类继承访问)NopublicpublicYes (可以被本类中方法访 问)Yes (可以被包内的 类访问)Yes (可以被包外 的子类访问)Yes四个修饰符都可以修饰属性或方法,修饰类只能用default或public访问控制(访问控制(con.)访问控制的限制程度从高到低如下图所示。注意, Default不是一个修饰符,它只是用来表示一种不 加任何修饰符时的状态。privateDefaultprotected
10、public成员变量或成员方法的访问控制成员变量或成员方法的访问控制包1包2public int v1; protected int v2; int v3 private int v4;ClassAClassBClassCClassD extends ClassAClassB, ClassC,ClassD分别可以访问 ClassA的哪些成员变量?类的访问控制类的访问控制顶层类只能是public或默认访问级别 public级别的类可以被同一个包或者其他包中 的类访问 默认级别的类只能被同一个包中的类访问public class Sample /public级别class Sample /默认访问
11、级别protected class Sample /非法private class Sample /非法方法的重载方法的重载当类中的方法名相同时,称为方法的重载 (overload) 例如: public void println(int i); public void println(char c); public void println(String s);构造方法构造方法 使用 new + 构造方法 创建一个新的对象。 构造方法是定义在 Java 类中的一个用来初始化对象的方法。 构造方法与类同名且没有返回值。 例如: Person 类的构造函数:public class Person
12、 int id; int age; Person(int n,int i) id = n; age = i; 构造方法的调用构造方法的调用 创建对象时,使用构造方法初始化对象的成员变量。创建对象时,使用构造方法初始化对象的成员变量。public class Test public static void main(String args) Person tom = new Person(1,25); Person john = new Person(2,27); 构造方法的重载构造方法的重载 与普通方法一样,构造方法也可以重载: 例如:修改 Person 类的构造方法为:Person() id
13、 = 0; age = 20; Person(int i) id = 0; age = i; Person(int n,int i) id = n; age = i;默认的构造方法默认的构造方法 每个类都有构造方法每个类都有构造方法 如果程序员在定义类时没有定义构造方法的话,如果程序员在定义类时没有定义构造方法的话,Java将自动为该将自动为该 类添加一个公开的空参空实现的构造方法。类添加一个公开的空参空实现的构造方法。 如:如: public Person () this this 关键字关键字 在类的方法定义中使用的 this 关键字代表使用该方法的对象使用该方法的对象的引用。 当必须指出
14、当前使用方法的对象是谁时要使用this。 有时使用this可以处理方法中成员变量和参数重名的情况。public class Leaf int i = 0; Leaf(int i) this.i = i; Leaf increament() i+; return this; void print() System.out.println(“i = “+i); public static void main(String args) Leaf leaf = new Leaf(100); leaf.increament().increament().print(); package package
15、和和 importimport语句语句 为便于管理大型软件系统中数目众多的类,解决类的命名冲突问题, Java引入包(package)机制,提供类的多重类命名空间。package package 和和 importimport语句语句 package 语句作为 Java 源文件的第一条语句,指明该文件中定义 的类所在的包。(若缺省该语句,则指定为无名包)。 它的格式为: package pkg1.pkg2.pkg3; Java编译器把包对应于文件系统的目录管理,package语句中,用 . 来指明包(目录)的层次,例如使用语句 package com.ambow; 则该文件中所以的类位于. comsxt 目录下package package 和和 importimport语句语句 如果将一个类打包,则使用该类时,必须使用该类的全名(例如: com.ambow.MyClass),Java编译器才会在找到该类。 可以不需要用import语句直接使用 java.lang 包中的类。 也可以使用 import 在文件的开头引入要使用到的类;例如:import com.ambow.MyClass; import java.util.*;/引入