java概述课件08对象和类_第1页
java概述课件08对象和类_第2页
java概述课件08对象和类_第3页
java概述课件08对象和类_第4页
java概述课件08对象和类_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

1、1第 8 章 对象和类2引言学习过前几章的内容后,我们已经能够使用选择、循环、方法和数组解决很多程序设计问题这些java的特性还不足够用来开发图形用户界面和大型软件系统,假设希望开发一个gui(图形用户界面)该如何用程序实现它呢?3学习目标 描述对象和类,使用类来建模对象 (8.2节) 使用 uml 图形符号来描述类和对象 (8.2节) 演示如何定义类以及如何创建对象 (8.3节) 使用构造方法创建对象 (8.4节) 通过对象引用变量访问对象 (8.5节) 使用引用类型定义引用变量(8.5.1节) 使用对象成员访问操作符(.)来访问对象的数据和方法 (8.5.2节) 定义引用类型的数据域并给对

2、象的数据域赋默认值 (8.5.3节) 区分对象引用变量和基本类型变量的不同 (8.5.4节) 使用java类库中的date类、random 类和jframe 类(8.6节) 区分实例变量与静态变量、实例方法和静态方法的不同 (8.7节) 定义有恰当的get方法和set方法的私有数据域 (8.8节) 封装数据域以便于类的维护(8.9节) 开发带对象参数的方法,区分基本类型参数和对象类型参数的不同 (8.10节) 在数组中存储和处理对象 (8.11节)4面向对象编程概念面向对象程序设计 (oop) :使用对象进行程序设计对象( objects):代表现实世界中可以明确标识的一个实体例如:一个学生、

3、一张桌子、一个圆、一个按钮甚至一笔贷款都可以看作是一个对象每个对象都有一个独特的标识、状态和行为 5类对象具有状态和行为定义了对象,就定义了对象的状态和行为 class name: circle data fields: radius is _ methods: getarea circle object 1 data fields: radius is 10 circle object 2 data fields: radius is 25 circle object 3 data fields: radius is 125 a class template three objects of

4、 the circle class 6类java类使用变量定义数据域,使用方法定义动作除此之外,类还提供了一种称为构造方法(constructor)的特殊类型的方法,调用它可以创建一个新对象构造方法本身是可以完成任何动作的,但是设计构造方法的初衷还是为了完成初始化动作7类 class circle /* the radius of this circle */ double radius = 1.0; /* construct a circle object */ circle() /* construct a circle object */ circle(double newradius)

5、 radius = newradius; /* return the area of this circle */ double getarea() return radius * radius * 3.14159; data field method constructors 8uml 类图 circle radius: double circle() circle(newradius: double) getarea(): double circle1: circle radius = 1.0 class name data fields constructors and methods

6、circle2: circle radius = 25 circle3: circle radius = 125 uml class diagram uml notation for objects 9举例: 定义类和创建类目的:展示创建对象,访问数据,以及使用方法testcircle1run10举例: 定义类和创建类目的:展示创建对象,访问数据,以及使用方法testtvruntv11构造方法构造方法circle() circle(double newradius) radius = newradius;构造函数是一种特殊的方法,用来构造对象。12构造方法,续构造方法的作用是初始化对象构造方法

7、名必须和类名相同 构造方法没有返回类型,甚至连void也没有 构造方法在创建一个对象时,使用new操作符调用13使用构造方法构造对象new classname();例:new circle();new circle(5.0); 14默认构造方法一个类可以不定义构造方法,在这种情况下,类中隐含定义一个方法体为空的无参构造方法这个构造方法称为默认构造方法当且仅当类中没有明确定义任何构造方法时才会自动提供它15通过对象引用变量引用一个对象,分配对象的引用变量声明一个引用变量,使用语法:classname objectrefvar;例:circle mycircle;16声明/创建对象:一步完成cla

8、ssname objectrefvar = new classname();例:circle mycircle = new circle();创建对象分配对象引用 17访问对象 引用对象的数据 objectrefvar.data 例:mycircle.radius 调用对象的方法 objectrefvar.methodname(arguments) 例: mycircle.getarea()18跟踪代码circle mycircle = new circle(5.0);scircle yourcircle = new circle();yourcircle.radius = 100;声明myc

9、ircleno valuemycircle19跟踪代码, 续。circle mycircle = new circle(5.0);circle yourcircle = new circle();yourcircle.radius = 100; : circle radius: 5.0 创建circleno valuemycircle20跟踪代码, 续。circle mycircle = new circle(5.0);circle yourcircle = new circle();yourcircle.radius = 100; : circle radius: 5.0 reference

10、 value将对象引用分配给mycirclemycircle21跟踪代码, 续。circle mycircle = new circle(5.0);circle yourcircle = new circle();yourcircle.radius = 100; : circle radius: 5.0 no valueyourcircle声明 yourcirclereference valuemycircle22跟踪代码, 续。circle mycircle = new circle(5.0);circle yourcircle = new circle();yourcircle.radiu

11、s = 100; : circle radius: 5.0 : circle radius: 0.0 创建一个新 circle 对象reference valuemycircleno valueyourcircle23跟踪代码, 续。circle mycircle = new circle(5.0);circle yourcircle = new circle();yourcircle.radius = 100; : circle radius: 5.0 : circle radius: 1.0 将对象引用分配给yourcirclereference valuemycircleyourcirc

12、lereference value24跟踪代码, 续。circle mycircle = new circle(5.0);circle yourcircle = new circle();yourcircle.radius = 100; : circle radius: 5.0 : circle radius: 100.0 改变yourcircle半径reference valuemycircleyourcirclereference value25注意 回想一下,我们曾使用:math.methodnamemethodname(参数) (例如: math.pow(3, 2.5) 来调用 mat

13、h 类中的方法。 那么能否用 circle1.getarea()来调用getarea() 方法呢? 答案是不能。 本章之前所有的方法是静态方法,使用静态定义的关键字static,然而getarea()方法非静态,它必须用一个对象调用:objectrefvar.methodname(参数)(例如: mycircle.getarea()26引用数据域数据域也可能是引用型的。例如:下面的student类包含一个string类型的name数据域,string是一个预定义的java类。public class student string name; / name has default value n

14、ull int age; / age has default value 0 boolean issciencemajor;/issciencemajor has default value false char gender; / c has default value u000027 null 值如果一个引用类型的数据域没有引用任何对象,那么这个数据字域就有一个特殊的java值,null28数据域的默认值引用类型数据域的默认值是null,数值类型数据域的默认值是0,boolean类型数据域的默认值是false,而char类型数据域的默认值是 u0000 。但是java没有给方法中的局部变量

15、赋默认值。public class test public static void main(string args) student student = new student(); system.out.println(name? + ); system.out.println(age? + student.age); system.out.println(issciencemajor? + student.issciencemajor); system.out.println(gender? + student.gender); 29例如public class

16、test public static void main(string args) int x; / x has no default value string y; / y has no default value system.out.println(x is + x); system.out.println(y is + y); compilation error: variables not initializedjava没有给方法中的局部变量赋默认值。30基本类型变量和引用类型变量的区别 1 primitive type int i = 1 i object type circle

17、c c reference created using new circle() c: circle radius = 1 31基本类型变量和引用类型变量的赋值 i primitive type assignment i = j before: 1 j 2 i after: 2 j 2 c1 object type assignment c1 = c2 before: c2 c1 after: c2 c1: circle radius = 5 c2: circle radius = 9 c1: circle radius = 5 c2: circle radius = 9 32垃圾回收如图所示

18、,执行完赋值语句c1=c2之后,c1指向c2所指的同一个对象c1以前引用的对象就不再有用,因此,它现在就成为垃圾(garbage)垃圾会占用内存空间,java运行系统会检测垃圾并自动回收它所占的空间,这个过程称为垃圾回收(garbage collection)。 c1 object type assignment c1 = c2 before: c2 c1 after: c2 c1: circle radius = 5 c2: circle radius = 9 c1: circle radius = 5 c2: circle radius = 9 33垃圾回收,续。提示:如果我们认为不再需要

19、某个对象,就可以显示的给该对象引用变量赋null值如果某对象没有被任何引用变量所引用,java虚拟机将自动回收它所占的空间。 34date 类java提供了一个系统的封装java.util的日期和时间的日期类。您可以使用date类创建一个实例为当前日期和时间,并使用它的tostring方法返回的该日期和时间以字符串的形式。 java.util.date +date() +date(elapsetime: long) +tostring(): string +gettime(): long +settime(elapsetime: long): void constructs a date ob

20、ject for the current time. constructs a date object for a given time in milliseconds elapsed since january 1, 1970, gmt. returns a string representing the date and time. returns the number of milliseconds since january 1, 1970, gmt. sets a new elapse time in the object. the + sign indicates public m

21、odifer 35 date 类举例例如,代码: java.util.date date = new java.util.date();system.out.println(date.tostring();显示一个字符串:sun mar 09 13:50:19 est 200336random 类我们可以使用math.random()获取一个0.0到1.0(不包括1.0)之间的double值,另一种产生随机数的方法是使用java.util.random()类。 java.util.random +random() +random(seed: long) +nextint(): int +nex

22、tint(n: int): int +nextlong(): long +nextdouble(): double +nextfloat(): float +nextboolean(): boolean constructs a random object with the current time as its seed. constructs a random object with a specified seed. returns a random int value. returns a random int value between 0 and n (exclusive). re

23、turns a random long value. returns a random double value between 0.0 and 1.0 (exclusive). returns a random float value between 0.0f and 1.0f (exclusive). returns a random boolean value. 37random 类示例如果两个random对象有相同的种子,那它们将产生相同的数列。例如:下面的代码都用相同的种子3来产生两个random对象。random random1 = new random(3);system.out

24、.print(from random1: );for (int i = 0; i 10; i+) system.out.print(random1.nextint(1000) + );random random2 = new random(3);system.out.print(nfrom random2: );for (int i = 0; i 10; i+) system.out.print(random2.nextint(1000) + );from random1: 734 660 210 581 128 202 549 564 459 961 from random2: 734 66

25、0 210 581 128 202 549 564 459 96138显示 gui 组件开发程序创建图形用户界面时,将会用到像jframe jbutton、jradiobutton、jcombobox和jlist这样的java类来创建框架、单选按钮、组合框、列表,等。下面是一个示例,该示例用jframe创建两个窗体。testframerun39跟踪代码jframe frame1 = new jframe(); frame1.settitle(window 1); frame1.setsize(200, 150); frame1.setvisible(true); jframe frame2 =

26、 new jframe(); frame2.settitle(window 2); frame2.setsize(200, 150); frame2.setvisible(true); 声明、创建和分配一个框架。referenceframe1: jframetitle: width:height:visible:40跟踪代码jframe frame1 = new jframe(); frame1.settitle(window 1); frame1.setsize(200, 150); frame1.setvisible(true); jframe frame2 = new jframe();

27、 frame2.settitle(window 2); frame2.setsize(200, 150); frame2.setvisible(true); referenceframe1: jframetitle: window 1width:height:visible:设置标题属性41跟踪代码jframe frame1 = new jframe(); frame1.settitle(window 1); frame1.setsize(200, 150); frame1.setvisible(true); jframe frame2 = new jframe(); frame2.setti

28、tle(window 2); frame2.setsize(200, 150); frame2.setvisible(true); referenceframe1: jframetitle: window 1width: 200height: 150visible:设置尺寸属性42跟踪代码jframe frame1 = new jframe(); frame1.settitle(window 1); frame1.setsize(200, 150); frame1.setvisible(true); jframe frame2 = new jframe(); frame2.settitle(w

29、indow 2); frame2.setsize(200, 150); frame2.setvisible(true); referenceframe1: jframetitle: window 1width: 200height: 150visible: true设置是否可见属性43跟踪代码jframe frame1 = new jframe(); frame1.settitle(window 1); frame1.setsize(200, 150); frame1.setvisible(true); jframe frame2 = new jframe(); frame2.settitle

30、(window 2); frame2.setsize(200, 150); frame2.setvisible(true); referenceframe1: jframetitle: window 1width: 200height: 150visible: truereferenceframe2: jframetitle:width:height:visible:声明、创建和分配另一个框架44跟踪代码jframe frame1 = new jframe(); frame1.settitle(window 1); frame1.setsize(200, 150); frame1.setvis

31、ible(true); jframe frame2 = new jframe(); frame2.settitle(window 2); frame2.setsize(200, 150); frame2.setvisible(true); referenceframe1: jframetitle: window 1width: 200height: 150visible: truereferenceframe2: jframetitle: window 2width:height:visible:设置标题属性45跟踪代码jframe frame1 = new jframe(); frame1.

32、settitle(window 1); frame1.setsize(200, 150); frame1.setvisible(true); jframe frame2 = new jframe(); frame2.settitle(window 2); frame2.setsize(200, 150); frame2.setvisible(true); referenceframe1: jframetitle: window 1width: 200height: 150visible: truereferenceframe2: jframetitle: window 2width: 200h

33、eight: 150visible:设置尺寸属性46跟踪代码jframe frame1 = new jframe(); frame1.settitle(window 1); frame1.setsize(200, 150); frame1.setvisible(true); jframe frame2 = new jframe(); frame2.settitle(window 2); frame2.setsize(200, 150); frame2.setvisible(true); referenceframe1: jframetitle: window 1width: 200height

34、: 150visible: truereferenceframe2: jframetitle: window 2width: 200height: 150visible: true设置是否可见47窗口中添加 gui 组件我们可以给窗口添加按钮、标签、文本域、复选框和组合框这样的组件组件是使用类来定义的下面是一个示例来创建按钮、标签、文本域、复选框、单选按钮、组合框guicomponentsrun48实例变量和方法实例变量属于一个特定的实例调用类中方法的一个实例49静态变量、常量和方法静态变量被类的所有实例共享静态方法不绑定到一个特定的对象静态常量是最终变量,被类的所有实例共享要声明一个静态变量

35、或定义一个静态方法,就要在这个变量或方法的声明中使用修饰符static50静态变量、常量和方法,续 circle radius: double numberofobjects: int getnumberofobjects(): int +getarea(): double 1 radius circle1 radius = 1 numberofobjects = 2 instantiate instantiate memory 2 5 radius numberofobjects uml notation: +: public variables or methods underline:

36、static variables or methods circle2 radius = 5 numberofobjects = 2 after two circle objects were created, numberofobjects is 2. 51使用实例变量、类变量和方法示例 目的:显示实例和类变量的使用。这个示例用一个类变量numberofobjects跟踪circle对象创建的数量。testcircle2runcircle252可见性修饰符和访问器/修改器方法默认情况下类、方法和数据域是可以被同一个包中的任何一个类访问的。 public类、数据或方法可被任一包 的类访问 pr

37、ivate 数据或方法只能在它自己的类中访问 get 和 set 方法通常用来读取和修改私有数据域53私有的修饰符将访问权限限定在它自己的类内,默认修饰符将访问权限限定在包内,而公共的修饰符没有限定权限。 public class c1 public int x; int y; private int z; public void m1() void m2() private void m3() public class c2 void amethod() c1 o = new c1(); can access o.x; can access o.y; cannot access o.z; c

38、an invoke o.m1(); can invoke o.m2(); cannot invoke o.m3(); package p1; package p2; public class c3 void amethod() c1 o = new c1(); can access o.x; cannot access o.y; cannot access o.z; can invoke o.m1(); cannot invoke o.m2(); cannot invoke o.m3(); class c1 . public class c2 can access c1 package p1;

39、 package p2; public class c3 cannot access c1; can access c2; 54注意一个对象不能访问私有成员,如(b)所示。但是,如果是自己的类中声明的对象,是可以的,如(a)所示。 public class foo private boolean x; public static void main(string args) foo foo = new foo(); system.out.println(foo.x); system.out.println(foo.convert(); private int convert(boolean b) return x ? 1 : -1; (a) this is ok because object foo is used inside the foo class public class test public static void main(string args) foo foo = new foo(); system.out.println(foo.x); system.out.println(foo.convert(foo.x); (b) this is wrong because

温馨提示

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

评论

0/150

提交评论