java程序设计6对象和类_第1页
java程序设计6对象和类_第2页
java程序设计6对象和类_第3页
java程序设计6对象和类_第4页
java程序设计6对象和类_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

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

文档简介

1、Java第六章:类和对象1学习目标:理解类和对象的概念及两者间的区别掌握类的定义以及类之间的关系描述,认识对应的UML基本图示理解构造方法的作用,能够使用new运算符实例化一个对象理解对象的引用,掌握通过变量名访问引用对象的成员变量和方法理解并掌握变量的作用域理解关键字this的用法掌握static的作用理解并掌握方法的声明和调用理解包的概念并掌握包的作用6.1.1 面向对象的基本概念什么是对象在面向对象的方法学中,“对象”是现实世界的实体或概念在计算机逻辑中的抽象表示。对象的最主要特点是以数据为中心,它是一个集成了数据和其上操作的封装。封装隐藏了类的内部实现细节,强制类的使用者通过规定的接口

2、访问对象,提高了代码的可维护性。对象是具有唯一对象名和固定对外接口的一组属性和操作的集合,用来模拟组成或影响现实世界问题的一个或一组因素。过程式的程序=算法+数据;面向对象的程序=对象+消息。6.1.2 类和对象 对象对象就是组成现实世界的个体,他们之间存在着错综复杂的关系,正是这种关系的存在构成了丰富多彩的世界。面向对象的分析一些对象具有相似的特征一些对象之间有相互作用就是要把这些对象以及对象之间的关系找出来。类分析这些个体,可以把他们归纳为不同的类型,例如学校里的课程、银行中的业务等。这种利用归纳的方法将个体分类的过程实质上就是面向对象技术中的创建类的过程。类是对一组有相同特性(属性)和相

3、同行为(方法)的对象的抽象。6.2使用JDK的类表6-1 JDK的一些包包作用java.lang包含Java语言的基础类,无需用import加载java.lang.reflect提供类和接口,以获取关于类和对象的反射信息java.io通过数据流、序列化和文件系统提供系统输入和输出java.text提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口java.util包含集合框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)java.util.concurrent 在并发编程中很常用的实用工具类提供网络编

4、程的类和接口javax.swing提供支持SwingGUI组件的类。java.sql提供有关数据库访问的接口和类实例一:使用Math类/程序6-1:一个利用Math类产生随机数的程序public class RandomDemo public static void main(String args) for(int i=0;i10;i+) /利用random方法产生一个0.0到1.0之间的随机数 double r=Math.random(); System.out.println(本次产生的随机数是:+r); 实例二:讨论: double r=Math.random();在应用模式上和上面的

5、程序有何不同/程序6-2:一个窗口程序import javax.swing.JFrame;public class FrameDemo public static void main(String args) JFrame frm=new JFrame(我的窗口程序);frm.setSize(400, 300);frm.setVisible(true); 图6-1 变量声明和变量所引用的对象6.3创建自己的类在Java语言中,要想表示对象,首先必须有对象所属的类存在,无论这个类是J2SDK开发包提供的、第三方提供的或者就是开发人员自己定义的。 类封装了一组对象的公共属性和方法6.3.1类的结构

6、一个类的定义import java.util.Date;public class Student /首先定义该类对象的属性 private String id; private String name; Date birthDate; /定义构造函数,一个类可以有多种构造对象的方法 public Student() . /以下开始定义该类对象的方法 public void addAcademicRecord(AcademicRecord ar) . 6.3.1类的结构(cont.)类的修饰符class 类名 extends 父类名 implements接口名 修饰符 类型成员变量1; 修饰符

7、类型成员变量2; static /类初始化块 构造函数1(参数1, 参数2, ) 函数体; 构造函数2(参数1, 参数2, ) 函数体; 修饰符 类型成员方法1(参数1, 参数2, ) throws 异常列表 方法体; 修饰符 类型成员方法2(参数1, 参数2, ) throws 异常列表 方法体; 6.3.1类的结构(cont.)类的表示在UML中符号,+、-分别表示public、private、protected修饰符6.3.2声明一个自定义类一些类声明的实例简单类class Student 可被任一其它类访问的类-publicpublic class Student 一个不可被继承的最终

8、类-finalpublic final class Student 一个抽象的类-abstractpublic abstract class Student 一个继承了父类Student的类- extendspublic class Postgraduate extends Student 一个继承了父类Student,并且实现了一个接口的类public class Postgraduate extends Student implements TakeTactics 6.3.3为类添加成员变量属性用于描述对象状态 (保存对象的信息)访问权限修饰符 类型 变量名;访问权限修饰符 类型 变量名

9、=初值;访问权限修饰符 类型 变量名 =初值 ,变量名 =初值;public class Student String id; public String name; public char gender=M; private Date birthDate; private List academicRecordList;public class Account String id; /一个String类型的账户唯一性表示 private String name; /账户所有人的姓名 private int balance; /用整数表示的该账户的当前余额6.3.3属性声明(cont.)6.3

10、.3属性声明(cont.)1. 访问控制范围修饰符一个类所定义的属性被其他对象访问所加的限制2 属性的访问对可直接访问的类属性可以通过“类名.类属性”访问,如System.out,也可通过“对象引用名.类属性名”访问;对可直接访问的对象属性可以通过“对象引用名.属性名”访问;在声明类时,一般为那些需要进行存取访问的属性定义对应的getXxx()、setXxx()方法用来对属性的存取访问,而不是直接访问属性值;public class Student private String name; public String getName() return ; public void setName

11、(String name) 封装和信息隐藏问题的提出:如下例:public class Person public int age;public String name;客户端程序可以直接访问内部的数据:p1.age = -30;/错误的年龄 = “Mike”;封装和信息隐藏(c.)为了实现良好的封装性,我们通常将类的成员变量声明为private,再通过特定的方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个是getXxx()(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另一个是setXxx()用来对这个成员变量赋值

12、,可以加一些控制代码,使其合法性。 一个类通常就是一个小的模块,让模块公开必须要让外界知道的内容,而隐藏其它的内容。我们在进行程序的详细设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)。 Java名字空间及访问规则public: 任何其它类、对象只要可以看到这个类的话,那么它就可以存取变量的数据,或使用方法。protected:同一类,同一包可以使用。不同包的类要使用,必须是该类的子类。private:不允许任何其他类存取和调用。(default,前边没有修饰字的情况):在同一程序

13、包中出现的类才可以直接使用它的数据和方法.变量作用域/程序6-3:变量的作用域public class TestScope int x; public static void main(String args) int x = 12; int q = 96; / x和q都可用 int x = 3;/错误的定义,Java中不允许有这种嵌套定义 System.out.println(x is +x); System.out.println(q is +q); q = x; /* 错误的行,只有x可用, q 超出了作用域范围 */ System.out.println(x is +x); publi

14、c int getX() return x; /返回的是实例的成员变量x的值 6.3.4为类添加方法方法方法是自包含的有名代码块,并且具有可重用的特性。方法由对象通过调用方法名得到执行,一些方法有某种类型的返回值,一些没有。有返回值的方法通常在表达式中被调用,作为表达式的一部分参与运算;而没有返回值的方法通常在调用语句中被调用,使它完成某种功能。 方法调用System.out.println(Welcome!);int max=Math.max(10,20); 1、方法声明修饰符 方法返回类型 方法名 (类型 参数1, 类型 参数2, ) throws 异常列表 方法体; 2、向类中添加方法方

15、法要完成什么样的功能。完成何种功能需要对应的数据结构和算法可以实现它,例如上面的取款方法withdraw(),它的功能是将账户的余额减少指定的金额,因此修改代表账户对象余额的成员变量balance。方法运行是否需要参数。一些方法运行需要调用者传递参数,这个参数被称为“实参”。在方法声明时,为了接收这些实参,就需要事先声明一些参数对应他们。方法是否有返回值。3.方法调用调用对象方法的过程很简单,可以直接通过对象名用成员运算符来访问。没有返回值的方法调用:System.out.println(Welcome!);有返回值的方法调用:int max=0;max=Math.max(10,20); /调

16、用比较最大值的方法,返回其中的最大值方法调用尤其需要注意方法的:返回值、方法名,需要调用者提供的参数6.3.4 定义方法(cont.)4. 形参和实参某些方法在执行时,需要接收一些外部的值,对象在执行这些方法时,就需要把这些值传递到方法代码中,这就需要一个传递的通道。这个通道就是利用声明方法时定义的形式参数列表,如图6-2中的定义。位于方法名后括号里的形式参数指定了执行方法需要的值的个数和类型,那么在实际执行时,就需要按照声明的要求(类型、顺序、个数)提供确定的值,这个实际执行时,传递到方法的值称为实际参数,它可以用常量表示,也可以用变量表示,变量既可以是基本类型,也可以是引用类型。6.3.4

17、 定义方法(cont.)值传递和引用传递形式参数定义了接收执行时传递过来的值,但是对于基本类型和引用类型,有本质的区别。用基本类型的变量向被调用方法的形式参数传值后,两个变量之间不会发生联系,各自拥有各自的值,其后可以独立变化 用对象变量向被调用方法的形式参数传值后,两个对象变量指向同一对象,是一个对象的两个名字。注:某些资料上说,Java只有值传递,是因为把变量保存的对象引用视为正常的值。/程序6-5:一个能够对账户进行转账的程序public class BankService /转账业务,从src向dest对象转amountpublic void transfer(Account src,

18、Account dest,int amount)src.withdraw(amount);dest.deposit(amount); public static void main(String args) Account a1=new Account(001,鲁宁,1000); Account a2=new Account(002,梁丽,800); BankService bs=new BankService(); bs.transfer(a1, a2, 100); System.out.println(鲁宁还有+a1.getBalance(); System.out.println(梁丽还

19、有+a2.getBalance(); 返回值及方法类型方法的返回值有两种类型,一种有返回值,一种没有。没有返回值的可以直接构成调用语句,如System.out.println(),而有返回值的则可以构成表达式的一部分,参与运算。return 表达式;/返回一个账户的当前余额 public int getBalance() return this.balance; return ;public void transfer(Account src,Account dest,int amount)src.withdraw(amount);dest.deposit(amount);使用returnre

20、turn 表达式;return;注意:当一个方法的返回值类型是非void类型时,必须在方法体内,用return 返回对应的类型的值。6.3.5方法重载方法重载(OverLoading)方法的名称、形式参数的类型和次序、个数形成了方法的签名特征,一个类中不允许出现签名完全相同的方法声明。注:方法的返回值类型不是决定方法区别的因素。Java语言允许用相同的方法名定义类中若干个成员方法,只要每个方法有自己唯一的一组形式参数,这种现象成为方法重载,例如:System.out.println(Welcome!); /输出一个字符串System.out.println(intNumber); /输出一个整

21、数System.out.println(floatNumber); /输出一个单精度实数 System.out.println(student); /输出一个student对象 6.3.6构造方法1 构造方法构造方法有和类名相同的名称,而且不返回任何数据类型。并且不可被继承,也不抛出异常构造方法在对象一产生出来后会被编译器自动调用声明构造方法的目的就是用实例初始化,它可以像方法一样向构造方法传递参数。语法形式 (参数表) 构造方法有两个特征区别于方法:构造方法从无返回值,不可以为其指定任何类型的返回值,包括void。构造方法的名称总是和类名保持完全一致。一个类中可以有多个构造方法,其参数声明不

22、同(重载)2 默认的构造方法当一个类没有明确的构造函数Student student=new Student();3 使用构造方法创建对象,如 new ParaSample()、new Integer(5),必须清楚一个类定义了那些构造方法。一个构造方法如果需要调用同类中的另一个构造函数或者是父类的构造函数,则只能在第一条语句调用,例如:this();super()缺省的构造方法默认的构造方法当一个类没有明确的构造方法每个类至少有一个构造方法。 如果程序中没有为一个类定义构造方法,编译器自动产生一个默认的构造方法,这个构造方法不带参数并且为空。它和方法一样,也可以重载,根据参数的个数和类型,编

23、译器会自动选择合适的构造方法。 如果在类中定义了构造方法,编译器就不再产生默认构造方法。6.4 对象对象三要素对象的名称(标识符)表现对象状态的属性集展示对象能力的行为集 对象的符号对象的简化符号6.4.1 对象对象是通过某个时刻某个客观存在的状态集来表现的。世界上没有恒存的事物,所以对象也具备从创建到消亡的生存周期。一个对象只有被创建出来,才具备生命力,当它达到某个条件,便归于消亡。6.4.2 对象的生存周期(cont.)1.声明修饰符 类型 变量名 =初值,变量名=初值Student student = null; 创建类的实例-对象使用new运算符,调用构造方法创建对象实例Account

24、 a2=new Account(001,鲁宁,1000);Student student = new Student(18052301);注:对象引用变量的声明和一般变量的声明没有任何区别,可能出现的位置都是一样的。 1 创建对象利用new运算符创建student=new Student(0625001);利用类本身提供的方法Calendar today= Calendar.getInstance(); 创建对象的过程: 第一步:为新对象分配空间并初始化为默认值。第二步,执行显式的初始化。 第三步,执行构造器。new方法的括号中的参数传递给构造器(“”):最后,该变量被赋值为对堆内存中新对象的

25、引用。使用构造函数6.4.1对象的生存周期(cont.)栈与堆-保存对象的位置Java将它的内存空间分为两部分:一种叫栈内存,一种叫堆内存。局部变量与方法都是在栈内存中定义和分配的。堆内存是通过new关键字产生的数组和对象都分配在堆内存中,堆内存中分配的空间由JVM的自动垃圾回收器来管理。以后在程序中直接使用栈中的变量来访问堆中的数组或对象引用变量的赋值Person p1 = new Person(“zhangsan”, 30); Person p2 = p1; Person p1 = new Person(“zhangsan”, 30);Person p2 = new Person(“wan

26、gyong”,32); 6.4.2 对象的生存周期(cont.)2.使用对象获得对象的属性值、调用对象的方法,必须通过一个名字才可以使用。如: System.out.println(“Welcome!”); student.showAcademicRecord();/这句代码意思是告诉对象student,执行showAcademicRecord(),列出student这个对象的学业成绩。 成员访问运算符(.)可以访问那些访问修饰符非private的成员对于那些访问修饰符为private的属性,就不能直接访问信息隐藏 通过对象引用某个方法时,无论该方法是否需要传递参数,都要在调用方法名时在后面加

27、上括号,表示方法调用 通过对象引用使用对象的属性和方法通过引用名访问那些访问修饰符非private的成员利用临时对象访问那些访问修饰符非private的成员对于那些访问修饰符为private的属性,不能直接访问通过名称引用对象的某个方法时,无论该方法是否需要传递参数,都要在调用方法名时在后面加上括号,表示方法调用6.4.2 对象的生存周期(cont.)引用临时对象int areaOfRectangle = new Rectangle(100, 50).area(); 应该先执行new Rectangle(100, 50),虚拟机会生成一个临时对象引用,然后调用该对象的area(),计算area

28、,最终将area的值赋值给整型变量areaOfRectangle。 6.4.2 对象的生存周期(cont.)3 消亡objectReference = null; 垃圾回收System.gc();/ 对象消亡处理- finalize()protected void finalize() /* * 此处可放有关该对象被删除时刻,应该执行的代码。 * 例如连接池对象在释放时,应该检查所有的连接是否已经关闭等。 */ JVM heap中不同对象存在区域(generation)的位置6.4.3 thisthis每个类可以创造多个对象,每个对象的每个实例方法都拥有一个this变量指向对象自己,供自己的方

29、法内部代码中使用,可以通过this,获得当前对象的属性值,也可以调用自身对象的其它方法例如public class Person String name; Person(String name) =name; 6.4.4实例运算符的作用实例运算符instanceof public class TestInstanceof public static void main(String args) Student student =new Student();/判断student是否是Student的实例boolean res = student instanceof Student;if(res

30、)/如果是Student类型else/如果不是Student类型6.4.5对象特性及对象间的关系封装对象之间的关系消息、组合和聚合类1.封装对于软件世界,对象就是一个由属性集和方法集构成的独立存在。在面向对象领域中把这种构成称为封装(Encapsulation),封装技术带来的直接优势就是信息隐藏(Information-hiding)和模块化(Modularity),就是在进行设计时所追求的低耦合、高内聚。对象封装通过访问控制修饰符的限定,决定了信息的批露范围,减少了由于直接访问而造成的不当修改和引用,而且对象本身是一个独立的实体,内部的运行过程外界无法直接控制,因此模块化的程度进一步得到了

31、提高。 一个封装的例子class Student String name; String speciality; private date birthdate; Date enrollDate; public getAge( ) /public 可以换为private ,proetcted int age=0; 。/计算年龄,保存到age中 return age; public List getScores() . 2 对象之间的关系对象间的关系包括在结构上的关联和聚合,在协作上的消息传递机制关联关联关系提供了给定类的对象之间的一个链接,需要相互通信的对象可以使用这种链接。对象之间的消息一般就

32、是沿着关联关系发送的。 关联关系是一种弱链接,对象可以是小组或家庭的一部分,但他们不完全相互依赖。一个关联的例子class Company class Employee Company aCompany; String name; 另一个关联的例子(关联类)关联的多重性 关联是有方向性 class StudyPrograme Student aStudent; Course aCourse; String semester; int mark;聚合和组合 聚合则表示把对象组合在一起,变成一个更大的对象。这种包含关系就像整体和部分关系。这种包含关系可以是强的(值聚合)或弱的(引用聚合),在UML

33、中,值聚合称为组合,而引用聚合则称为聚合。或者更简单的区别就是如果一个整体对象被删除,那么其部分对象是否也同时不再存在。 消息 消息包含了接收对象名称、要求的服务(方法名)、传递的参数这些信息,消息的处理过程依赖于对象。 class CarClass Driverdrive(Car acar)Car getCar()会车( ) /对另一辆车发出信号课堂作业:设想一下你的超市购物付款的经历,如果让你描述那样的环境,你会概括出什么样的类, 请描述他们的结构(属性和方法,以及他们之间的关系)。6.5 static Static的作用共享数据共享操作类初始化6.5.1类初始化块类初始化块在讲构造函数的

34、时候,提到构造函数通常是对象在被创建时执行某些初始化的工作,那么,类在初次加载到内存的时候,如果希望也能执行一些初始化的工作,应该如何实现呢?答案就是:应该把类加载时执行的代码放在初始化块中。在Java中,初始化块是放在一个如下格式的大括号()中:static 它在类体当中存在的位置是独立的,可以放在任何合适的位置。这个初始化块和构造函数不一样的地方是它没有函数名,也没有访问控制修饰符,只有一个static来表明它的作用。而且,该初始化块只是在类加载时被执行一次,而且只被执行一次。其代码执行优先于对象创建。6.5.2 static成员变量(共享数据)共享数据public class MathU

35、til /定义了一个类静态常量PIpublic static final double PI=3.1415926;这个PI被static修饰后,要想使用,必须通过“类名.类成员变量名这种方法使用。其它例子如前面程序经常使用的System.out.println(),out是System类的一个类成员,其类型是PrintStream ,所以就通过类名System就直接引用了。再比如,Integer.MAX_VALUE则表示的是一个整型类能够表示的最大数。 6.5.3 static方法(共享操作)共享操作static修饰的方法是一个属于类所有的方法,这种方法被称为类方法,可以通过“类名.方法名()

36、”来调用。注意类方法中不能出现引用本类中定义的对象成员变量的语句;类方法中不能调用本类中定义的对象方法;在类方法中不能使用super、this这些用于实例的关键字。/程序6-11:static成员方法的应用public class Circle public static final double PI=3.1415926;/类成员变量/构造方法,之所以定义为私有,是因为不希望用new运算符创建实例。private Circle() super();public static double getArea(double r)return PI*r*r;public static void ma

37、in(String args) System.out.println(半径为10的圆面积是+Circle.getArea(10);System.out.println(半径为8的圆面积是+Circle.getArea(8);6.5.4 static加载import staticJava SE 5.0开始引入了“import static”机制,借助这一机制,可以省略掉所在的类或接口名的方式,来使用静态成员,这样可以简化代码的书写。/程序6-12: 一个使用import static的程序import static java.lang.Math.random;public class Rando

38、mDemo public static void main(String args) for(int i=0;i10;i+) /利用random方法产生一个0.0到1.0之间的随机数 double r=random(); System.out.println(本次产生的随机数是:+r); 课堂练习类和对象的区别构造函数和普通方法的区别是什么方法的签名包含哪些内容重载的特征是什么值传递和引用传递的区别是什么课堂练习(cont.)一个类public class Foo int i; static String s; void imethod() static void smethod() 设f是F

39、oo的一个实例,则下述语句正确吗?System.out.println(f.i);System.out.println(f.s);f.imethod();f.smethod();System.out.println(Foo.i);System.out.println(Foo.s);Foo.imethod();Foo.smethod();课堂练习(cont.)类之间的关系有聚合、关联等类型,请画出下面类之间的关系。公司和雇员课程和师资房子和窗户书架和书课堂练习(cont.)写一个名为Rectangle的类表示矩形,有三个属性width和height和颜色color, width和height是d

40、ouble型的,而color是String型的,假定所有矩形颜色相同。要求提供属性访问方法和一个计算矩形面积的方法getArea()的方法,通过构造函数提供width和height值。写一个程序测试该类,验证面积计算方法的正确性。课堂练习(cont.)一个Fan有自己的品牌和型号,其功能有start,stop,speed,start和stop可以改变Fan的状态status(on/off),speed可以调整Fan的速度(档级在0、1、2、3),请分析并提供一个类的定义。 6.6 包包是有着唯一命名的类的集合,它将开发者认为相关的类分组管理,实际上Java中所有的类都在一个具体的包中。在逻辑上

41、,包就是把相关的类组合在一起管理。在物理上,包就是目录,相关的类归类放在某个目录下。package 语句的基本语法:package.;例子:package shipping.reports;指定包的声明在源文件的开始;每个源文件只能有一个包的声明;如果没有包的声明;类属于缺省的包(没有名字,包括所有没有声明包的类);包的名称必须是由等级的且由.分隔。例如:在jdk软件包中,如日期类、格式化类等都在java.util包下,而基本语言类都在java.lang下,输入输出类都在java.io下。一般项目中公用类库,可以放在mon下,com通常代表公司,common代表公共类,这是两级目录,com是一

42、级,common是第二级。 Java类库中的几个重要包:java.lang包含一些形成语言核心的类,如String、Math、Integer和Thread。java.awt包含了构成抽象窗口工具包(AWT)的类,这个包被用来构建和管理应用程序的图形用户界面。java.applet包含了可执行applet特殊行为的类。包含执行与网络相关的操作的类和处理接口及统一资源定位器(URLs)的类。java.io包含处理I/O文件的类。java.util包含为任务设置的实用程序类,如随机数发生、定义系统特性和使用与日期日历相关的函数。一个开发假定:实例操作系统:windows系列源程序所在位置:D:javademosrc (注:此目录将被称为源程序根目录-)class文件所在根位置D:javademoclasses1.创建包创建包就是在根目录下根据包的层次,逐级创建子目录。如假定我们

温馨提示

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

评论

0/150

提交评论