第7章基于对象编程.ppt
第第 7 7 章章 基于对象的编程基于对象的编程7.1 基本概念基本概念7.2 用类实现抽象数据类型用类实现抽象数据类型:时间时间7.3 成员访问控制成员访问控制7.4 创建包创建包7.5 初始化类对象:构造方法初始化类对象:构造方法7.6 static类成员类成员第第 7 7 章章 基于对象的编程基于对象的编程7.1 基本概念基本概念 类中的数部分被称为实例变量,而用户自定义类类中的数部分被称为实例变量,而用户自定义类型型(即类即类)的实例被称为对象。在的实例被称为对象。在Java中,注意力放中,注意力放在对象而不是方法上,在系统需求文档中的名词有在对象而不是方法上,在系统需求文档中的名词有助于助于Java程序员确定用一组什么样的类开始设计过程序员确定用一组什么样的类开始设计过程。程。如何创建和使用对象,这一范畴称为基于对象的如何创建和使用对象,这一范畴称为基于对象的编程编程(Object-Based Programming OBP);引入了继承性和多态性这两种关键技术,才能真引入了继承性和多态性这两种关键技术,才能真正实现面向对象编程正实现面向对象编程(Object-Oriented Programming OOP)。第第 7 7 章章 基于对象的编程基于对象的编程7.2 用类实现抽象数据类型用类实现抽象数据类型:时间时间例例7.1 建立时间类建立时间类Time1和使用时间类的和使用时间类的TimeTest1类。由于类。由于Time1类和类和TimeTest1类都是类都是public类,因此要把类,因此要把他们定义在不同的文件中。他们定义在不同的文件中。/Fig.8.1:Time1.javaimport java.text.DecimalFormat;public class Time1 extends Object private int hour;/0-23 private int minute;/0-59 private int second;/0-59 public Time1()setTime(0,0,0);public void setTime(int h,int m,int s)hour=(h=0&h=0&m=0&s 60)?s:0);public String toUniversalString()DecimalFormat twoDigits=new DecimalFormat(00);return twoDigits.format(hour)+:+twoDigits.format(minute)+:+twoDigits.format(second);public String toString()DecimalFormat twoDigits=new DecimalFormat(00);return(hour=12|hour=0)?12:hour%12)+:+twoDigits.format(minute)+“:”+twoDigits.format(second)+(hour=0&h=0&m=0&s 60)?s:0);第第 7 7 章章 基于对象的编程基于对象的编程public String toUniversalString()DecimalFormat twoDigits=new DecimalFormat(00);return twoDigits.format(hour)+:+twoDigits.format(minute)+:+twoDigits.format(second);public String toString()DecimalFormat twoDigits=new DecimalFormat(00);return(hour=12|hour=0)?12:hour%12)+:+twoDigits.format(minute)+:+twoDigits.format(second)+(hour 12?AM:PM);/end class Time1第第 7 7 章章 基于对象的编程基于对象的编程/Fig.8.5:TimeTest3.javaimport javax.swing.JOptionPane;import com.deitel.jhtp4.ch08.Time1;/import Time1 classpublic class TimeTest3 public static void main(String args)Time1 time=new Time1();/create Time1 object time.setTime(13,27,06);/set new time String output=Universal time is:+time.toUniversalString()+nStandard time is:+time.toString();JOptionPane.showMessageDialog(null,output,Packaging Class Time1 for Reuse,JOptionPane.INFORMATION_MESSAGE);System.exit(0);/end class TimeTest3第第 7 7 章章 基于对象的编程基于对象的编程7.5 初始化类对象:构造方法初始化类对象:构造方法1.constructor(构造方法构造方法):在一个类中和类:在一个类中和类同名的方法叫构造方法同名的方法叫构造方法.系统在产生对象时会系统在产生对象时会自动执行。自动执行。class Point int x,y;Point()x=0;y=0;Point(int new_x,int new_y)x=new_x,y=new_y;class UsePoint Point point_A=new Point();Point point_B=new Point(5,7);第第 7 7 章章 基于对象的编程基于对象的编程构造方法应包含哪些内容构造方法应包含哪些内容?(1)构造方法多半定义一些初值或内存构造方法多半定义一些初值或内存配置工作。配置工作。(2)一个类可以有多个构造方法一个类可以有多个构造方法(重载重载),根据参数的不同决定执行哪一个。根据参数的不同决定执行哪一个。(3)如果程序中没有定义构造方法如果程序中没有定义构造方法,则则创建对象时使用的是缺省构造方法创建对象时使用的是缺省构造方法,它是一个无内容的空方法。它是一个无内容的空方法。第第 7 7 章章 基于对象的编程基于对象的编程2.this和和superthis指自己这个对象;指自己这个对象;this的作用是要将自己这个对象当作参数的作用是要将自己这个对象当作参数,传送给别的对象中的方法。传送给别的对象中的方法。super指这个对象的父类指这个对象的父类super用来引用父类中的方法及变量数据。用来引用父类中的方法及变量数据。public class apple extends fruits public apple(int price)super(price);以上句子表示使用超类的构造函数生成实例以上句子表示使用超类的构造函数生成实例,这种情况下这种情况下super必须是必须是子类构造器的第一条语句。子类构造器的第一条语句。3.finalize(终结方法终结方法):Java的每个类都可以有一个终结方法,用于将资的每个类都可以有一个终结方法,用于将资源归还给系统。在垃圾回收器回收对象的内存之前,该对象的终结方法源归还给系统。在垃圾回收器回收对象的内存之前,该对象的终结方法肯定会被调用,执行此对象的结束清理工作。类的终结方法的名字总是肯定会被调用,执行此对象的结束清理工作。类的终结方法的名字总是finalize,它不接受任何参数,也不返回任何值,它不接受任何参数,也不返回任何值(既其返回值类型为既其返回值类型为void)。一个类只能有一个一个类只能有一个finalize方法。方法。finalize方法最初在方法最初在Object类中定义,它类中定义,它是一个空的方法,什么也不做。但这保证了每个类都有一个是一个空的方法,什么也不做。但这保证了每个类都有一个finalize方法,方法,以供垃圾回收器调用。以供垃圾回收器调用。第第 7 7 章章 基于对象的编程基于对象的编程例例7.3 this和和super的使用。的使用。/ExDemo.javaclass Par public void print()System.out.println(nIn Parent!);public class ExDemo extends Par public void print()System.out.println(nIn Child!);public void printAll()super.print();this.print();print();public static void main(String args)ExDemo ed=new ExDemo();ed.printAll();第第 7 7 章章 基于对象的编程基于对象的编程7.6 static类成员类成员类的每个对象中都有类实例变量的一份拷贝。类的每个对象中都有类实例变量的一份拷贝。在某种情况下,我们只需要某个变量的一份拷贝在某种情况下,我们只需要某个变量的一份拷贝供类中的所有对象共享。基于这个原因和其他一供类中的所有对象共享。基于这个原因和其他一些原因些原因,引入了引入了static类成员。类成员。static类成员代表类成员代表“类范围类范围”的信息的信息(既为类的所有成员所共享既为类的所有成员所共享)。static类成员的声明是以关键字类成员的声明是以关键字static开始的。开始的。尽管尽管static类变量是乎像全局变量,但类变量是乎像全局变量,但static类变类变量只具有类作用域。量只具有类作用域。public static类成员可通过类类成员可通过类的任一对象引用访问,也可利用类名加点操作符的任一对象引用访问,也可利用类名加点操作符(例如例如Math.random()访问。实际上,即使一个类访问。实际上,即使一个类的对象不存在,的对象不存在,static类成员也会存在,执行时类类成员也会存在,执行时类被装入内存后就有了它们。被装入内存后就有了它们。要想访问要想访问private static类成员,必须提供类成员,必须提供public static方法。方法。第第 7 7 章章 基于对象的编程基于对象的编程例例7.4 用用Employee类和类和EmployeeTest类,演示类,演示static成员及垃圾回收。成员及垃圾回收。/Fig.8.20:Employee.javapublic class Employee extends Object private String firstName;private String lastName;private static int count;/number of objects in memory public Employee(String first,String last)firstName=first;lastName=last;+count;/increment static count of employees System.out.println(Employee object constructor:+firstName+lastName);protected void finalize()-count;/decrement static count of employees System.out.println(Employee object finalizer:+firstName+lastName+;count=+count);public String getFirstName()return firstName;public String getLastName()return lastName;public static int getCount()return count;/end class Employee第第 7 7 章章 基于对象的编程基于对象的编程/Fig.8.21:EmployeeTest.javaimport javax.swing.*;public class EmployeeTest public static void main(String args)String output=Employees before instantiation:+Employee.getCount();Employee e1=new Employee(Susan,Baker);Employee e2=new Employee(Bob,Jones);output+=nnEmployees after instantiation:+nvia e1.getCount():+e1.getCount()+nvia e2.getCount():+e2.getCount()+nvia Employee.getCount():+Employee.getCount();output+=nnEmployee 1:+e1.getFirstName()+e1.getLastName()+nEmployee 2:+e2.getFirstName()+e2.getLastName();e1=null;e2=null;System.gc();/显式调用垃圾回收器显式调用垃圾回收器 output+=nnEmployees after System.gc():+Employee.getCount();JOptionPane.showMessageDialog(null,output,Static Members and Garbage Collection,JOptionPane.INFORMATION_MESSAGE);System.exit(0);/end class EmployeeTest