JAVA-教学PPT-第三课_第1页
JAVA-教学PPT-第三课_第2页
JAVA-教学PPT-第三课_第3页
JAVA-教学PPT-第三课_第4页
JAVA-教学PPT-第三课_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三讲 Java与面向对象技术,1、面向对象的概念 2、Java中的类、方法和变量 3、Java名字空间及访问规则 4、Java中的抽象类、接口和程序包 5、对象的构造方法,所谓面向对象的方法学,就是使我们分析、设计和实现一个系统的方法尽可能地接近我们认识一个系统的方法。包括: 面向对象的分析(OOA, Object-Oriented Analysis) 面向对象的设计(OOD, Object-Oriented Design) 面向对象的程序设计(OOP, Object-Oriented Program) 面向对象技术主要围绕以下几个概念: 对象、抽象数据类型、类、类型层次(子类)、继承性、多

2、态性。,1、面向对象的概念,对象有两个层次的概念: 现实生活中对象指的是客观世界的实体; 程序中对象就是一组变量和相关方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为。,1、面向对象的概念 对象,可以将现实生活中的对象经过抽象,映射为程序中的对象。对象在程序中是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(Class)。,1、面向对象的概念 对象,类是描述对象的“基本原型”,它定义一类对象所能拥有的数据和能完成的操作。在面向对象的程序设计中,类是程序的基本单元。 相似的对象可以归并到同一个类中去,就像传统语言中的变量与类型关系一样。 程序中的对象是类的一个实例,是一个软件单

3、元,它由一组结构化的数据和在其上的一组操作构成。,1、面向对象的概念 类,1、面向对象的概念 类,变量:指对象的所知道的状态。 方法:指对象的功能单元。 消息 软件对象通过相互间传递消息来相互作用和通信,一个消息由三部分组成: 1. 接受消息的对象 2. 接收对象要采取的方法 3. 方法需要的参数,1、面向对象的概念 类,一个例子 在程序中所操作的对象是类的一个实例。 创建一个对象: Hello obj=new Hello(); 调用方法: obj.showString(); 调用对象的方法相当于给对象发送消息,收到消息的对象通过改 变自身的状态或者向其它对象发送消息来响应消息。,1、面向对象

4、的概念 类,为什么要使用类? 采用简单数据类型表示现实世界中概念的局存在很大的限性。例如:采用int型数据表示一个日期概念,需要使用3个变量: int day, month, year; 如果要表示2个人的生日,就要使用6个变量 并且在使用中必须时刻注意三者的联系和约束关系 同时在使用日期概念时要同时对三个变量进行访问 使用类可以把现实问题中的对象映射为程序中的一个整体类。,1、面向对象的概念 类,类中不但有变量,还有与之相关的操作所定义的方法。将变量和方法封装在一个类中,可以对成员变量进行隐藏,外部对类成员的访问都通过方法进行,能够保护类成员不被非法修改。,class BirthDate p

5、ublic int day,month,year; public int tomorrow() BirthDate mybirth, yourbirth;,BirthDate date; 已知当前日期对象,求第2天的日期对象:date.day =date.day+1; 如果date.day已经为31,操作结果是非法状态。可以定义一个成员方法tomorrow(),求第2天的日期对象。外部要获得当前日期的后一天时,只要调用: date.tomorrow();,1、面向对象的概念 类,封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对

6、类的修改和访问数据的程度。,1、面向对象的概念 封装,子类是作为另一个类的扩充或修正而定义的一个类。,1、面向对象的概念 子类,继承是子类利用父类中定义的方法和变量,就像它们属于子类本身一样。,class Car int color_number; int door_number; int speed; public void push_break() public void add_oil() ,class Trash_Car extends Car double amount; public void fill_trash() ,1、面向对象的概念 继承,方法的覆盖 覆盖使得在子类中可以重

7、新定义父类中已有的方法,从而体现出子类自己的行为。,class Car int color_number; int door_number; int speed; public void push_break() speed = 0; public void add_oil() ,class Trash_Car extends Car double amount; public void fill_trash() public void push_break() speed = speed 10; ,1、面向对象的概念 方法的覆盖,重载指得是在同一个类中至少有两个方法用同一个名字,但有不同的参

8、数。,1、面向对象的概念 方法的重载(多态性),例如对于StringBuffer类,它有方法 public StringBuffer append(int i); public StringBuffer append(double d); public StringBuffer append(String s); public StringBuffer append(char str, int offset, int len);,类、方法、变量定义的语法规范 对象的创建和使用 继承、覆盖、重载、多态等概念 内嵌类(inner class),2、Java中的类、方法和变量,2、Java中的类、方

9、法和变量 类定义的语法规范,类的严格定义及修饰字,类的修饰字: public abstract | final 缺省方式为 friendly,变量修饰字 变量数据类型 变量名1,变量名2=变量初值;,变量的定义及修饰字,public | protected | private static final transient volatile,成员变量的类型可以是Java中任意的数据类型,包括简单类型,类,接口,数组。在一个类中的成员变量应该是唯一的。,2、Java中的类、方法和变量 变量定义的语法规范,方法修饰字 返回类型 方法名称(参数1,参数2,) throws exceptionList

10、(statements;) /方法体:方法的内容 ,方法的定义及修饰字,public | protected | private static final | abstract native synchronized,返回类型可以是任意的Java数据类型,当一个方法不需要返回值时,返回类型为void。 参数的类型可以是简单数据类型,也可以是引用数据类型(数组、类或接口),参数传递方式是值传递。 方法体是对方法的实现。它包括局部变量的声明以及所有合法的Java指令。局部变量的作用域只在该方法内部。,2、Java中的类、方法和变量 变量定义的语法规范,class A static void cha

11、nge(String s, StringBuffer sb) s = “aaaa”; /此语句不起作用 sb.setLength(0); sb.append(“aaaa”); public static void main(String args) String s = “bbbb”; StringBuffer sb = new StringBuffer(“bbbb”); change(s, sb); System.out.println(s); System.out.println(sb); ,输出结果: bbbb aaaa,2、Java中的类、方法和变量 参数的传递方式是值传递,一个简单的

12、类,class Car int car_number; void set_number(int car_num) car_number=car_num; void show_number() System.out.println (“My car No. is : ”+car_number); ,class CarDemo public static void main(String args) Car Democar=new Car(); DemoCar.set_number(3838); DemoCar.show_number(); ,My car No. is : 3838,2、Java

13、中的类、方法和变量 一个简单的类,(1)对象的生成 通过new操作符生成一个对象;例如: Car demoCar; demoCar = new Car(); (2)对象的构造过程 为对象开辟空间,并对对象的成员变量进行缺省的初始化; 对成员变量进行指定的初始化; 调用构造方法。,2、Java中的类、方法和变量 对象,(3)对象的使用 对象的使用是通过一个引用类型的变量来实现,包括引用对象的成员变量和方法,通过运算符 可以实现对变量的访问和方法的调用。例如: BirthDate date; int day; day = date.day; /引用date的成员变量day date.tomorro

14、w(); /调用date的方法tomorrow(),2、Java中的类、方法和变量 对象,类的继承,class Car int car_number; void set_number(int car_num) car_number=car_num; void show_number() System.out.println (“My car No. is :”+car_number); ,2、Java中的类、方法和变量 继承,class TrashCar extends Car int capacity; void set_capacity(int trash_car_capacity) ca

15、pacity=trash_car_capacity; void show_capacity() System.out.println(“My capacity is: ” + capacity); ,2、Java中的类、方法和变量 继承,Car是父类,TrashCar是子类。TrashCar中继承了Car中的两个方法,同时又增加了两个新方法。,2、Java中的类、方法和变量 继承,继承性是面向对象程序设计语言的另一基本特征,通过继承可以实现代码的复用。继承而得到的类为子类,被继承的类为父类,父类包括所有直接或间接被继承的类。Java中不支持多重继承。通过在类的声明中加入extends子句来创建

16、一个类的子类: class SubClass extends SuperClass 如果缺省extends子句,则该类为java.lang.Object的子类。 子类可以继承父类中访问权限设定为public、 protected、 default的成员变量和方法,但是不能继承访问权限为private的成员变量和方法。,2、Java中的类、方法和变量 继承,何时选择继承? 一个很好的经验:“B是一个A吗?” 如果是则让B做A的子类.,常犯的错误A有一个B吗? 例如让汽车轮子成为汽车的子类是错误的,2、Java中的类、方法和变量 继承,在更多的时候,组成(聚集)关系比继承更能使系统具有高度的灵活性

17、,可维护行,并且提高系统的可重用性。,2、Java中的类、方法和变量 继承,类方法的覆盖 方法覆盖即指在子类中重新定义父类中已有的方法。,class Car int color_number; int door_number; int speed; public void push_break() speed = 0; public void add_oil() ,class Trash_Car extends Car double amount; public void fill_trash() public void push_break() speed = speed 10; ,2、Ja

18、va中的类、方法和变量 覆盖,覆盖方法的调用 对于重写的方法,Java运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。,public class DemoCar public static void main( String args ) Car aCar = new Trash_Car( ); aCar. push_break( ); ,在这里, 类Trash_Car中的push_break( )方法将被调用。,2、Java中的类、方法和变量 覆盖,方法覆盖时应遵循的原则 (1)覆盖后的方法不能比被覆盖的方法有更严格的访问权限。 (2)覆盖后的方法不能比被覆盖的方法产生更多的例外

19、。,2、Java中的类、方法和变量 覆盖,类方法的重载 方法重载即指多个方法可以享有相同的名字。但是这些方法的参数必须不同,或者是参数个数不同,或者是参数类型不同。 例如,要打印不同类型的数据,int, float, String,不需要定义不同名的方法: printInt(int); printFloat(float); printString(String)。 利用方法重载,只需要定义一个方法名:println(),接收不同的参数: println(int); println(float); println(String); StringBuffer vs. ResultSet,2、Jav

20、a中的类、方法和变量 重载,多态性 类方法的重载是一种多态性。除此之外,多态性还可以是指在程序中需要使用父类对象的地方,都可以用子类对象来代替。 例如: public class Employee extends Object public class Manager extends Employee 则: Employee e = new Manager(); /合法语句 通过 instanceof 可以判断父类引用所引用的对象实例的实际类型。,2、Java中的类、方法和变量 多态性,可以用方法来实现对成员变量的隐藏: 设置变量方法:setVariable() 获取变量方法:getVaria

21、ble(),class Sample protected int x; void setX(int var ) x = var; int getX() return x; ,2、Java中的类、方法和变量 成员变量的隐藏,在Java语言中,提供了操作符instanceof用来判断对象是否属于某个类的实例。,public void method (Employee e) if ( e instanceof Manager ) /do something as a Manager else if ( e instanceof Contractor ) /do something as a Cont

22、ractor else /do something else ,2、Java中的类、方法和变量 对象状态的确定,2、Java中的类、方法和变量 内嵌类(inner class),在一个类的内部声明的类,称为内嵌类。,public class Stack private Vector items; ./code for Stacks methods and constructors not shown. public Enumeration enumerator() return new StackEnum(); class StackEnum implements Enumeration in

23、t currentItem = items.size() - 1; public boolean hasMoreElements() return (currentItem = 0); public Object nextElement() if (!hasMoreElements() throw new NoSuchElementException(); else return items.elementAt(currentItem-); ,内嵌类只能在包含它的类中使用,同时它可以看作是该包含类的一段特殊代码,可以直接使用该包含类的变量和方法。 内嵌类编译后也会形成一个单独的class,但它

24、附属于其包含类。,Stack$StackEnum.class,3、Java名字空间及访问规则,每个类都拥有自己的名字空间,即指类及其方法和变量可以在一定的范围内知道彼此的存在,可以相互使用。对类而言: abstract类:不能直接产生属于这个类的对象; final类:不能被其他任何类所继承(安全的考虑); public类:不但可以被同一程序包(package)中的其它类使用,别的程序包中的类也可以使用; friendly类(缺省,包访问类):只能被本程序包中的其它类使用,不能被别的程序包中的类使用。,当一个类可以被访问时,对类内的成员变量和成员方法而言,其应用范围可以通过施以一定的访问权限来限

25、定。 同一个类中 同一个包中 不同包中的子类 不同包中的非子类(任意类) private default protected public ,3、Java名字空间及访问规则,3、Java名字空间及访问规则,public: 任何其它类、对象只要可以看到这个类的话,那么它就可以存取变量的数据,或使用方法。 protected:同一类,同一包可以使用。不同包的类要使用,必须是该类的子类。 private:不允许任何其他类存取和调用。 friendly(default,前边没有修饰字的情况):在同一程序包中出现的类才可以直接使用它的数据和方法.,当子类中的变量名与父类的相同,父类的变量被遮盖。,3、J

26、ava名字空间及访问规则,3、Java名字空间及访问规则 final:到此为止,final在类之前 表示该类是最终类,不能再被继承。 final在方法之前 表示该方法是最终方法,该方法不能被任何派生的子类覆盖。 final在变量之前 表示变量的值在初始化之后就不能再改变;相当于定义了一个常量。,static 在变量或方法之前,表明它们是属于类的,称为类方法(静态方法)或类变量(静态变量)。若无static修饰,则是实例方法和实例变量。,类变量在各实例间共享,class ABCD char data; static int share_data; class Demo ABCD a,b,c,d;

27、 ,3、Java名字空间及访问规则 static:类变量和类方法,类变量的生存期不依赖于对象,相当于C语言中全局变量的作用。其它类可以不用通过创建该类的实例,直接通过类名访问它们。,public class StaticVar public static int number 5; public class OtherClass public void method() int x = StaticVar.number; ,3、Java名字空间及访问规则 static:类变量和类方法,static number =5; ,类方法则相当于C语言中的全局函数,其他的类也可以直接通过类名来访问类方法

28、。(Java程序的入口方法main()就是一个类方法),public class GeneralFunction public static int addUp(int x,int y) return x+y; public class UseGeneral public void method() int a = 9; int b =10; int c = GeneralFunction.addUp(a,b); ,3、Java名字空间及访问规则 static:类变量和类方法,同一个类的实例方法可以访问该类的类变量和类方法; 而类方法只能访问该类的类变量和类方法,不能直接访问实例的变量和方法。

29、,3、Java名字空间及访问规则 static:类变量和类方法,不正确的引用 class StaticError String mystring=“hello”; public static void main(String args) System.out.println(mystring); 编译时错误信息: nonstatic variable mystring cannot be referenced from a static context “System.out.println(mystring);”。 为什么不正确:只有对象的方法可以访问对象的变量。,3、Java名字空间及访问

30、规则 static:类变量和类方法,解决的办法 1. 将变量改成类变量 class NoStaticError static String mystring=“hello”; public static void main(String args) System.out.println(mystring); ,3、Java名字空间及访问规则 static:类变量和类方法,解决的办法 2. 先创建一个类的实例 class NoStaticError String mystring=“hello”; public static void main(String args) NoStaticErro

31、r noError; noError = new NoStaticError(); System.out.println(noError.mystring); ,3、Java名字空间及访问规则 static:类变量和类方法,4、Java中的抽象类、接口和程序包 抽象类与抽象方法,抽象类:用abstract关键字来修饰一个类时,该类叫做抽象类; 抽象类必须被继承。 抽象类不能被直接实例化。它只能作为其它类的超类,这一点与最终类(final类)正好相反。 抽象方法:用abstract来修饰一个方法时,该方法叫做抽象方法。 抽象方法必须被重写 抽象方法只有声明,不能有实现。 定义了抽象方法的类必须是

32、抽象类。 abstract returnType abstractMethod ( paramlist );,两个类Circle和Rectangle,完成相关参数的计算,class Rectangle public float width,height; Rectangle (float w, float h) width = w; /这里不需this height = h; public float area() return width*height; ,class Circle public float r; Circle(float r) this.r = r; /this指这个对象的

33、 public float area() return 3.14*r*r; ,4、Java中的抽象类、接口和程序包 抽象类与抽象方法,假设有若干个Circle,以及若干个Rectangle,希望计算它们的总面积,直截了当的做法是将它们分别放到两个数组中,用两个循环,加上一个加法,这种做法是不漂亮的。 如果还有其它形状:Triangle,Ellipses等,上述方法显得“累赘”。我们希望有一种统一的表示,例如用一个数组shape,接受所有的形状,然后用: for (i=0; i Collection, List,ArrayList,LinkedList,AbstractCollection,Ab

34、stractList,4、Java中的抽象类、接口和程序包 接口,java.util类包中的一些接口,由于Java编译器为每个类生成一个字节码文件,且文件名与类名相同,因此同名的类有可能发生冲突。为了解决这一问题,Java提供包来管理类名空间。 程序包相当于其它语言中的库函数。,4、Java中的抽象类、接口和程序包 程序包(类包),打包 Java中用package语句来将一个Java源文件中的类打成一个包。package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为: package pkg1.pkg2.pkg3; Java编译器

35、把包对应于文件系统的目录管理,package语句中,用 . 来指明目录的层次。,4、Java中的抽象类、接口和程序包 程序包(类包),package myclass.graphics; 这条语句指定这个包中的文件存储在目录 path/myclass/graphics 下。 包层次的根目录path是由环境变量CLASSPATH来确定的。,package myclass.graphics; class Square ; class Circle ; class Triangle ;,4、Java中的抽象类、接口和程序包 程序包(类包),Square.java,编译和生成包 在前面Square.ja

36、va中已定义了 myclass.graphics,编译时可以采用如下方式: javac -d destpath Square.java 则编译器会自动在destpath目录下建立子目录myclass/graphics ,并将生成的.class文件都放到destpath/ myclass/graphics下。 destpath应该是环境变量CLASSPATH中的一个。,4、Java中的抽象类、接口和程序包 程序包(类包),为了能使用Java中已提供的类,我们需要用import语句来引入所需要的类。 import package1.package2.(classname |*); 例如: import myclass.graphics.*; import java.io.*;,由环境变量CLASSPATH确定,4、Java中的抽象类、接口和程序包 程序包(类包),5、对象的构造方法,构造方法(Constructor)是一种特殊的方法。Java中的每个类都有构造方法,用来

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论