Java语言中的面向对象特性.ppt

上传人:小飞机 文档编号:6510153 上传时间:2023-11-07 格式:PPT 页数:95 大小:392KB
返回 下载 相关 举报
Java语言中的面向对象特性.ppt_第1页
第1页 / 共95页
Java语言中的面向对象特性.ppt_第2页
第2页 / 共95页
Java语言中的面向对象特性.ppt_第3页
第3页 / 共95页
Java语言中的面向对象特性.ppt_第4页
第4页 / 共95页
Java语言中的面向对象特性.ppt_第5页
第5页 / 共95页
点击查看更多>>
资源描述

《Java语言中的面向对象特性.ppt》由会员分享,可在线阅读,更多相关《Java语言中的面向对象特性.ppt(95页珍藏版)》请在三一办公上搜索。

1、第6章 Java语言中的面向对象特性,学习内容,面向对象技术基础Java语言的面向对象特性,6.1 面向对象技术基础,面向对象的基本概念 面向对象的基本特征,面向对象的基本概念,类是对一类事物描述,是抽象的、概念上的定义。对象是实际存在的该类事物的每个个体,因而也称实例(instance)。,对象的基本概念,对象具有两方面的含义:,变量,方法,客观世界的实体,程序中对象就是一组变量和相关方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为。,对象的基本概念 续,类的基本概念,现实生活中的对象,可以将现实生活中的对象经过抽象,映射为程序中的对象。对象在程序中是通过一种抽象数据类型来描述的

2、,这种抽象数据类型称为,class Car int color_number;int door_number;int speed;void brake()void speedUp()void slowDown(),抽象数据类型,类的基本概念 续,面向对象的基本特征,1封装性2继承性3多态性,封装性,封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义:把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界或者说形成一道屏障,只保留有限的对外接口使之与外部发生联系。,封装性 续,

3、继承性,特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。例如,轮船、客轮;人、大人。一个类可以是多个一般类的特殊类,它从多个一般类中继承了属性与服务,这称为多继承。例如,客轮是轮船和客运工具的特殊类。在Java语言中,通常我们称一般类为父类(superclass,超类),特殊类为子类(subclass)。,多态性,对象的多态性是指在一般类中定义的属性或服务被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或服务在一般类及其各个特殊类中具有不同的语义。例如:几何图形的绘图方法,椭圆和多边形都是几何图的子类,其绘图方法功能不同。,面向对象程序设计方法,

4、OOAObject Oriented Analysis 面向对象的分析OODObject Oriented Design 面向对象的设计OOIObject Oriented Implementation 面向对象的实现,6.2 Java语言的面向对象特性,类 对象面向对象特性,类,类是java中的一种重要的引用数据类型,是组成java程序的基本要素。它封装了一类对象的状态和方法,是这一类对象的原形。一个类的实现包括两个部分:类声明和类体。,类声明,publicabstract|final class className extends superclassName implements int

5、erfaceNameList其中,修饰符public,abstract,final 说明了类的属性,className为类名,superclassName为类的父类的名字,interfaceNameList为类所实现的接口列表。,类体,类体定义如下:class classNamepublic|protected|private static final transient volatile typevariableName;/成员变量public|protected|private staticfinal|abstract native synchronizedreturnType metho

6、dName(paramList)throws exceptionListstatements/成员方法,成员变量,成员变量的声明方式如下:public|protected|private static final transient volatile typevariableName;/成员变量其中,static:静态变量(类变量);相对于实例变量final:常量transient:暂时性变量,用于对象存档volatile:贡献变量,用于并发线程的共享,成员方法,方法的实现包括两部分内容:方法声明和方法体。public|protected|private staticfinal|abstrac

7、t native synchronizedreturnType methodName(paramList)throws exceptionList/方法声明statements/方法体方法声明中的限定词的含义:static:类方法,可通过类名直接调用abstract:抽象方法,没有方法体final:方法不能被重写native:集成其它语言的代码synchronized:控制多个并发线程的访问,方法声明,方法声明包括方法名、返回类型和外部参数。其中参数的类型可以是简单数据类型,也可以是引用数据类型。对于简单数据类型来说,java实现的是值传递,方法接收参数的值,但不能改变这些参数的值。如果要改变

8、参数的值,则用引用数据类型,因为引用数据类型传递给方法的是数据在内存中的地址,方法中对数据的操作可以改变数据的值。,关于简单数据类型与引用数据的区别 示例:,public class PassTest float ptValue;public static void main(String args)int val;PassTest pt=new PassTest();val=11;System.out.println(Original Int Value is:+val);pt.changeInt(val);/值参数System.out.println(Int Value after Cha

9、nge is:+val);/*值参数值的修改,没有影响值参数的值*/pt.ptValue=101f;System.out.println(Original ptValue is:+pt.ptValue);pt.changeObjValue(pt);/引用类型的参数System.out.println(ptValue after Change is:+pt.ptValue);/*引 用参数值的修改,改变了引用参数的值*/public void changeInt(int value)value=55;/在方法内部对值参数进行了修改 public void changeObjValue(PassT

10、est ref)ref.ptValue=99f;/在方法内部对引用参数进行了修改,关于简单数据类型与引用数据的区别 示例运行结果:,方法体,方法体是对方法的实现,它包括局部变量的声明以及所有合法的Java指令。方法体中声明的局部变量的作用域在该方法内部。若局部变量与类的成员变量同名,则类的成员变量被隐藏。,局部变量和类成员变量的作用域 示例:,class Variable int x=0,y=0,z=0;/类的成员变量void init(int x,int y)this.x=x;this.y=y;int z=5;/局部变量System.out.println(*in init*);System

11、.out.println(x=+x+y=+y+z=+z);public class VariableTest public static void main(String args)Variable v=new Variable();System.out.println(*before init*);System.out.println(x=+v.x+y=+v.y+z=+v.z);v.init(20,30);System.out.println(*after init*);System.out.println(x=+v.x+y=+v.y+z=+v.z);,局部变量和类成员变量的作用域 示例运行

12、结果:,方法重载,方法重载是指多个方法享有相同的名字,但是这些方法的参数必须不同,或者是参数的个数不同,或者是参数类型不同。返回类型不能用来区分重载的方法。,方法重载 示例:,class MethodOverloading void receive(int i)System.out.println(Receive one int data);System.out.println(i=+i);void receive(int x,int y)System.out.println(Receive two int datas);System.out.println(x=+x+y=+y);public

13、 class MethodOverloadingTest public static void main(String args)MethodOverloading mo=new MethodOverloading();mo.receive(1);mo.receive(2,3);,方法重载 示例运行结果:,构造方法,构造方法是一个特殊的方法。Java 中的每个类都有构造方法,用来初始化该类的一个对象。构造方法具有和类名相同的名称,而且不返回任何数据类型。重载经常用于构造方法。构造方法只能由new运算符调用。,构造方法 示例:,构造方法之间是重载的,class Point int x,y;Poi

14、nt()x=0;y=0;Point(int x,int y)this.x=x;this.y=y;,对象,类实例化可生成对象,对象通过方法调用来进行交互。一个对象的生命周期包括三个阶段:生成、使用和消除。,对象的生成,对象的生成包括声明、实例化和初始化。格式为:type objectName=new type(paramlist);,对象的使用,通过运算符“.”可以实现对变量的访问和方法的调用。变量和方法可以通过设定访问权限来限制其它对象对它的访问。,对象的使用 续,调用对象的变量 格式:objectReference.variable objectReference是一个已生成的对象,也可以是

15、能 生成对象的表达式例:p.x=10;tx=new Point().x;调用对象的方法 格式:objectReference.methodName(paramlist);例如:p.move(30,20);new Point().move(30,20);,对象的清除,当不存在对一个对象的引用时,该对象成为一个无用对象。Java的垃圾收集器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。因此,Java程序不用关系对象的清除问题。,面向对象特性,java语言中有三个典型的面向对象的特性:封装性、继承性和多态性,下面将详细阐述。1 封装性2 继承性3 多态性4 其它,封装性,java

16、语言中,对象就是对一组变量和相关方法的封装,其中变量表明了对象的状态,方法表明了对象具有的行为。通过对象的封装,实现了模块化和信息隐藏。通过对类的成员施以一定的访问权限,实现了类中成员的信息隐藏。,类体定义的一般格式,class className public|protected|private static final transient volatile typevariableName;/成员变量public|protected|private staticfinal|abstract native synchronizedreturnType methodName(paramList

17、)throws exceptionListstatements/成员方法,Java类中的限定词,Java类中的限定词 续,Java语言中有四种不同的限定词,提供了四种不同的访问权限:1)private 类中限定为private的成员,只能被这个类本身访问。如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。2)default类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。3)protected类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的

18、类访问。4)public类中限定为public的成员,可以被所有的类访问。,private,class PrivateClass private int x;public PrivateClass()x=100;private void printX()Systemoutprintln(”Value Of x is”+x);class PrivateDemo PrivateClass p;public PrivateDemo()p=new PrivateClass();p.printX();public static void main(String args)new PrivateDemo(

19、);,在编译此程序时,将产生下列编译错误:PrivateDemo.Java:10:No method matching printX()found in class PrivateClass p.pintX()1 error,default,class PrivateClass int x;public PrivateClass()x=100;void printX()Systemoutprintln(”Value Of x is”+x);class PrivateDemo PrivateClass p;public PrivateDemo()p=new PrivateClass();p.pr

20、intX();public static void main(String args)new PrivateDemo();,运行结果:Value Of x is 100,public,class PrivateClass int x;public PrivateClass()x=100;public void printX()Systemoutprintln(”Value Of x is”+x);class PrivateDemo PrivateClass p;public PrivateDemo()p=new PrivateClass();p.printX();public static v

21、oid main(String args)new PrivateDemo();,运行结果:Value Of x is 100,protected,class PrivateClass int x;public PrivateClass()x=100;protected void printX()Systemoutprintln(”Value Of x is”+x);class PrivateDemo PrivateClass p;public PrivateDemo()p=new PrivateClass();p.printX();public static void main(String

22、args)new PrivateDemo();,运行结果:Value Of x is 100,protected 示例,package p1;public class Parentprotected void display()System.out.println(in Parents method!);,import p1.Parent;public class Child extends Parentpublic static void main(String args)Parent t=new Parent();t.display();/非法调用,编译出错Child c=new Chil

23、d();c.display();/合法,小结 protected,在下列情况下能够访问一个类受保护的成员:两各类位于同一包中。两个父子关系的类位于不同的包中,子类访问父类的成员。在父类中声明为public的方法在子类中被继承为public。在父类中为“protected”的方法在子类中被继承为protected。在父类中指定为private的方法不被继承。方法内的本地变量不能附带访问说明符。,Java类中的限定词 示例,public class Book/String 书籍编号private String bookid=;/String 书籍名称private String bookname=

24、;public String getBookid()return bookid;public void setBookid(String bookid)this.bookid=bookid;public String getBookname()return bookname;public void setBookname(String bookname)this.bookname=bookname;,继承性,public class Person public String name;public int age;public Date birthDate;public String getI

25、nfo()/,public class Student public String name;public int age;public Date birthDate;public String school;public String getInfo()/.,Person.class,Student.class,定义类Person描述和处理个人信息,定义类Student描述和处理学生信息,两个类的结构太接近了,后者只比前者多出一个属性school,继承性 续,引入类继承机制简化后的Student类的定义:,public class Student extends Person public

26、String school;,Person.class作为父类,Student.class作为子类,public class Person public String name;public int age;public Date birthDate;public String getInfo()/,Student类同样包含Person类中的所有属性和方法,但在结构上被大大简化了。,继承性 续,继承是父类和子类之间共享数据和方法的机制继承使得子类可以利用父类中定义的方法和变量,就像它们属于子类本身一样,共性部分,继承部分,个性部分,继承性 续,创建子类例如:,格式:class SubClass

27、 extends SuperClass,public class Student extends Person public String school;,小结 Java中单继承,一个子类只能有一个父类、一个父类可以派生出多个子类。,继承性,继承而得到的类称为子类,被继承的类称为父类。子类不能继承父类中访问权限为private的成员变量和方法。子类可以重写父类的方法,及命名与父类同名的成员变量。但Java不支持多重继承,即一个类从多个超类派生的能力。Java中所有的类都是通过直接或间接地继承类得到的。,继承性 续,创建子类格式:class SubClass extends SuperClass

28、 成员变量的隐藏和方法的重写子类通过隐藏父类的成员变量和重写父类的方法,可以把父类的状态和行为改变为自身的状态和行为。注意:子类中重写的方法和父类中被重写的方法要具有相同的名字,相同的参数表和相同的返回类型,只是方法体不同。,继承性 示例:,class SuperClassint x;void setX()x=0;class SubClass extends SuperClassint x;/隐藏了父类的变量xvoid setX()/重写了父类的方法 setX()x=5;.,成员变量的隐藏和方法的重写,class ParentClass int x;protected void setValu

29、e()x=10;public void changeValue()x=x+2;public void print()System.out.println(x=+x);class SubClass extends ParentClass int x;public void setValue()x=20;public void changeValue()x=x+10;public class AttributeHideTest public static void main(String args)ParentClass pObj1=new ParentClass();ParentClass pO

30、bj2=new SubClass();SubClass pObj3=new SubClass();pObj1.setValue();pObj1.print();pObj2.setValue();pObj2.print();pObj3.setValue();pObj3.print();,x=10 x=0 x=0,结果,方法重写时应遵循的原则:,1)改写后的方法不能比被重写的方法有更严格的访问权限(可以相同)。2)改写后的方法不能比重写的方法产生更多的异常。,super,Java中通过super来实现对父类成员的访问,super用来引用当前对象的父类。Super 的使用有三种情况:1)访问父类被隐

31、藏的成员变量,如:super.variable;2)调用父类中被重写的方法,如:super.Method(paramlist);3)调用父类的构造方法,如:super(paramlist);,super 示例:,import java.io.*;class SuperClassint x;SuperClass()x=3;System.out.println(in SuperClass:x=+x);void doSomething()System.out.println(in SuperClass.doSomething();class SubClass extends SuperClass i

32、nt x;SubClass()super();/调用父类的构造方法x=5;/super()要放在方法中的第一句System.out.println(in SubClass:x=+x);void doSomething()super.doSomething();/调用父类的方法System.out.println(in SubClass.doSomething();System.out.println(super.x=+super.x+sub.x=+x);public class Inheritance public static void main(String args)SubClass s

33、ubC=new SubClass();subC.doSomething();,in SuperClass:x=3in SubClass:x=5in SuperClass.doSomething()in SubClass.doSomething()super.x=3 sub.x=5,结果,多态性,class A void callme()System.out.println(Inside As callme()method);class B extends A void callme()System.out.println(Inside Bs callme()Method);public cla

34、ss Dispatch public static void main(String args)A a=new B();a.callme();,Inside Bs callme()Method,结果,小结 多态性,这说明我们声明了a变量为A类型,但是我们可以实例化一个A(也可以是一个接口)类型的一个子类(B类),当我们调用a变量的方法时候,我们实际上是调用它的实例B的方法。,小结 多态性 续,重写方法的调用原则:java运行时系统根据调用该方法的实例,来决定调用哪个方法。对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未重写),则运行时系统调用

35、父类的方法。,final 关键字,final 关键字可以修饰类、类的成员变量和成员方法,但final 的作用不同:1)final 修饰成员变量:final修饰变量,则成为常量,例如final type variableName;修饰成员变量时,定义时同时给出初始值,而修饰局部变量时不做要求。2)final 修饰成员方法:final修饰方法,则该方法不能被子类重写final returnType methodName(paramList)3)final 类:final修饰类,则类不能被继承final class finalClassName,final 关键字 示例:,声明两个常量:,publi

36、c static final String DATABASE_USER_TABLE_FILE_NAME=database.user;public static final String DATABASE_BOOK_TABLE_FILE_NAME=database.book;,类变量和类方法,用static 关键字可以声明类变量和类方法,其格式如下:static type classVar;static returnType classMethod(paramlist)使用这些方法时候不需要实例化一个类,就可以使用这些变量和方法。,实例成员和类成员,如果在声明时不用static 关键字修饰,则声

37、明为实例变量和实例方法。1)实例变量和类变量每个对象的实例变量都分配内存,通过该对象来访问这些实例变量,不同的实例变量是不同的。类变量仅在生成第一个对象时分配内存,所有实例对象共享同一个类变量,每个实例对象对类变量的改变都会影响到其它的实例对象。类变量可通过类名直接访问,无需先生成一个实例对象,也可以通过实例对象访问类变量。2)实例方法和类方法实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,实例方法由实例对象调用。但类方法不能访问实例变量,只能访问类变量。类方法可以由类名直接调用,也可由实例对象进行调用。类方法中不能使用this或super关键字。,实例成员和类成员 示例:,

38、class Member static int classVar;int instanceVar;static void setClassVar(int i)classVar=i;/instanceVar=i;/类方法不能访问实例变量static int getClassVar()return classVar;void setInstanceVar(int i)classVar=i;/实例方法不但可以访问类变量,也可以实例变量instanceVar=i;int getInstanceVar()return instanceVar;public class MemberTest public

39、static void main(String args)Member m1=new Member();Member m2=new Member();m1.setClassVar(1);m2.setClassVar(2);System.out.println(m1.classVar=+m1.getClassVar()+m2.ClassVar=+m2.getClassVar();m1.setInstanceVar(11);m2.setInstanceVar(22);System.out.println(m1.InstanceVar=+m1.getInstanceVar()+m2.Instance

40、Var=+m2.getInstanceVar();,m1.classVar=2 m2.ClassVar=2m1.InstanceVar=11 m2.InstanceVar=22,结果,封装类,Java中有八种基本数据类型对应八个封装类:,抽象类和接口,抽象类 接口,抽象类,参考示例代码:AbstractClassTest.java,This is in abstract class.This is in SubClass1.矩形面积为:12.0This is in SubClass2.求得参数x的y次幂为:81.0This is in SubClass3.矩形的周长为:14.0,结果,抽象类

41、续,在示例中第4行abstract void Caculate(int x,int y)方法,这个方法特殊在它只有方法的声明(方法名、参数列表、返回值类型)没有方法的实现(这个方法要处理的事情)。在它的子类SubClass1、SubClass2和SubClass3分别给出了三种不同的实现。Java语言中,用abstract 关键字来修饰一个类时,这个类叫做抽象类,用abstract 关键字来修饰一个方法时,这个方法叫做抽象方法。,抽象类 续,格式如下:abstract class abstractClass/抽象类abstract returnType abstractMethod(param

42、list)/抽象方法抽象类必须被继承,抽象方法必须被重写。抽象方法只需声明,无需实现;抽象类不能被实例化.抽象类不一定要包含抽象方法。若类中包含了抽象方法,则该类必须被定义为抽象类。,接口,package ch06.a2;public interface Action double TOTALNUM1=80;double TOTALNUM2=100;void addValue(int n);void subtractValue(int n);void factorialValue(int n);double getValue();,接口的方法都只有声明没有实现:,接口的实现,当然实现接口类可以

43、有多个,package ch06.a2;public class InterfaceImp1 implements Action double num=20;public void addValue(int n)num+=n;public void subtractValue(int n)num-=n;public void factorialValue(int n)num=1;for(int i=1;i=n;i+)num*=i;public double getValue()return num;,接口 续,接口是抽象类的一种,只包含常量和方法的定义,而没有变量和方法的实现,且其方法都是抽象

44、方法。它的用处体现在下面几个方面:通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系。通过接口指明多个类需要实现的方法。通过接口了解对象的交互界面,而无需了解具体的实现细节。,接口的定义,接口的定义包括接口声明和接口体:接口声明的格式如下:public interface interfaceNameextends listOfSuperInterface extends 子句与类声明的extends子句基本相同,不同的是一个接口可有多个父接口,用逗号隔开,而一个类只能有一个父类。接口体包括常量定义和方法定义常量定义格式为:type NAME=value;该常量被实现该接口的多个类共享;

45、具有public,final,static的属性。方法体定义格式为:(具有 public和abstract属性)returnType methodName(paramlist);,接口的实现,在类的声明中用implements子句来表示一个类使用某个接口,在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口,在implements子句中用逗号分开。,接口类型的使用,接口作为一种引用类型来使用。任何实现该接口的类的实例都可以存储在该接口类型的变量中,通过这些变量可以访问类所实现的接口中的方法。,图书管理系统中接口的使用,让我们看看图书管理系统的层次结构:,图

46、书管理系统中接口的使用 续,我们可以在表示层和服务层添加接口,使表示层无需了解服务层的实现类。同样我们也可以在服务层和数据持久层之间引入接口,从而实现服务层不依赖与数据持久层。,图书管理系统中接口的使用 续,服务层的类图:,图书管理系统中接口的使用 续,服务层的类图:,图书管理系统中接口的使用 续,LogonService接口:,package com.book.service;import com.book.domain.User;public interface LogonService public User getUserInfo(String name,String password

47、);,图书管理系统中接口的使用 续,LogonService接口的实现类LogonServiceImp:,import com.book.dao.UserDao;import com.book.dao.UserDaoImp;import com.book.domain.User;public class LogonServiceImp implements LogonService public User getUserInfo(String name,String password)UserDao dao=new UserDaoImp();User user=dao.findByPrimar

48、yKey(name);if(user!=null,图书管理系统中接口的使用 续,数据持久层的类图:,图书管理系统中接口的使用 续,UserDao接口:,package com.book.dao;import java.util.List;import com.book.domain.User;public interface UserDao public User findByPrimaryKey(String pk);public void create(User user);public void delete(String pk);public void modify(User user

49、);public List find();,图书管理系统中接口的使用 续,UserDao接口的实现类UserDaoImp:,public class UserDaoImp implements UserDao public User findByPrimaryKey(String pk)Map table=DBManager.UserTable;User user=null;String row=(String)table.get(pk);if(row!=null)String fields=row.split(Tool.COMMA_SIGN_DELIMITERS);user=new User

50、(fields0,fields1,fields2);return user;public void create(User user)public void delete(String pk)public void modify(User user)public List find()return null;,图书管理系统中接口的使用 续,在服务层LogonServiceImp类:,import com.book.dao.UserDao;import com.book.dao.UserDaoImp;import com.book.domain.User;public class LogonSe

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号