李雪莉2009.03.01J2SE之面向对象编程编程语言的发展机器语言-直接由计算机的指令组成,指令、数据、地址都以“0”和“1”的符合串组成;可以被计算机直接执行。汇编语言-用容易理解和记忆的符号表示指令、数据以及寄存器等,抽象层次很低,程序员需要考虑大量的机器细节。高级语言-屏蔽了机器细节,提高了语言的抽象层次接近于人的自然语言,60年代出现的结构化编程语言提出了结构化数据和语句,数据和过程抽象等概念。面向对象的语言-与已往的各种语言的根本不同是,它的设计出发点就是为了更能直接的描述问题域中客观存在的事物。语言的发展是朝着人类更容易理解的方向前进面向对象编程语言三大特征隐藏/封装继承多态面向过程的设计思想和面向对象的设计思想我要回老家面向过程•我开车,我挂档,我踩油门,我过无锡,我过南京…面向对象•我命令车去新疆•车怎么去不关我事–信息封装在车这个类的内部–我不用去了解车整个开动的过程面向对象的优点首先,面向对象符合人类看待事物的一般规律。对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节。注意区分:对象(本身)、对象的实现者、对象的调用者。分析对象主要从方法开始。我们通过类来看待对象,类是对象的抽象。面向对象的优点其次,采用面向对象方法可以使系统各部分各司其职、各尽所能。对象之间的耦合性一定要低(比如不同硬盘和不同主板之间的关系)。这样才能使每个对象本身做成最好的。对于对象的要求:高内聚、低耦合,这样容易拼装成为一个系统。实现高内聚就是要最大限度低提高复用性(复用性好是因为高内聚)。可复用性是OOP的基础。对象的功能越简单,复用性就越好。(对象的耦合性弱,复用性就比较强)可扩展性系统的可插入性,是在系统中加入新的对象之后的系统稳定性。对象的可替换性,是在系统中替换原有的对象之后的系统的稳定性。Java与面向对象对象是Java程序的核心,在Java程序中“万事万物皆对象”。类是用来创建同一类型的对象的“模板”,在一个类中定义了该类对象所应具有的成员变量以及方法。类可以看成是静态属性(成员变量)和动态属性(方法)的封装体。J2SDK提供了很多类供编程人员使用,编程人员也可定义自己的类。为什么用对象?面向对象的编程—一组对象互相配合通过沟通完成特定功能所有的paradigm都是对现实问题的抽象•汇编是对机器语言的抽象•面向过程的语言是对汇编的抽象•对象更加符合对于现实问题的抽象对象都有对外服务的接口通过继承可以复用对象隐藏内部服务的实现通过聚合可以复用面向对象更加容易使我们达到这些年来苦苦追求的境界Reusability、Extensibility、Maintainablity维护和替换更加方便、...组件—比对象更高的层次上的抽象(二进制级别)EJB、WebService、CORBA、COM、...Java类的定义,成员变量的声明,方法的声明用class关键字定义一个类,例如:classPerson{//成员变量定义privateintid;privateintage=20;//方法定义publicintgetAge(){returnage;}publicvoidsetAge(inti){age=i;}publicintgetId(){returnid;}}类的定义主要由两方面组成成员变量和方法。声明成员变量的格式为:[modifiers]typeattr_name[=defaultValue];例如:privateintid;privateintage=20;声明方法的格式为:[modifiers]modifiersreturn_typename([argu_list]){[statements]}例如:publicintgetAge(){returnage;}对象的创建和使用必须使用new关键字创建对象。Personperson=newPerson();使用对象(引用).成员变量来引用对象的成员变量。person.age使用对象(引用).方法(参数列表)来调用对象的方法。person.setAge(23)同一类的每个对象有不同的成员变量存储空间。同一类的每个对象共享该类的方法。构造方法使用new+构造方法创建一个新的对象。构造方法是定义在Java类中的一个用来初始化对象的方法。构造方法与类同名且没有返回值。例如:Person类的构造函数:publicclassPerson{intid;intage;Person(intn,inti){id=n;age=i;}}构造方法的调用创建对象时,使用构造方法初始化对象的成员变量。publicclassTest{publicstaticvoidmain(Stringargs[]){Persontom=newPerson(1,25);Personjohn=newPerson(2,27);}}构造方法的重载与普通方法一样,构造方法也可以重载:例如:修改Person类的构造方法为:Person(){id=0;age=20;}Person(inti){id=0;age=i;}Person(intn,inti){id=n;age=i;默认的构造方法每个类都有构造方法如果程序员在定义类时没有定义构造方法的话,Java将自动为该类添加一个公开的空参空实现的构造方法。如:publicPerson(){}this关键字在类的方法定义中使用的this关键字代表使用该方法的对象的引用。当必须指出当前使用方法的对象是谁时要使用this。有时使用this可以处理方法中成员变量和参数重名的情况。publicclassLeaf{inti=0;Leaf(inti){this.i=i;}Leafincreament(){i++;returnthis;}voidprint(){System.out.println(i=+i);}publicstaticvoidmain(String[]args){Leafleaf=newLeaf(100);leaf.increament().increament().print();}}package和import语句为便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重类命名空间。package和import语句package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:packagepkg1[.pkg2[.pkg3…]];Java编译器把包对应于文件系统的目录管理,package语句中,用‘.’来指明包(目录)的层次,例如使用语句packagecom.ambow;•则该文件中所以的类位于.\com\sxt目录下package和import语句如果将一个类打包,则使用该类时,必须使用该类的全名(例如:com.ambow.MyClass),Java编译器才会在找到该类。可以不需要用import语句直接使用java.lang包中的类。也可以使用import在文件的开头引入要使用到的类;例如:importcom.ambow.MyClass;importjava.util.*;//引入java.util包中所有的类.........MyClassmyClass=newMyClass();//可以直接使用类名.........J2SDK中主要的包介绍java.lang-包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。java.awt-包含了构成抽象窗口工具集(abstractwindowtoolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。java.net-包含执行与网络相关的操作的类。java.io-包含能提供多种输入/输出功能的类。java.util-包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。类的继承Inheritance是“isa”的关系声明的形式:publicclassManagerextendsEmployee{…}Java中使用extends关键字实现类的继承机制通过继承,子类自动拥有了基类(superclass)的所有成员(成员变量和方法)。Java是一个单一继承的语言---一个类只有一个直接父类,如果没有声明父类,则默认的父类为java.lang.ObjectJava只支持单继承,不允许多继承:一个子类只能有一个基类,一个基类可以派生出多个子类继承Inheritance构造方法不能被继承方法和属性可以被继承子类的构造方法隐含的调用父类的默认构造方法如果父类中没有默认的构造方法,则应该在子类的构造方法的第一行明确的声明调用父类中其他的构造方法。如下形式:super(…)super关键字在Java类中使用super来引用基类(父类)的成分;classFatherClass{publicintvalue;publicvoidf(){value=100;System.out.println(FatherClass.value=+value);}}classChildClassextendsFatherClass{publicintvalue;publicvoidf(){super.f();value=200;System.out.println(ChildClass.value=+value);System.out.println(value);System.out.println(super.value);}}super关键字super关键字的两种用法代表指向父类的引用:super.agesuper.addAge()代表调用父类的构造方法super();super(“wangcai”,8);继承中的构造方法子类的构造的过程中必须调用其基类的构造方法。子类可以在自己的构造方法中使用super(argument_list)调用基类的构造方法。使用this(agumentlist)调用本类另外的构造方法如果用super,必须写在方法的第一句如果子类的构造方法中没有显式地调用基类构造方法,则系统默认调用基类无参数的构造方法。如果子类构造方法中既没有显式调用基类构造方法,而基类中又没有无参的构造方法,则编译出错。对象转型(casting)一个基类的引用类型变量可以“指向”其子类的对象。一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。可以使用引用变量instanceof类名来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)类型转换使用instanceof运算符确定对象的类型子类对象可以隐含扩展为父类型父类型必须明确声明转化为子类型不是所有的父类型对象都能转化为子类型多态polymiorphism多态:多态指的是编译时类型变化,而运行时类型不变。多态分两种:编译时多态:编译时动态重载.运行时多态:指一个对象可以具有多个类型。多态polymiorphism运行时多态的三原则:(应用时为覆盖)对象不变;(改变的是主观认识)对于对象的调用只能限于编译时类型的方法,如调用运行时类型方法报错。在上面的例子中:Animala=newDog();对象a的编译时类型为Animal,运行时类型为dog。注意:编译时类型一定要为运行时类型的父类(或者同类型)。对于语句:Dogd=(Dog)a。将d强制声明为a类型,此时d为Dog(),此时d就可以调用运行时类型。注意:a和d指向同一对象。在程序的运行时,动态类型判定。运行时调用运行时类型,即它调用覆盖后的方法。多态的