第3章面向对象的编程技术.ppt

上传人:本田雅阁 文档编号:2577482 上传时间:2019-04-11 格式:PPT 页数:72 大小:308.51KB
返回 下载 相关 举报
第3章面向对象的编程技术.ppt_第1页
第1页 / 共72页
第3章面向对象的编程技术.ppt_第2页
第2页 / 共72页
第3章面向对象的编程技术.ppt_第3页
第3页 / 共72页
亲,该文档总共72页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第3章面向对象的编程技术.ppt》由会员分享,可在线阅读,更多相关《第3章面向对象的编程技术.ppt(72页珍藏版)》请在三一文库上搜索。

1、第3章 面向对象的编程技术,主讲:胡伏湘,回顾与复习,问题: 问题空间元素在方法空间中的表示称为( ),也称为( )instance),它是现实世界的实体或概念在计算机逻辑中的抽象表示。面向对象的程序设计简称( )是以要解决的问题中所涉及到的各种对象为主要考虑因素 。,3.1 类,3.1.1 面向对象的概念 把问题看成是相互作用的事物的集合,用( 1 )描述事物,对事物的操作叫做( 2 ),事物称为对象,(2)称为数据,对象是(1)与(2)的集合。OOP主要技术包括( 3 )、继承、多态、( 4 )。对多个事物所共同的属性组成的集合叫做(5)。,3.1 类,3.1.1 面向对象的概念 把问题看

2、成是相互作用的事物的集合,用属性描述事物,对事物的操作叫做方法,事物称为对象,属性称为数据,对象是数据与方法的集合。OOP主要技术包括封装、继承、多态、覆盖。对多个事物所共同的属性组成的集合叫做类,对象是类的实例(instance)。,3.1 类,312 类的定义 修饰符 class 类名 extends 父类名 implements 接口名 类型 成员变量; 修饰符 类型 成员方法(参数列表) 类型 局部变量; 方法体; ,3.1 类,例如:定义一个类“工人”并实例化。 public class EmployeeTest public static void main(String args

3、) / 将三个员工对象的数据赋给职工数组 Employee staff = new Employee3; staff0 = new Employee(“张三“, 75000,1987, 12, 15); staff1 = new Employee(“李四“, 50000,1989, 10, 1); staff2 = new Employee(“王五“, 40000,1990, 3, 15); for (int i = 0; i staff.length; i+) staffi.raiseSalary(5); /每个员工的工资增长5% for (int i = 0; i staff.length

4、; i+) / 打印输出员工信息 Employee e = staffi; System.out.println(“姓名=“ + e.getName() + “,工资=“ + e.getSalary() + “,工作日期=“ + e.getHireDay(); ,3.1 类,例如:定义一个类“工人”并实例化。 class Employee public Employee(String n, double s, int year, int month, int day) name = n; salary = s; GregorianCalendar calendar = new Gregoria

5、nCalendar(year, month - 1, day); / GregorianCalendar 计算月份从0开始 hireDay = calendar.getTime(); ,3.1 类,例如:定义一个类并实例化。 public String getName() return name; public double getSalary() return salary; public Date getHireDay() return hireDay; public void raiseSalary(double byPercent) double raise = salary * by

6、Percent / 100; salary += raise; private String name; private double salary; private Date hireDay; ,3.1 类,3.1.3 类的修饰 1访问控制符 public:公共类,说明这是一个公共类,可以被其它任何类引用和调用 不写访问控制符,表示类只能被本包的其它类访问 2抽象类abstract,3.1 类,3.1.3 类的修饰 2抽象类abstract 以abstract作为关键字,如果有的话,应该放在访问控制符后面,表示这个类是个抽象类。抽象类不能直接产生实例化一个对象,它只能被继承。 例如: Num

7、ber类在JDK文档中定义为: java.lang.Number All Implemented Interfaces: Serializable,3.1 类,3.1.3 类的修饰 2抽象类abstract 抽象类就是没有具体实例化对象的类。 优点:抽象类是所有它的子类的公共属性的集合,可以利用充分利用这些公共属性提高程序开发和维护的效率。 特征:至少含有一个抽象方法,3.1 类,2抽象类abstract 例:abstract class Vehicle abstract long getDistance(int day); Date purchaseDate; 使用方法:继承后重新定义 cl

8、ass Plane extends Vehicle purchaseDate=new Date(); long getDistance(int day) If (day100)return 10000 else return 1000; ,3.1 类,313 类的修饰 3最终类final 以final作为关键字,如果有的话,应该放在访问控制符后面,表示这个类是个最终类,也就是说最终类不能被继承,不能再派生出其它子类。 例如:String类,3.1 类,3.1.4 属性和方法的声明 1类的属性 声明类的属性为简单变量的格式是: 修饰符 变量类型 变量名=初值 修饰符包括访问控制修饰符、静态修饰符

9、static、最终说明符final。,3.1 类,3.1.4 属性和方法的声明 1类的属性 private:私有,此成员只能在类的内部使用 默认(default/friendly:也可以不写访问控制符,成员可被本包的其它类访问 protected:被保护,成员可被本包的所有类访问,也可以被声明它的类和派生的子类访问(家庭成员) public:公共,成员可被所有类访问,3.1 类,3.1 类,静态修饰符static 特点:它们是类的属性,而不属于任何一个类的对象。即:对于该类的任何一个对象,静态属性是一个公共的存贮单元,任何一个类的对象访问客观存它时,得到的都是相同的数值。同理,任何一个类的对象

10、去修改它时,也都是对同一个内存单元进行操作。 注意:与C语言中static含义相同,3.1 类,3.1.4 属性和方法的声明 2方法 声明类的方法的格式是: 修饰符 返回值类型 方法名(形式参数列表) throws 异常名列表 方法体; 局部变量声明; 语句序列; ,3.1 类,3.1.4 属性和方法的声明 2方法 方法的修饰符很多,包括访问控制符、静态修饰符static、抽象方法修饰符abstract、最终方法final、同步修饰符synchronous、本地修饰符native。,3.1 类,3.1.4 属性和方法的声明 3方法的覆盖 如果子类中的一个方法与父类中的方法有相同的方法名并具有相

11、同数量和类型的参数列表,则称子类中的方法覆盖了父类中的方法。通过子类引用覆盖方法时,总是引用子类定义的方法,而父类中定义的方法被隐藏。,3.1 类,3方法的覆盖举例 class SuperClass public void printA() System.out.println(“父类打印函数“); class SubClass extends SuperClass public void printA() System.out.println(“子类打印函数“); public class OverrideDemo public static void main(String args) S

12、uperClass s1=new SubClass(); s1.printA(); ,3.1 类,4方法的重载 在同一个类中有二个或二个以上的方法可以有相同的名字,只要它们的参数声明不同即可,这种情况称为方法重载。 Java用参数的类型和数量来确定实际调用的重载方法的版本。因此每个重载的方法的参数的类型或数量必须是不同的。 方法的重载举例:,3.1 类,class Calculation public void add(int a,int b) int c=a+b; System.out.println(“两个整数相加得:“+c); public void add(float a,float

13、b) float c=a+b; System.out.println(“两个浮点数相加得:“+c); public void add(String a,String b) String c=a+b; System.out.println(“两个字符串相加得:“+c); public class OverLoadDemo public static void main(String args) Calculation c=new Calculation(); c.add(10,20); c.add(21.5f,32.3f); c.add(“早上“,“好“); ,3.2 对象的实例化,3.2.1

14、对象的实例化 对象实例化的格式是: 类型 对象名=new 类型(参数列表); 其中,“类型”表示对象的类型,必须是复合类型,包括类、字符串等,“对象名”是一个合法的标识符。“参数列表”要根据类的形式参数确定,与之匹配。如: Person wangming=new Person();,3.2 对象的实例化,3.2.2 对象的引用 类的成员(包括成员属性和成员方法)必须要在产生对象即实例化后才能被引用,引用的方法是: 对象名.成员 2引用对象的方法 格式: 对象引用.方法名(参数列表);,3.2 对象的实例化,3.2.3 方法的参数传递 1基本数据类型的参数传递 基本类型的变量作为实参传递,并不能

15、改变这个变量的值 。 方法中的形式参数相当于局部变量,方法调用结束后自行释放,不会影响主程序中的同名变量 对象的引用变量并不是对象本身,而是对象的句柄(名称),一个对象可以有多个句柄,3.2 对象的实例化,3.2.3 方法的参数传递 1基本数据类型的参数传递 基本类型的变量作为实参传递,并不能改变这个变量的值 方法中的形式参数相当于局部变量,方法调用结束后自行释放,不会影响到主程序中的同名变量 对象的引用变量并不是对象本身,而是对象的句柄(名称),一个对象可以有多个句柄,3.2 对象的实例化,举例:分析下面程序的运行结果。 class PassValue public static void

16、main(String args) int x=5; chang(x); System.out.println(x); public static void chang(int x)x=3; ,3.2 对象的实例化,3.2.3 方法的参数传递 2引用变量的参数传递 引用数据类型(如:类、接口)的参数调用可以改变对象的内容 举例:分析下面程序的运行结果。,3.2 对象的实例化,class PassRef int x; public static void main(String args) PassRef obj=new passRef(); obj.x=5; chang(obj); Syste

17、m.out.println(obj.x); public static void chang(PassRef obj) obj.x=3; ,3.2 对象的实例化,3.2.4 对象的消失 Java运行时系统通过垃圾收集器Garbarge Collector周期性地释放无用对象所占的内存,以完成对象的清除 Java的垃圾收集器自动扫描对象的动态内存空间,对正在使用的对象加上标记,将所有引用的对象作为垃圾收集起来并释放,复习与提问,1、指出下列程序对应的文件名程序1 class MyClass1 MyClass1 obj1=new MyClass1 (); ; class MyClass2 .; p

18、ublic static void main(String args) MyClass2 obj2=new MyClass2 (); ,复习与提问,1、指出下列程序对应的文件名程序2 public class ParamApplet1 extends Applet public void init() class ParamApplet2 public void setValue(int i,String s) ,复习与提问,2、类和方法的访问修饰符包括哪些?哪一个的作用范围最大?哪一个最小? 3、基本数据类型的参数传递与引用变量的参数传递结果有什么不同? 4、假如有一个类Person,问以下

19、实例化操作哪个是正确的。 Person xiaoliu=new Person; Person xiaoliu=new Person(); Person xiaoliu()=new Person;,33 构造方法,例1:构造方法引例 class Person /分析运行结果 public Person() System.out.println(“方法Person被调用了”); private int age=22; public void shout() System.out.println(“我的年龄已经到了”+age); class TestPerson public static void

20、 main(String args) Person p1=new Person();p1.shout(); /Person p2=new Person();p2.shout(); /Person p3=new Person();p3.shout(); ,33 构造方法,3.3.1 构造方法的定义 构造方法的特征: 具有与类相同的名称 不能含有返回类型,也不能是void的 不能在方法中用return语句返回一个值 在类实例化时,它会由系统自动调用,33 构造方法,定义:构造方法是java创建的伪方法,是一种实例方法,名称与其类名相同,是通过new关键字来调用的。 构造方法的执行顺序:在创建对象时

21、,对象所在类的所有属性会首先进行初始化,在类的所有成员初始化完成后,才调用对象所在类的构造方法创建对象,构造方法的功能就是初始化。,33 构造方法,例2:构造方法的调用 class SuperClass SuperClass() System.out.println(“SuperClass 的构造方法“); public class SubClass extends SuperClass SubClass() System.out.println(“SubClass的构造方法 “); public static void main(String args) SubClass sub = new

22、 SubClass(); ,33 构造方法,小结:在子类中只实例化了一个子类对象。从输出结果上看,程序并不是一开始就运行自己的构造方法,而是先运行其父类的默认构造方法。注意:程序自动调用其父类的默认构造方法。,输出结果: SuperClass 的构造方法 SubClass的构造方法,33 构造方法,例3:分析下面程序的运行结果 class One One(String str) System.out.println(str); class Two One one_1 = new One(“one-1“); One one_2 = new One(“one-2“); One one_3 = ne

23、w One(“one-3“); Two(String str) System.out.println(str); public class Test public static void main(String args) System.out.println(“Test main() start.“); Two two = new Two(“two“); ,33 构造方法,运行结果: Test main() start. one-1 one-2 one-3 two 分析:在main()方法中实例化了一个Two类的对象。但程序在初始化Two类的对象时,并非先调用Two类的构造方法,而是先初始化

24、Two类的成员变量。这里Two类有3个成员变量,它们都是One类的对象,所以要先调用3次One类的相应的构造方法。最后在初始化Two类的对象。,33 构造方法,3.3.2 构造方法的重载 一个类的构造方法可以有多个,允许重载 每个类至少有一个构造方法,如果用户没有定义,系统自动产生一个默认构造方法,没有参数,也没有方法体。 用户可以定义构造方法,如果定义了构造方法,则系统不再提供默认构造方法 构造方法一般是public,不可定义为private的 实例参见P65-例3-8。,3.4 this与super,3.4.1 this this在方法中用来指向引用当前正在执行的那个对象实例 需要全面访问

25、当前对象,而不是访问某一个个别的实例对象,也可以使用this this(参数表),这个构造函数就会调用同一个类的另一个相同的构造函数,3.4 this与super,例1:引例 class PersonInformation String name,sex,nationality,address; int age; void PersonInformation(String name,String sex,String nationality,String address,int age) this.name=name; this.sex=sex; this.nationality=nation

26、ality; this.address=address; this.age=age; ,3.4 this与super,this使用最普遍的3种情况: 1、在方法的某个形参名与当前对象的某个成员有相同的名字,为了不至于混淆,需要明确使用this关键字来指明要使用哪个成员,使用方法是“this.成员名”,而不带this的那个便是形式参数。 2、还可以用“this.方法名”来引用当前对象的某个方法,但这时this就不是必不可少的了,可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。 3、this(参数表),这个构造函数就会调用同一个类的另一个相同的构造函数。,3.4 this与supe

27、r,例2:利用this调用另一个构造方法 class UserInfo public UserInfo(String name) this(name,aNewSerialNumber); public Userinfo(String name,int number) userName=name; userNumber=number; ,3.4 this与super,例3:this使用举例 public class DemoThis private String name; private int age; DemoThis(String name,int age) setName(name);

28、 /你可以加上this来调用方法,如: /this.setName(name);但并不是必须的 setAge(age); this.print(); ,3.4 this与super,public void setName(String name) this.name=name; /此处必须指明你要引用成员变量 public void setAge(int age) this.age=age; public void print() System.out.println(“Name=“+name+“ Age=“+age); /在此行中并不需要用this,因为没有会导致混淆的东西 public s

29、tatic void main(String args) DemoThis dt=new DemoThis(“ Sofat “,“22“); ,3.4 this与super,3.4.2 super 引例 class Country String name; void value() String name=“China”; ,此行会让父类中同名变量隐藏,如果想要使用父类的构造函数则应当使用super(参数列表)的形式。,3.4 this与super,改进方法:运用super关键字 class City extends Country String name; void value() Stri

30、ng name=“Changsha“; super.value(); System.out.println(name); System.out.println(super.name); ,3.4 this与super,例4:super和this综合使用举例 class Person public int c; private String name; private int age; protected void setName(String name) this.name=name; protected void setAge(int age) this.age=age; protected

31、 void print() System.out.println(“Name=“+name+“ Age=“+age); ,3.4 this与super,public class DemoSuper extends Person public void print() System.out.println(“DemoSuper:“); super.print(); public static void main(String args) DemoSuper ds=new DemoSuper(); ds.setName(“ Sofat “); ds.setAge(22); ds.print();

32、,3.4 this与super,运行结果:DemoSuper: Name=Sofat Age=22 Super小结: 1、在DemoSuper中,重新定义的print方法覆写了父类的print方法,它首先做一些自己的事情,然后调用父类的那个被覆写了的方法。 2、如果父类的成员可以被子类访问,可以像使用this一样使用它,用“super.父类中的成员名”的方式,复习提问,1、构造方法有什么特点? 2、对于一个类,如果定义了多个构造方法,这种现象称为构造方法的重载。这些构造方法在声明时应该有什么不同? 3、类初始化时,会自动调用构造方法,如果存在着重载现象,系统根据什么原则找到相应的构造方法?,3

33、.5 内部类,内部类:是在某个类的内部嵌套定义的一个类,内部类可以在一个语句块的内部定义,也可以是其它类的成员,还可以在一个表达式内部匿名定义。 内部类的特征: 内部类只能声明为private或protected的 内部类可以定义为abstract 内部类不能与包含它的类名相同,3.5 内部类,实例:内部类的使用 public class InnerClassTest public static void main(String args) InnerClassTest classObj=new InnerClassTest(); classObj.Printh(); void Print()

34、 innerClass innObj=new innerClass(); innObj.Print(); class innerClass public void Print() System.out.println(“此处调用了内部类的Print()方法“); ,3.5 内部类,使用内部类的主要原因: 内部类的对象可访问外部类的成员方法和变量,包括私有成员 实现事件监听器时,采用内部类、匿名类编程容易实现其功能 编写事件驱动程序,内部类很方便,3.5 内部类,使用内部类的主要缺点: 使用内部类虽然可以节省编译后产生的字节码文件的大小,但会造成程序结构上的不清晰。 建议初学者不要编写内部类,3

35、.6 字符串的处理,3.6.1 字符串的生成 Java.lang语言核心包中定义了String和StringBuffer两个来封装对字符串的各种操作,它们都是final类,不能被其它类继承。 通过String提供的构造方法,可以生成一个空串,String类默认的构造方法不需要任何参数,如:String s=new String();,3.6 字符串的处理,3.6.1 字符串的生成 String strObj=new String(char charArray); String strObj=new String(char charArray,int startIndex,int numChar

36、s); 如:char charArray1=h,e,l,l,o; char charArray2=h,e,l,l,o,j,a,v,a; String s1=new String(charArray1); String s1=new String(charArray2,1,5),3.6 字符串的处理,3.6.1 字符串的生成 常用方法:也可以用字符串常量初始化一个String对象 例:String s=“hello Java“;,3.6 字符串的处理,3.6.1 字符串的生成 通过类StringBuffer的构造方法生成可变的字符串对象,格式: StringBuffer strObj=new S

37、tringBuffer(); StringBuffer strObj=new StringBuffer(int num); StringBuffer strObj=new StringBuffer(String str);,3.6 字符串的处理,3.6.2 字符串的访问 Java提供了连接运算符“+”,可将其它各类型的数据转换为字符串,并连接形成新的字符串,“+”运算是通过StringBuffer类和它的append方法实现的 。 如在Sytem.out.println()方法中经常用到。,3.6 字符串的处理,3.6.3 String类 的常用方法 1length() 2charAt(int

38、 n) 3toLowerCase() 4toUpperCase() 5subString(int beginIndex) 6 subString(int beginIndex,int endIndex),3.6 字符串的处理,3.6.3 String类 的常用方法 7replace(char oldChar,char newChar) 8. replaceAll(String oldStr, String newStr) 9. replaceFirst(String oldStr, String newStr) 10. toCharArray() trim() /压缩头部和尾部的空格 inde

39、xOf(String str) /不存在则返回-1,3.6 字符串的处理,3.6.4 StringBuffer类 的常用方法 1、deleteCharAt(int index):删除指定位置index上的字符 2、insert(int offset,String subStr):在给定的字符串的offset位置插入字符串subStr 3、append(String strObj):在给定的字符串末尾添加中一个字符串strObj 4、delete(int beginIndex,int endIndex):删除从beginIndex开始到endIndex结束之间的字符。如:str.delete(4

40、,9);从字符串str中删除第4到第9共6个字符,结果仍然存放在str中,3.6 字符串的处理,实例1:字符串String类应用举例 /StringOp.java-String类字符串的常用操作 public class StringOp public static void main(String args) String s1=“AbCdEf中国湖南Changsha“; String s2=“ABbCEFgh长沙410004LoadXiangzhang“; System.out.println(“字符串s1为:“+s1); System.out.println(“字符串s1的长度为:“+s

41、1.length(); System.out.println(“字符串s2为:“+s2); System.out.println(“字符串s2的长度为:“+s2.length(); System.out.println(“s1大写形式是:“+s1.toUpperCase(); System.out.println(“s2小写形式是:“+s2.toLowerCase();,3.6 字符串的处理,for (int i=0;is1.length();i+) System.out.println(“s1中的第“+i+“个字符是:“+s1.charAt(i); System.out.println(“s

42、1+s2=“+s1+s2); if(pareTo(s2)=0) System.out.println(“s1与s2相等“); else System.out.println(“s1与s2不相等“); if (s1.indexOf(s2)!=-1) System.out.println(“s2是s1的子串“); System.out.println(“s2在s1中的位置为:“+s1.indexOf(s2); else System.out.println(“s2不是s1的子串“); System.out.println(“经过以上操作,s1与s2没有变化:“); System.out.print

43、ln(“字符串s1仍然为:“+s1); System.out.println(“字符串s2仍然为:“+s2); ,3.6 字符串的处理,实例2:字符串StringBuffer类应用举例-反转字符串中的字符 public class StringBufferOperationDemo public static void main(String args) String s = “0123456789“; System.out.println(“原来s=“+s); int l = s.length(); StringBuffer buffer = new StringBuffer(l); for

44、(int j=l-1;j=0;j-) buffer.append(s.charAt(j); System.out.println(“反转后s=“+buffer); ,3.7 JDK的帮助系统,3.7.1 html格式的JDK文档 主界面由两大部分组成:一部分是导航标题,另一部分是结构图。 1导航栏 导航栏包括Search、General Info、 API & Language、Guide to Features、Tool Docs、Demos/Tutorials共6个项目,3.7 JDK的帮助系统,3.7.1 html格式的JDK文档 2JAVA平台结构 JAVA平台结构由7部分组成,每一部

45、分又包括若干链接对象 Development Tools&APIS ,Development Technologies ,User Interface Toolskit ,Integration APIS ,Core APIS ,Java Virtual Machine ,Platforms,3.7 JDK的帮助系统,3.7.2 chm格式的JDK文档 chm格式的JDK文档具有更加强大的查询功能,更加适合于初学者使用 如:要查类Integer的方法和有关内容,在左边“索引”标签处,输入要查找的关键字Integer,并回车,系统会显示与Integer有关的类、方法、包 它可以提供类的继承关系、构造方法、常量、方法等详细信息。,

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

当前位置:首页 > 其他


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