《面向对象特征 》PPT课件.ppt
1,面向对象程序设计(Java),武汉大学国际软件学院 桂浩,2,第三章 面向对象特征,基本概念类的定义对象类的继承和多态接口和包常用工具类,3,基本概念,什么是编程语言?人和计算机进行交流的工具和手段编程语言的发展机器语言:0101001汇编语言:mov,push,add,call第三代语言:高级语言,以C语言为代表,过程式编程语言(Procedural Programming Language)第四代语言:非过程化/面向对象的编程语言语言的发展:抽象的过程,4,面向对象(Object Oriented-OO)面向对象编程(Object Oriented Programming-OOP)面向对象是一种软件开发的方法,“面向对象的分析与设计”(OOA&OOD研究生课程)第一个面向对象的语言:Simula-67第一个成功的面向对象编程语言:SmalltalkC+,JAVA,C#,PERL等用客观世界中描述事物的方法来描述程序中要解决的问题万事万物都是对象程序便是成堆的对象,彼此通过消息的传递,请求其他对象进行工作,基本概念,5,五个基本概念对象类封装性继承性多态性,基本概念,6,对象(object)everything is an object现实世界的对象:桌子、书、自行车、电视、狗、文件、表格、按钮、窗口对象包含两个特性状态:指对象本身的信息(内部信息/内部变量)行为:实现对信息的访问/对象的操作标志:代表对象的标识符山地车的状态(两个车轮、一些齿轮、速度、挡数),行为(刹车、加速、减速和换挡)书包含很多信息,拥有访问所包含信息的方法,一页一页的看,通过目录找到感兴趣的内容,基本概念,7,对象(object)状态变量(variables)行为方法(method)对象就是变量和相关方法的软件集合一个对象可以由其他对象组合而成,窗口(按钮,菜单条,文本框,状态栏等)程序就是对象的集合,对象之间相互交互和通信完成任务搭积木A program is a bunch of objects telling each other what to do by sending messages,基本概念,8,类(class)亚里士多德:the class of fishes and the class of birds现实世界中,存在很多同类的对象,很多桌子、书、自行车一种原型,一种抽象,一种共性,一个模板Every object has a type实例(instance),某类对象的一个特定实体,类是对象的一个抽象表格(类)填入不同的个人信息不同的对象,基本概念,9,封装性对象本身的数据得到保护/隐藏其他对象仅仅需要知道对该对象的访问方法(接口/interface)即可好处模块化-每个对象的源文件可以是相互独立的,可以被不同的程序调用,每个对象是一块积木,可以搭建不同的形状信息隐藏-通常定义一个公共接口/方法实现对对象的访问,可以调整对象的私有信息和方法,而不会对其他调用它的对象产生影响可重用性黑盒子电脑的DIY喷墨打印机,硒鼓坏/彩色硒鼓,基本概念,10,继承性为什么会有继承?建立一个类后,发现另一个新的类有相同的特性,两个选择:重新定义一个新的类;在已有类的基础上,修改(加加/减减)父类和子类,子类继承(拥有)父类所有的数据和方法,同时子类可以有新的数据和方法,“青出于蓝,而胜于蓝”树型结构(层次化结构)根(基类),基本概念,11,继承性,运输工具,航空运输工具,陆地运输工具,水上运输工具,人力驱动,引擎驱动,二轮,四轮,客运,货运,基本概念,12,继承性多重继承,类A,类B,类C,类D,类F,类G,一个类拥有多个父类产生二义性,例类C和类D都有一个同名的方法,类G?Java中仅仅支持单一继承,同时Java采用Interface(接口)实现多重继承而避免父类二义性,基本概念,13,多态性表现在继承中方法的重写子类从父类继承(extends扩展)而来多个子类同属一个父类,所有子类有相同的父类继承父类的方法在不同的子类中有不同的表现形式表现在用一个类中方法的重载,基本概念,14,多态性多态性在继承中的表现,基本概念,15,多态性,class Square extends Shape void draw()System.out.println(Square.draw();void erase()System.out.println(Square.erase()“);class Triangle extends Shape void draw()System.out.println(Triangle.draw();void erase()System.out.println(Triangle.erase();,class Shape void draw()void erase()class Circle extends Shape void draw()System.out.println(Circle.draw();void erase()System.out.println(Circle.erase();,基本概念,16,多态性,public class Test public static Shape randShape()switch(int)(Math.random()*3)default:case 0:return new Circle();case 1:return new Square();case 2:return new Triangle();,public static void main(String args)Shape s=new Shape9;for(int i=0;i s.length;i+)si=randShape();for(int i=0;i s.length;i+)si.draw();,Circle.draw()Triangle.draw()Circle.draw()Circle.draw()Circle.draw()Square.draw()Triangle.draw()Square.draw()Square.draw(),基本概念,17,第三章 面向对象特征,基本概念类的定义对象类的继承和多态接口和包常用工具类,18,程序是对象的集合,而对象是类的实例化源程序就是一个个的Java类Java本身提供的类(核心API)见Java文档中描述程序员可以对其进行调用j2sdk1.4.1_01jrelibrt.jar(22.4MB)程序员自己定义的类,类的定义,19,类的定义格式类的修饰符class 类名 extends 父类名 implements接口名 类型成员变量1;类型成员变量2;类型成员方法1(参数1,参数2,)方法体;类型成员方法2(参数1,参数2,)方法体;,类的定义,20,类的定义格式类的修饰符 class 类名 extends 父类名 implements 接口名 类的修饰符public:公共类,可以被其他类所使用,declares that the class can be used by any class regardless of its package(无任何限制)无修饰/默认说明:a class can be used only by other classes in the same package(仅仅能在同一个包中的其他类引用)abstract:declares that the class cannot be instantiated(宣布该类不能被实例化)final:declares that the class cannot be subclassed(宣布该类不能有子类),类的描述,21,类的修饰符final-Declares that the class cannot be subclassed.(宣布该类不能有子类),类的描述,final class ChessAlgorithm.,class BetterChessAlgorithm extends ChessAlgorithm.,Cant subclass final classes:class ChessAlgorithmclass BetterChessAlgorithm extends ChessAlgorithm 1 error,22,类的定义格式类的修饰符 class 类名 extends 父类名 implements 接口名 extends:继承的关系implements:实现哪些接口(interface)的方法,实现多重继承public class Test extends Frame implements ActionListener,ItemListener,类的描述,23,一个简单的类class Student String name,stuNumber;double score1,score2,score3;void set1(String s1,String s2)name=s1;stuNumber=s2;System.out.println(name+“+stuNumber);double setScore(double d1,double d2,double d3)double d;score1=d1;score2=d2;score3=d3;d=d1 d2+d3;return d;,类的描述,24,包(Package)的概念package org.jalpha;class test 源文件位置:“D:srcorgjalphatest.java”编译方法1:“cd D:srcorgjalpha”“javac test.java”编译方法2:“cd D:src”“javac orgjalphatest.java”class文件位置:“D:srcorgjalphatest.class”运行:“cd D:src”“”,类的描述,25,包(Package)的概念通过包来管理类名空间防止同名类名的冲突层次化的结构,类的描述,对个体(个人和机构)将类文件放在不同的目录下防止重名orgjalphamethod1*.java method2*.java,ABC 公司Engine.java,XYZ 公司Engine.java,需调用Engine.java?,ABC 公司comabcEngine.java,XYZ 公司comxyzEngine.java,26,包(Package)的概念package org.jalpha;class test,类的描述,D:srcorgjalphatest.javaD:srcorgjalphatest1.javaD:srcorgjalphatest2.java,27,对象具有状态和行为成员变量定义访问权限修饰符 类型 变量名;访问权限修饰符 类型 变量名=初值;访问权限修饰符 类型 变量名=初值,变量名=初值;成员方法定义访问权限修饰符 方法返回类型 方法名()throws 异常名 方法体;类型:基本类型,复合类型(数组、类和接口),类成员-变量和方法,28,访问控制修饰符公共访问控制符public 被所有类访问默认访问控制符被同一包中其他类访问私有访问控制符 private被该类自身访问保护访问控制符 protected该类自身、同一个包中的其他类、其他包中的子类访问私有保护访问控制符private protected该类自身、所有子类访问,类成员变量的访问,29,非访问控制修符静态变量static属于类的变量最终变量final值在程序的执行过程中不会改变易失变量volatile可能同时被多个线程所控制和修改,类成员变量的访问,30,public(公共变量/公共方法)容许全权访问,无任何限制(先构造对象,再访问),类成员的访问,class A public int x;public void print()class B void test()A a=new A();a.x=100;a.print();,package abc;class A public int x;public void print()package xyz;import abc.A;class B void test()A a=new A();a.x=100;a.print();,直接访问公有变量x和公共方法print(),31,private(私有变量/私有方法)仅能在其所定义的类中被访问(先构造对象,再访问),D:javac A.javax has private access in A a.x=100;print()has private access in A a.print();2 errors,类成员的访问,class A private int x;private void print()class B void test()A a=new A();a.x=100;a.print();,32,protected(保护变量/保护方法)容许类本身、子类(有一定限制)以及同一个包中所有类访问(先构造对象,再访问),类成员的访问,class A protected int x;protected void print()class B void test()A a=new A();a.x=100;a.print();,package abc;class A protected int x;protected void print()package xyz;import abc.A;class B extends A void test(A a,B b)a.x=100;a.print();b.x=100;b.print();,/illegal/illegal/legal/legal,33,无修饰(友好变量/友好方法)容许类本身以及同一个包中所有类访问,类成员的访问,class A int x;void print()class B void test()A a=new A();a.x=100;a.print();,package abc;class A int x;void print()package abc;class B void test()A a=new A();a.x=100;a.print();,34,小结,*指子类与父类不在同一个包中的情况,类成员变量的访问,35,static(静态变量/静态方法)类的变量/方法,独立于类的对象,可以直接根据类名调用class S static int A=12,B=34;static void print()class Test public static void main(String args)System.out.println(“A=“+S.A+“B=“+S.B);S.print();,类成员变量,36,static(静态变量/静态方法),class Test public void print(int x)System.out.println(x);public static void main(String args)int x=3;print(x);,D:javac Test.javaTest.java:9:non-static method print(int)cannot be referenced from a static context print(x);1 error,class Test public void print(int x)System.out.println(x);public static void main(String args)int x=3;Test t=new Test();t.print(x);,class Test public static void print(int x)System.out.println(x);public static void main(String args)int x=3;print(x);,static方法中仅仅可以调用其他static方法,类成员,37,final 变量/方法final变量:定义一个常数,即变量值不能改变final double AVOGADRO=6.022e23;final类:不能有子类final方法:方法不能被重写(overriding)class ChessAlgorithm.final void nextMove(ChessPiece pieceMoved,BoardLocation newLocation).,类成员变量,38,小结类:public,abstract,final,无修饰,private类成员publicprotectedprivate无修饰staticfinal,类成员变量,39,方法:对象行为的描述完成某种功能的程序块定义:访问权限修饰符 方法返回类型 方法名()throws 异常名 方法体;方法参数的传递变量的作用域方法的重载(overloading)/重写(overriding)方法的递归调用,类成员方法,40,访问控制修饰符公共访问控制符public 被所有类访问默认访问控制符被同一包中其他类访问私有访问控制符 private被该类自身访问保护访问控制符 protected该类自身、同一个包中的其他类、其他包中的子类访问私有保护访问控制符private protected该类自身、所有子类访问,类成员方法的访问,41,非访问控制修符静态方法static属于类的方法最终方法final不能被子类重新定义的方法抽象方法abstract只有方法说明,没有具体实现本地方法native以其他语言实现方法功能同步方法synchronized用于多线程程序中的协调和同步,类成员方法的访问,42,例,成员方法,class Test public static void main(String args)double d_product;Area myArea;myArea=new Area();d_product=myArea.product();System.out.println(“myArea的面积是:”+d_product);,class Area double width,height;void setV(double w,double h)width=w;height=h;double product()return width*height;,43,方法参数,成员方法,形参和实参,D:java Parameter3 43 423,注意1:类型匹配注意2:基本类型与复合类型参数传递的结果不同,Pass by ValueIn Java methods,arguments are passed by value.When invoked,the method receives the value of the variable passed in.When the argument is of primitive type,pass-by-value means that the method cannot change its value.When the argument is of reference type,pass-by-value means that the method cannot change the object reference,but can invoke the objects methods and modify the accessible variables within the object.,44,例,成员方法,u=3;v=2;,u=5;v=10;,输出结果:3 4 511 12 13 14 15,45,变量的作用域(成员变量/局部变量),成员方法,46,方法的重载(overload)方法名相同,但方法的参数不同方法描述 方法名(标识符)参数类型 方法返回值 绝对值 abs(a)int int绝对值 abs(a)long long绝对值 abs(a)float float绝对值 abs(a)double double public static int abs(inta)public static long abs(longa)public static float abs(floata)public static double abs(doublea),成员方法,47,方法的重写(overriding)子类重写父类的方法,成员方法,class Father void display();,class Son extends Father void display();,Father f=new Father();f.display();,Son s=new Son();s.display();,48,构造方法,创建对象/实例化对象new 例1:Apple a=new Apple();(创建对象)例2:Apple a;(对象的说明)a=new Apple();(实例化对象)对象的实例化通过构造方法(constructor)来实现构造方法的名字与类名相同构造方法没有返回值构造方法可以有多个,构成方法的重载(overload),49,例:对象的实例化和初始化,输出结果:2020 5010 20,构造方法,50,再谈方法的重载(overload),构造方法,class Tree int height;Tree()prt(“Planting a seeding”);height=0;Tree(int i)prt(“Creating new Tree that is”+i+“feet tall”);height=i;,void info()prt(“Tree is”+height+“feet height”);void info(String s)prt(s+“:Tree is”+height+“feet height”);static void prt(String s)System.out.println(s);,for(int i=0;i 5;i+)Tree t=new Tree(i);t.info();t.info(“my tree”);new Tree();,51,默认构造方法例 class Apple int color;Apple a=new Apple();对象实例的判断:null例 Apple a;if(a=null)System.out.println(“Day dream”);,构造方法,运行时系统自动赋予一个空构造函数如 Apple(),52,再谈构造方法,构造方法,class Cmethod Cmethod(boolean b)public static void main(String args)Cmethod c1=new Cmethod();Cmethod c2=new Cmethod(false);,class Cmethod Cmethod(boolean b)public static void main(String args)/Cmethod c1=new Cmethod();Cmethod c2=new Cmethod(false);,class Cmethod Cmethod(boolean b)Cmethod()public static void main(String args)Cmethod c1=new Cmethod();Cmethod c2=new Cmethod(false);,运行时系统自动赋予一个空构造方法,仅仅当该类没定义构造方法的情况下,53,static变量的初始化,class Smember static int i=100;static boolean b=true;char c=t;public Smember()public static void main(String args)Smember m1=new Smember();Smember m2=new Smember();,不论产生多少个对象,属于类的静态变量只有一份,即只占有一份存储空间,class Smember static int i;static boolean b;static i=100;b=true;System.out.println(“In static block”);char c=t;public Smember()System.out.println(“In constructor”);public static void main(String args)Smember m1=new Smember();Smember m2=new Smember();,输出结果In static blockIn constructorIn constructor,54,设计模式的例子,class Singleton private static Singleton me=new Singleton();public static Singleton getSingleton()return me;private Singleton()public static void main(String args)Singleton s1=Singleton.getSingleton();Singleton s2=Singleton.getSingleton();if(s1=s2)System.out.println(s1 is s2);else System.out.println(s1 is not s2);,该Singleton类只有一个实例,即该Singleton类只能构造一个对象,55,“Design Patterns:Elements of Reusable Object-Oriented Software”(设计模式)Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides Addison-Wesley,1995这几位作者常被称为“四人组(Gang of Four)”,而这本书也就被称为“四人组(或 GoF)”书设计模式:在一定的环境中解决某一问题的方案23 种设计模式,3大类创建型模式(Creational pattern)规定了创建对象的方式,如Singleton模式、Factory Method模式结构型模式(Structural pattern)规定了如何组织类和对象。这些模式涉及类如何相互继承或如何从其它类组合,如Adapter、Proxy 和 Decorator 模式行为模式(Behavioral pattern)规定了对象之间交互的方式。如Observer模式、Strategy和Template 模式并发模式(Concurrency pattern)规定协调或顺序对共享资源访问的方式MVC(Model/View/Controller,模型/视图/控制器),56,设计模式的例子,public class Sequence private static Sequence instance;private static int counter;private Sequence()counter=0;public static synchronized Sequence getInstance()if(instance=null)instance=new Sequence();return instance;public static synchronized int getNext()return+counter;,这个类不可以再有子类,因为构造方法是privateLazy instantiation(Lazy initialization),仅在需要的时候才实例化对象,private static Sequence instance=new Sequence();,57,抽象类(abstract class),一个未完成的类仅仅抽象类可以包含抽象方法(abstract methods)抽象方法:仅仅申明了方法,但未实现有访问修饰词返回值类型方法名参数列表无方法体,58,抽象类(abstract class),abstract class Point int x=1,y=1;void move(int dx,int dy)x+=dx;y+=dy;alert();abstract void alert();,abstract class ColoredPoint extends Point int color;,class SimplePoint extends Point void alert(),抽象方法:有访问修饰词、返回值类型、方法名和参数列表,无方法体,59,抽象类(abstract class),抽象类不能被实例化,例Point p=new Point();子类继承抽象类时,必须重写抽象方法,否则仍为抽象类,abstract class Point int x=1,y=1;void move(int dx,int dy)x+=dx;y+=dy;alert();abstract void alert();,abstract class ColoredPoint extends Point int color;,class SimplePoint extends Point void alert(),Point p=new SimplePoint();,60,抽象类(abstract class),多态性,abstract class Graphics abstract void parameter();abstract void area();,class Rectangle extends Graphics double h,w;Rectangle(double u,double v)h=u;w=v;void parameter()System.out.println(h+“+w);void area()System.out.println(h*w);,Rectangle rec=new Rectangle(1.0,2.0);Circle cir=new Circle(3.0,“Red”);Graphics g=rec,cir;for(int i=0;i g.length;i+)gi.parameter();gi.area();,class Circle extends Graphics double r;String c;Circle(double u,String v)r=u;c=v;void parameter()System.out.println(r+“+c);void area()System.out.println(Math.PI*r*r);,运行结果1.0 2.02.03.0 Red28.274333882308138,多态性(polymorphism),应用场合:不同子类可以用不同的方式实现同一共同接口,该共同接口建立了一个基本形式,61,第三章 面向对象特征,基本概念类的定义对象类的继承和多态接口和包常用工具类,62,对象,引用对象的变量格式:对象名.变量名引用对象的方法格式:对象名.方法名例1Vector v=new Vector();v.addElement(“hello world”);例2int a=1,2,3,4,5;int size=a.length;例3();,63,对象,通过对象引用对象的成员变量和成员方法,class Qangle int a,h;Qangle()a=10;h=20;Qangle(int x,int y)a=x;h=y;Qangle(Qangle r)a=r.width();h=r.height();void set(int x,int y)a=x;h=y;,q1.set(30,40);q1.a=30;q1.h=40;目的相同第一方式更安全、更面向对象(数据封装)直接操纵变量,64,对象的释放,将对象从内存中清除内存的管理(枯燥、容易出错)垃圾回收(Garbage Collection)垃圾搜集器(Garbage Collector)周期性地释放不再被引用的对象,自动完成手动完成,System.gc();public static void gc()-Runs the garbage collector.,The Java platform allows you to create as many objects as you want(limited,of course,by what your system can handle),and you dont have to worry about destroying them.The Java runtime environment deletes objects when it determines that they are no longer being used.This process is called garbage collection.,65,对象的使用,访问对象的私有(private)成员通过定义一个公共方法来实现,class Student private String name;private String id;Student(String s1,String s2)name=s1;id=s2;String getName()return name;void setName(String s)name=s;,Student st=new Student(“aloha”,“001”);String n=st.getName();st.setName(“csma”);n=st.getName();,66,对象的使用,对象作为方法的参数访问权限修饰符 方法返回类型 方法名(参数)throws 异常名方法体;参数:类型 变量名,类型:基本数据类型/复合类型(对象)参数的传递Pass by value,67,例 对象用作方法的参数,对象的使用,68,对象的使用,对象的访问对象作为方法的返回值访问权限修饰符 方法返回类型 方法名(参数)throws 异常名方法体;返回类型有返回值:基本数据类型/复合类型(对象)无返回值:void,69,对象的使用,对象作为方法的返回值例:求两点坐标之间的中点坐标思路:(x1,y1)和(x2,y2)(x,y)x=(x1+x2)/2,y=(y1+y2)/2Spot s1=new Spot(2,3);Spot s2=new Spot(4,5);Spot s=s1.midSpot(s2);,70,例 对象用作方法的返回值,对象的使用,71,对象的使用,数组:类型相同的一列元素简单的数组,public class ArrayDemo public static void main(String args)int anArray=new int10;for(int i=0;i anArray.length;i+)anArrayi=i;System.out.print(anArrayi+);();,72,对象的使用,对象数组,class Test public static void main(String args)int a=new int5;for(int i=0;i a.length;i+)System.out.println(ai);String s=new String5;for(int i=0;i s.length;i+)System.out.println(si);,System.out