chapter04类和对象.ppt

上传人:本田雅阁 文档编号:3478788 上传时间:2019-09-01 格式:PPT 页数:71 大小:544.52KB
返回 下载 相关 举报
chapter04类和对象.ppt_第1页
第1页 / 共71页
chapter04类和对象.ppt_第2页
第2页 / 共71页
chapter04类和对象.ppt_第3页
第3页 / 共71页
chapter04类和对象.ppt_第4页
第4页 / 共71页
chapter04类和对象.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《chapter04类和对象.ppt》由会员分享,可在线阅读,更多相关《chapter04类和对象.ppt(71页珍藏版)》请在三一文库上搜索。

1、第4章 类和对象,本章知识点,利用数据抽象和数据隐藏技术创建类 创建和使用对象 对属性和方法进行访问 方法的重载 构造方法及其使用 this引用的用法 Java的垃圾收集机制 static方法和属性的使用 类的组合方法 包的创建和使用,4.1 面向对象程序设计的思想,4.1.1 面向对象编程思想 4.1.2 定义时钟类 4.1.3 类、属性、方法和构造方法,4.1.1 面向对象编程思想,面向对象编程技术 将数据及对数据的操作封装在一起而形成了类,类是描述相同类型的对象集合。 面向对象编程(object-oriented programming,OOP)就是定义这些类。 类是抽象的数据类型,用类

2、创建对象。 程序的执行,表现为一组对象之间的交互通信。对象之间通过公共接口进行通信,从而完成系统功能。对象的公共接口是该对象的应用程序编程接口,把对象的内部详细信息隐藏起来,使得对象变得抽象,将这种技术称为数据的抽象化。,4.1.2 定义时钟类,【例4-1】编写一个时钟类。 时钟类的设计,4.1.2 定义时钟类,时钟类:Timer.java。 测试类:TimerTest.java。TimerTest类包含main方法,在main方法中将创建Timer类的一个对象,并调用对象的方法。,4.1.2 定义时钟类,public class Timer extends Object private in

3、t hour; private int minute; private int second; public Timer() setTime( 0, 0, 0 ); public void setTime( int h, int m, int s ) hour = ( ( h = 0 ,秒,设置时间,构造方法,秒,属性,4.1.2 定义时钟类,public String toUniversalString() return hour + “:“ + minute + “:“ + second ; public String toStandardString() return ( (hour =

4、 12 | hour = 0) ? 12 : hour % 12 ) + “:“ + minute + “:“ +second+( hour 12 ? “ AM“ : “ PM“ ); ,以24时制格式显示时间,以12时制格式显示时间,public class TimerTest public static void main(String args) Timer timer; timer = new Timer(); timer.setTime(23, 55, 10); System.out.println(timer.toStandardString(); System.out.print

5、ln(timer.toUniversalString(); ,对象和引用,Timer timer; /引用变量 timer = new Timer(); /对象,timer,0X3000,通过引用变量timer对对象进行使用。,4.1.3 类、属性、方法和构造方法,1定义类的语法格式 类的修饰符 class 类名 extends 父类名 /类体 public class Timer extends object ,2属性 在类中声明一个属性的形式为: 属性修饰符 类型 属性名; 例: private int hour; private int minute; private int secon

6、d;,4.1.3 类、属性、方法和构造方法,类中数据成员的缺省值,注意:定义在类中的每一个数据成员都会有一个缺省值。,3. 方法(method) 方法一般是对类中的数据成员进行操作。 如果类中的数据成员是private型的,则往往定义public的方法来设置数据成员的值或读取数据成员的值(具体在4.6节中讲解)。,4.1.3 类、属性、方法和构造方法,4.1.3 类、属性、方法和构造方法,4. 构造方法(constructor) Timer类包含一个构造方法Timer()。 构造方法名与类名相同。 构造方法一般用于初始化类的对象。 程序创建Timer类的对象时,new运算符为该对象分配内存,并

7、调用构造方法来初始化该对象。 (具体在4.4节中讲解),4.4 初始化类的对象-构造方法,构造方法的作用 为类的新建对象分配内存空间 为对象进行初始化 说明 构造方法必须与类名相同。 构造方法没有返回值,但可以有参数,并且可以重载。 构造方法只能在创建对象时用new命令由系统调用。 如果一个类中未定义构造方法,则编译时系统会自动提供一个缺省的无参的构造构造方法,其方法体为空。 public 类名( ) ,【例4-4】构造方法的重载。,/5个重载的构造方法 public Timer() setTime( 0, 0, 0 ); public Timer( int h ) setTime( h, 0

8、, 0 ); public Timer( int h, int m ) setTime( h, m, 0 ); public Timer( int h, int m, int s ) setTime( h, m, s ); public Timer( Timer timer ) setTime( timer.hour, timer.minute, timer.second ); ,public class TimerTest3 public static void main( String args ) Timer t1 = new Timer(); / 00:00:00 Timer t2 =

9、 new Timer( 2 ); / 02:00:00 Timer t3 = new Timer( 21, 34 ); / 21:34:00 Timer t4 = new Timer( 12, 25, 42 ); / 12:25:42 Timer t5 = new Timer( t4 ); / 12:25:42 ,4.6 使用set和get方法,如果类中声明了private成员变量,则该类的使用者只能通过该类的方法来操作它们。 在类中,通常会定义私有成员变量的set和get方法以便该类的用户对其进行存取。 存:设置private成员变量的取值setXxxx(xxx) 取:读取private成员

10、变量的取值xxx getXxxx(),【例4-6】 set和get方法的使用。,public class Timer2 private int hour, minute, second; public void setHour( int hour ) /setHour方法 this.hour = ( ( hour = 0 ,【例4-6】 set和get方法的使用。,public class Timer2Test public static void main(String args) Timer2 time = new Timer2(); time.setHour(23); time.setM

11、inute(39); time.setSecond(20); System.out.println(time.getHour()+“:“+time.getMinute() +“:“ +time.getSecond(); ,4.10 包(package)的创建和访问,包:已被组织到某一目录下并被命名的一组类的集合。 包机制:提供类的多层类命名空间,对各种用途的类进行分门别类的使用和存放。,4.10.1 包的创建,每一个包中的文件在文件开头必须含有包的说明,格式为: package 包名; 例如:pakage chap4; package chap4.lesson1; 包 子包,【例4-9-1】包

12、的创建。,带有包定义的代码。,package chap4.lesson2; public class Course private String courseName; /课程名 public Course(String courseName) this.courseName = courseName; public String getCourseName() return courseName; public void setCourseName(String courseName) this.courseName = courseName; void show () System.out

13、.println(courseName); ,【例4-9-1】包的创建。,package chap4.lesson2; /与Course类所在包相同 public class CourseTest public static void main(String args) Course course = new Course(“java程序设计“); course.show(); ,命令行方式下的编译和执行,带有包的类的编译: 需要将类文件按包所指定的路径进行存储。 编译命令: javac d 路径 java源文件 常用形式:javac d . java源文件 演示,查看class文件,命令行方

14、式下的编译和执行,当前目录 e:java_source,chap4,lesson2,Course.class CourseTest.class,CourseTest.java Course.java,javac d . Course.java javac d . CourseTest.java,命令行方式下的编译和执行,带包定义的类的执行 需要在包的上级目录执行类的class文件 java chap4.lesson2.CourseTest,当前目录e:java_source,chap4,lesson2,Course.class CourseTest.class,CourseTest.java

15、Course.java,命令行方式下的编译和执行,CourseTest.java,设置环境变量classpath:指定寻找类字节码的路径包的上级文件夹。,当前目录,classpath=e:java_source;,设置classpath后,在任意路径都可以执行包下面的类。,4.10.2 包的使用,同一个包中的类互相引用时不需要写出包名。 引用其他包中的类的方法 方式一:包名.类名 例如:chap4.lesson2.Course 缺点:书写类时比较麻烦,总要写出包名。 方式二:用import语句导入 例:import chap4.lesson2.Course; import javax.swin

16、g.JOptionPane; import java.util.*; “*”表示导入整个包下的所有类 注意:导入包导入子包,【例4-9-2】包的使用。,不同包下加包前缀,package chap4.lesson3; /与Course类所在包不同 public class CourseTest public static void main(String args) Course course = new chap4.lesson2.Course(“java程序设计“); course.show(); ,【例4-9-2】包的创建及使用。,不同包下导入,package chap4.lesson3;

17、 import chap4.lesson2.*; public class CourseTest public static void main(String args) Course course = new Course(“java程序设计“); course.show(); ,4.2 类的作用域,定义类的作用域的修饰符(modifier) public(公共作用域):一个具有公共作用域的类在封装它的包外面是可见的。 package(包作用域, 缺省值):一个具有包作用域的类只是在封装它的包中是可见的。,4.2 类的作用域,public class C1 ,package sub1; cl

18、ass C21 ,package sub2.sub3; class C3 ,package sub1; public class C22 ,类的使用: C1 sub1.C21 sub1.C22 sub2.sub3.C3,4.2 类的作用域,public class C1 ,package sub1; class C21 ,package sub2.sub3; class C3 ,package sub1; public class C22 ,package命令指定类存储的位置 类的修饰符指定类被使用的范围,公共作用域,包作用域,4.3 成员访问控制,成员访问控制:用来控制类中成员的访问范围。,

19、声明类的公有成员,可以在类外被使用,声明保护成员,可以在同一包中或子类(同包/不同包)中使用,声明包作用域成员,该成员只能在同一包中被使用,声明私有成员,该成员只能在自身类中访问,大,小,类中定义的成员可以在自身类中各方法中使用,相当于存在于类中的“全局变量”,【例4-2】成员访问控制举例1。,public class Timer extends Object private int hour; / 0 - 23 private int minute; / 0 - 59 private int second; / 0 - 59 public Timer() public void setTim

20、e( int h, int m, int s ) public String toUniversalString() public String toStandardString() ,public class TimerTest2 public static void main( String args) Timer time = new Timer(); time.hour = 7; /error time.minute = 15; /error time.second = 30; /error ,private成员不能在定义自身的类外使用,【例4-3】成员访问控制举例2。,public

21、class AccessModifier private int a; int b; protected double c; public char d; ,class AccessModifierTest public static void main( String args) accessModifier obj = new AccessModifier(); obj.a=1; obj.b = 2; obj.c = 1.5; obj.d=#; ,设两个类在同一个包中(包未命名)。,创建类的对象,private属性的使用,default成员的使用,protected成员的使用,public

22、成员的使用,public void setA(int a1) a=a1;,obj.setA(1);,4.5 this,this:被调用的方法/属性的当前对象的引用。 说明:this引用仅能出现在类中的方法中。 this的使用 通过this引用成员变量(属性) 通过this引用方法,【例4-5】通过this引用成员变量。,class SimpleTime private int hour, minute, second; public SimpleTime( int hour, int minute, int second ) void show() System.out.print(hour+

23、“:“+minute+“:“+second); ,public class SimpleTimeTest public static void main(String args) SimpleTime time = new SimpleTime(12, 30, 19); time.show(); ,当类的成员变量与方法中的局部变量同名时,成员变量使用this引用。,this.hour = hour; this.minute = minute; this.second = second;,4.9 类的组合(Composition),类的组合:指类之间的一种”has a”的关系,即一个类中的成员是

24、其他类的引用。,【例4-8】类的组合举例。,定义一个学生类和一个课程类,表示现实生活中一个学生可以选择多门课程的情况。,【例4-8】类的组合举例。,public class Course private String courseName; /课程名 private int creditHour; /学分 public Course(String courseName, int creditHour) this.courseName = courseName; this.creditHour = creditHour; public String getCourseName() return

25、courseName; public void setCourseName(String courseName) this.courseName = courseName; public int getCreditHour() return creditHour; public void setCreditHour(int creditHour) this.creditHour = creditHour; ,【例4-8】类的组合举例。,public class Student private String stuName; private int grade; private Course c

26、ourses; /学生选择的多门课程 public Student() public int getGrade() return grade; public void setGrade(int grade) this.grade = grade; public Course getCourses() return courses; public void setCourses(Course courses) this.courses = courses; public String getStuName() return stuName; public void setStuName(Stri

27、ng stuName) this.stuName = stuName; public void showStudent() System.out.println(stuName+“ “+ grade+“年级 “); System.out.println(“选修的课程包括:“); for(int i=0; icourses.length; i+) System.out.println(coursesi.getCourseName()+ “ “ + coursesi.getCreditHour()+“个学分“); ,【例4-8】类的组合举例。,public class StudentTest pu

28、blic static void main(String args) Student stu = new Student(); stu.setStuName(“Lucy“); stu.setGrade(3); Course courses = new Course2; courses0=new Course(“Java程序设计“, 4); courses1=new Course(“数据库应用 “, 3); stu.setCourses(courses); stu.showStudent(); ,4.7 垃圾收集(Garbage Collector),Java中的内存管理 如果忽略系统资源的限制

29、,Java平台允许创建任意多个对象。当对象不再使用时自动会被清除,这个过程就是所谓的“垃圾收集”。 垃圾收集的时机:当对象不再被引用的时候,对象就会被作为垃圾收集的对象而被清除。 为了使对象不再被引用,可以通过将对象的引用置为null。 例如: Timer timer=new Timer(); timer=null;,4.7 垃圾收集(Garbage Collector),1垃圾收集器 Java中有一个垃圾收集器,它周期性地将不再被引用的对象从内存中清除掉。 垃圾收集器自动执行,它扫描对象的动态存储区,将没有被引用的对象收集起来,定期地释放不再被引用的对象所占用的存储空间。 显式地运行垃圾收集

30、器 System.gc()方法,4.7 垃圾收集(Garbage Collector),2finalize方法 当一个对象被垃圾收集器收集前,垃圾收集器给对象一个机会调用自己的finalize方法(继承自父Object类)。,4.8 static方法和属性,当在类中声明一个成员时,可以指定它是为一个类的各个对象各自拥有(实例成员),还是为一个类的所有对象共享(类范围的成员)。 类范围的成员称为静态成员,以关键字static声明。 static int count; 类的静态成员的使用格式 类名.静态变量名 或者 对象引用.静态变量名 类名.静态方法 或者 对象引用.静态方法名 JOptionP

31、ane.showMessageDialog(.); JOptionPane.showInputDialog();,静态成员既可以通过类引用,也可以通过对象引用。 更多的使用类引用方式。,【例4-7】静态方法和属性的应用。,雇员类 Employee 属性 名字 firstName 姓 lastName 雇员计数 count(静态属性) 方法 构造方法 getFirstName() getLastName() getCount() (静态方法) finalize()(垃圾回收前被执行),【例4-7】静态方法和属性的应用。,public class Employee private String f

32、irstName; private String lastName; /定义一个静态变量表示内存中Employee类对象的数目 private static int count = 0; public Employee( String firstName, String lastName ) /构造方法 this.firstName = firstName; this.lastName = lastName; count+; /将静态变量加1 System.out.println( “创建Employee对象: “ + firstName + “ “ + lastName ); ,【例4-7】

33、静态方法和属性的应用。,/* 垃圾回收器回收对象前执行finalize()方法 */ protected void finalize() count-; /被回收前将静态变量count的值减1 System.out.println( “Employee finalizer: “ + firstName + “ “ + lastName + “; count = “ + count ); public String getFirstName() return firstName; public String getLastName() return lastName; /定义静态方法getCou

34、nt,获取静态变量count的值 public static int getCount() return count; ,【例4-7】静态方法和属性的应用。,public class EmployeeTest public static void main( String args ) System.out.println(“对象创建前:Employee.getCount():“ + Employee.getCount()+“n“); Employee e1 = new Employee( “Susan“, “Baker“ ); System.out.println(“一个对象创建后: e1.

35、getCount(): “ + e1.getCount() + “ ;Employee.getCount(): “ + Employee.getCount()+“n“); Employee e2 = new Employee( “Bob“, “Jones“ ); System.out.println(“两个对象创建后: e1.getCount(): “ + e1.getCount() + “ ;e2.getCount(): “ + e2.getCount() + “ ;Employee.getCount(): “ + Employee.getCount()+“n“); /将对象引用置空,准备回

36、收 e1 = null; e2 = null; System.gc(); / 显式地运行垃圾收集程序 System.out.println(“after System.gc():count= “ + Employee.getCount(); ,4.8 static方法和属性,注意: static方法的方法体中使用的成员必须是static成员(属性和方法)。 static方法中只能使用static属性 static方法只能调用static方法,4.8 static方法和属性,private static int square( int intValue ) System.out.print(“调

37、用int型参数的square方法:“); return intValue * intValue; private static double square( double doubleValue ) System.out.print(“调用double型参数的square方法:“); return doubleValue * doubleValue; public static void main(String args) System.out.println(square(10); System.out.println(square(10.0); ,静态方法间的调用,本章小结,本章介绍了面向

38、对象程序设计的重要概念-类和对象。类是一种抽象的数据类型,用来表示具有相同性质的一类事物。 类的设计 一个类的成员包括属性、方法 成员的访问控制符,本章小结,构造方法提供了创建对象(new)的不同形式。好的习惯:提供一个无参的构造方法。 为类的私有属性其提供公有的set和get方法进行存取 某些成员可以定义为static类型,称之为类成员。类成员可以直接通过类名进行访问。static属性:所有对象共享;static方法:利用类名直接调用。,本章小结,类的访问控制符:限定其它类对该类及类的成员的访问。类的访问控制符有两种,public和默认(package)。public作用域的类在封装它的包外

39、面是可见的。package作用域的类只是在封装它的包中是可见的(在包外试图import也无法成功)。 包提供了类的多层类命名空间,对各种用途的类进行分门别类的使用和存放。相同包下的类可以直接引用,不同包下的类最好利用“先导入、再使用”的方式引用。,本章小结,this表示当前对象的一个引用,通常:当类的属性与类方法中的局部变量同名时,利用this引用类的属性加以区分。 多个类在使用过程中,可以存在“has a”的关系,即将一个类组合到另一个类中,该类的对象作为另外一个类的成员存在。 对象数组 Student stu = new Student5; /初值为null stu0 = new Stud

40、ent();,考核目标,【掌握】 类的定义方法(属性、方法、构造方法) 类的两种访问控制修饰符及其作用 为类的私有属性定义set和get方法 利用构造方法创建对象 正确使用this引用 在Eclipse下正确地定义和使用包 【理解】 static成员的特征及访问方式 类的组合方法的定义 带有包的类的命令行编译及执行方式 【了解】 Java中的垃圾回收机制 类中成员的protected, package两种访问控制符作用,练 习,定义一个学生类(Student),属性包括:学号(no),班号(classNo ),姓名(name),性别(sex),年龄(age);方法包括:获得学号,获得班号,获得

41、姓名,获得性别,获得年龄,修改学号,修改班号,修改姓名,修改性别,修改年龄。定义一个学生数组对象。设计程序进行测试。,酒店前台管理系统,为某酒店设计一套简单的前台房间管理系统,该系统可以通过在命令行输入命令来为客人办理入住和退房手续。要求该系统支持通过命令行输入以下命令来进行入住,退房及查询的操作: search:查询所有房间的状态 in 1202 song :姓名为song的客人入住1202房间 out 1202:1202房间退房 quit:退出程序 说明 : 1)该习题主要考察的知识点:控制台输入,循环控制,数组的使用,方法调用等。 2)酒店房间的状态可以用一个二维数组来存放,如果有客人已

42、经入住,则存放该客人的姓名,如果没有客人入住,则存放”empty”。 3)可以从控制台读入命令的第一个单词,来决定调用哪个方法负责处理该类命令。 4)可以将每个命令要完成的功能分别用一个方法来描述,在主控方法run中调用这些方法。,酒店前台管理系统,酒店前台管理系统,其他业务方法 public void run() 主控方法 private void initRoom( ) 初始化房间为空”EMPTY” private void search( ) 输出房间状态 private boolean testRoomNo(int roomNo) 判断房间号是否合法 private void in(

43、int roomNo, String name) 入住 private void out( int roomNo) 退房,学生成绩查询系统,将所有学生的课程成绩保留在一个二维数组中,每一行代表一个学生的成绩,每一列代表一门课程的成绩;将每门课程的名称保留在一个一维数组中(课程的下标序号与二维数组的列号匹配);将每个学生的姓名保留在一个一维数组中(学生的下标序号与二维数组的行号匹配);要求编写程序实现成绩的查询,程序运行时从命令行输入统计命令及参数,程序则输出结果,例如: avg Java:统计课程Java的平均分。 avg zhang:统计学生zhang的平均分。 sort Java:列出Ja

44、va课程的成绩的排序。 get zhang Java:统计zhang的Java课程的成绩。 exit:退出程序。 sum zhang:统计学生zhang的总分。 sort sum: 按总分排序。 说明 :该习题主要考察的知识点:控制台输入,循环控制,数组的使用,方法调用等。,学生成绩查询系统,学生成绩查询系统,其他业务处理方法 public void run() 主控方法 private void init_score() 初始化成绩(随机数) private void showout() 显示成绩表 private void get(String condition1, String con

45、dition2) 读取某人某门课成绩 private void avg(String condition) 求某人或某课的平均分 private void sort_score(String sort_condition) 按课程得分排序,五子棋游戏,描述:编写程序实现两人互玩的五子棋游戏,游戏开始时要求在控制台输出以下棋盘,然后提示黑方或白方下子,玩家从命令行输入:6 8,表示在6,8坐标位置落子,其中黑方的子用表示,白方的子用O表示,每有一方落子,则要重新输出棋盘的状态.程序还要能判断某一方获胜,并终止游戏。,五子棋游戏,20*20的棋盘,五子棋游戏,五子棋游戏,其他业务处理方法 publ

46、ic void run() 主控方法 private void init_ChessRoom() 初始化棋盘 private void show() 显示棋盘 private boolean isWin( int r, int c) 判断输赢 private boolean toLeftRight(int r, int c) 判断水平方向是否有5个棋子 private boolean toUpperDown(int r, int c) 判断垂直方向是否有5个棋子 private boolean toLeftUpper(int r, int c) 判断左斜方向是否有5个棋子 private boolean toRightUpper(int r, int c) 判断右斜方向是否有5个棋子,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1