1、3 Sept.2008 Neusoft Confidential第三章第三章 面向对象基础面向对象基础目标目标:介绍面向对象编程的基本思想,通过本课的学习,应该掌握介绍面向对象编程的基本思想,通过本课的学习,应该掌握如下知识:如下知识:1)理解什么是类、对象、构造方法,)理解什么是类、对象、构造方法,2)对象在内存中的表现形式及如何使用对象等。)对象在内存中的表现形式及如何使用对象等。3)Java的垃圾回收机制及访问修饰符。的垃圾回收机制及访问修饰符。本章要点本章要点类和对象的关系面向对象的思想子类实例化的过程对象的创建构造方法变量的初始化顺序对象创建的内存模型垃圾回收机制Java中的关键字t
2、his关键字static关键字主要内容主要内容类和对象的关系类和对象的关系1构造方法构造方法2对象创建的内存模型对象创建的内存模型3Java中的关键字中的关键字4类和对象的关系类和对象的关系面向对象的思想(面向对象的思想(Object Oriented Programming,简称,简称OOP)面向对象的基本思想是,从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式面向对象更加强调运用人类在日常的思维逻辑中经常采用的思维方法与原则面向对象的三个特征面向对象的三个特征封装继承多态类和对象的关系类和对象的关系面向对象与面向过程面向对象与面向过程public
3、class Icebox static void putThings(String things)System.out.println(把冰箱门打开);System.out.println(把+things+放进来);System.out.println(把冰箱门关上);void OpenIcebox()printf(“把冰箱门打开把冰箱门打开n);void PutElephantI()printf(“把大象放冰箱把大象放冰箱n);void CloseIcebox()printf(“把冰箱们关上把冰箱们关上n);int main()OpenIcebox();PutElephantIn();Cl
4、oseIcebox();public class Mine public static void main(String args)Icebox.putThings(大象);面向对面向对象象面向过程面向过程类和对象的关系类和对象的关系类的定义类的定义把相似的对象划归成一个类。在软件设计中,类,就是一个模板,它定义了通用于一个特定种类的所有对象的属性(变量)和行为(方法)。类和对象的关系类和对象的关系类的定义类的定义?西游记游戏软件中的游戏人物孙悟空:孙悟空的武器是金箍棒,战斗力五颗星,耐力五颗星唐 僧:唐僧没有武器,战斗力为零,耐力五颗星猪八戒:猪八戒的武器是耙子,战斗力四颗星,耐力两颗星沙
5、僧:沙僧的武器是月牙铲,战斗力三颗星,耐力四颗星类和对象的关系类和对象的关系类的定义类的定义修饰符一般为public,也可以没有修饰符。注意类名的命名规范。类名一般大写类的成员:成员变量(属性)成员函数(方法)通过“.”调用属性和方法访问权限控制符 class 类名 类的成员 类的完全声明形式类的完全声明形式public abstract|final class 类名称类名称 extends 父类名称父类名称 implements 接口名称列表接口名称列表 变量成员声明及初始化;变量成员声明及初始化;方法声明及方法体;方法声明及方法体;变量声明格式变量声明格式public|protected|
6、private public|protected|private staticstatic finaltransient volatile finaltransient volatile变量数据类型变量数据类型 变量名变量名1=1=变量初值变量初值,变量名变量名2=2=变量初值变量初值,;格式说明格式说明publicpublic、protectedprotected、private private 为访问控制符为访问控制符staticstatic指明这是一个静态成员变量指明这是一个静态成员变量finalfinal指明变量的值不能被修改指明变量的值不能被修改transienttransient指
7、明变量是临时状态指明变量是临时状态volatilevolatile指明变量是一个共享变量指明变量是一个共享变量类的方法声明格式类的方法声明格式:public|protected|privatestaticfinalabstractnativesynchronized 返回类型返回类型 方法名方法名(参数列表参数列表)throws exceptionList 方法体方法体;格式说明方法修饰public、protected、private 为存取控制符static指明方法是一个类方法final指明方法是一个终结方法abstract指明方法是一个抽象方法native用来集成java代码和其它语言的代
8、码synchronized用来控制多个并发线程对共享数据的访问方法调用给对象发消息意味着调用对象的某个方法给对象发消息意味着调用对象的某个方法从对象中取得信息从对象中取得信息 修改对象的状态或进行某种操作修改对象的状态或进行某种操作 进行计算及取得结果等进行计算及取得结果等调用格式调用格式.(参数列表)(参数列表)称点操作符称点操作符“.”前面的前面的为消息的接收者为消息的接收者(receiver)参数传递参数传递值值传递:参数类型为基本数据类型时传递:参数类型为基本数据类型时引用传递:参数类型为对象类型或数组时引用传递:参数类型为对象类型或数组时访问修饰符访问修饰符该类或非该类均该类或非该类
9、均可访问可访问public只有该类可以访只有该类可以访问问private相同数据包中的相同数据包中的类可以访问类可以访问default该类及其子类的该类及其子类的成员可以访问,成员可以访问,同一个包中的类同一个包中的类也可访问也可访问protected访问修饰符访问修饰符访问修饰符可访问性位置位置private默认默认protected public同一个类同一个类是是是是是是是是同一个包内的类同一个包内的类否否是是是是是是不同包内的子类不同包内的子类否否否否是是是是不同包并且不是子不同包并且不是子类类否否否否否否是是类和对象的关系类和对象的关系类的定义类的定义Employee.javacla
10、ss Employee String name;int age;double salary;public String showName()System.out.println(name);return name;public int showAge()System.out.println(age);return age;public void updateName(String name2)name=name2;public void getSalary()System.out.println(The salary of this month is 2000);属性属性方法方法类和对象的关系
11、类和对象的关系类的定义类的定义 练习 Person.java定义一个Person类,Person类具有名字、年龄及性别等属性,并具有一个getInfo()方法可以打印出Person类的属性,sayHello()方法和大家说“Hello everybody!”类和对象的关系类和对象的关系类的定义类的定义 练习 Point.java 定义一个点类Point,包含两个成员变量x、y分别表示x和y的坐标,一个movePoint(int dx,int dy)方法实现点的位置的移动。public class Pointint x,y;void movePoint(int dx,int dy)x=dx;y=
12、dy;类和对象的关系类和对象的关系类的定义类的定义 练习 MyDate.java 定义一个点日期MyDate,包含三个成员变量year、month、day分别表示年、月、日,以及每个属性对应的get和set方法(如,year有getYear()方法用来获得日期的年份,还有setYear(int y)方法用来修改或设置日期的年份),最后还有printDate()方法,调用该方法可以把日期按照“yyyy-mm-dd”的形式输出。类和对象的关系类和对象的关系类和对象的关系类和对象的关系类(class)是对某一类事物的描述对象(object)是实际存在的某类事物的个体,也称为实例(instance)类
13、是创建对象的模板,对象是类的实例。类和对象的关系类和对象的关系对象的创建对象的创建语法格式示例 TestEmployee.java类名类名 对象名对象名=new 构造函数构造函数Employee zhang=new Employee()类和对象的关系类和对象的关系对象的创建对象的创建 练习 TestPerson.java在TestPerson类里写一个main方法,在main()方法中:创建一个Person类的对象这个对象的名字叫小沈阳,年龄28,性别男在控制台中打印这个实例的信息并调用这个对象的sayHello()方法,向大家问好类和对象的关系类和对象的关系对象的创建对象的创建 练习 Tes
14、tPoint.java在TestPoint类里写一个main方法,在main()方法中:创建一个Point类的对象 这个点的坐标是(3,2)将这个点移动到坐标为(5,6)的位置并把移动后的点的坐标按“(x,y)”形式打印在控制台上类和对象的关系类和对象的关系对象的创建对象的创建 练习 TestDate.java在TestDate类里写一个main方法,在main()方法中:创建一个MyDate类的对象 通过setXXX方法将该日期对象的时间设置为“2013年10月8日”在控制台上打印该对象的月份 把该日期对象按“2013-10-8”的格式输出类和对象的关系类和对象的关系匿名对象匿名对象创建完对
15、象,在调用该对象的方法时,也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫匿名对象使用匿名对象的情况如果对一个对象只需要进行一次方法调用new Person().sayHello()Person p1=new Person();p1.sayHello();Contents类和对象的关系类和对象的关系1构造方法构造方法2对象创建的内存模型对象创建的内存模型3Java中的关键字中的关键字4构造方法构造方法构造方法构造方法(构造函数/构造器,Constructor)具有与类相同的名称不含返回值类型不能在方法中用return语句返回一个值一般访问权限为public 在一个类中,具有上述特
16、征的方法就是构造方法。构造方法的作用构造方法的作用完成对象的创建,即完成对象的实例化一般使用构造方法来完成对成员变量的初始化 示例 TestPerson.java构造方法构造方法默认的构造方法默认的构造方法在Java中,每个类都至少要有一个构造方法,如果程序员没有在类里定义构造方法,系统会自动为这个类产生一个默认的构造方法一旦编程者为该类定义了构造方法,系统就不再提供默认的构造方法class Employee public Employee()class Employee构造方法构造方法 练习 下列关于类的定义的选项中,哪些可以通过下列关于类的定义的选项中,哪些可以通过new Thing()方
17、法来方法来创建该类的一个对象创建该类的一个对象_?A.public class Thing B.public class Thing public Thing()C.public class Thing D.public class Thing public Thing(void)public Thing(String s)E.public class Thing public void Thing()public Thing(String s)答案:A、B构造方法构造方法 练习 给定下列代码的执行结果是_?public class A void A()System.out.println(“
18、Class A”);public static void main(String args)new A();A.Class A B.在第2行处抛出异常 C.编译错误 D.在第6行处抛出异常 E.代码执行后没有输出答案:E构造方法构造方法类和对象的关系类和对象的关系 练习 XiyoujiRole.java构造一个完整的西游记人物类,并定义一个构造方法,通过这个方法可以创建不同的西游记人物,并写一个main函数进行验证。孙悟空:孙悟空的武器是金箍棒,战斗力五颗星,耐力五颗星唐 僧:唐僧没有武器,战斗力为零,耐力五颗星猪八戒:猪八戒的武器是耙子,战斗力四颗星,耐力两颗星沙 僧:沙僧的武器是月牙铲,战
19、斗力三颗星,耐力四颗星方法的重载方法的重载方法的重载(方法的重载(overload)函数的重载就是在同一个类中允许同时存在一个以上同名的函数方法重载的规则方法重载的规则函数名称相同函数的参数必须不同参数个数不同 或参数类型不同函数的返回值类型可以相同,也可以不同方法的重载方法的重载方法的重载(方法的重载(overload)方法的重载方法的重载 练习 下列选项中,哪些可以与下列选项中,哪些可以与void setAge(int year,int month,int day)方法在同一个类中定义方法在同一个类中定义_?A.public void setAge()B.void setAge(int a
20、ge)C.void setAge(int y,int m,int d)D.int setAge(Date d)E.int setAge(int year,int month,int day)F.void setage(int year,int month,int dat)答案:ABDF方法的重载方法的重载 练习 Person.java在上一个Person类的基础上,完成以下功能:声明一个有参的构造方法,使得通过调用该构造方法可以对Person类的三个成员变量进行初始化再声明一个无参的构造方法,实现构造方法的重载方法的重载方法的重载 练习 MethodAdd.java在类MethodAdd中,声
21、明三个方法add,分别计算两个整数的和三个整数的和、两个双精度浮点数(double)数的和,并在该类写一个主程序中调用这个三个函数,并将其结果打印Contents类和对象的关系类和对象的关系1构造方法构造方法2对象创建的内存模型对象创建的内存模型3Java中的关键字中的关键字4对象创建的内存模型对象创建的内存模型引用类型变量引用类型变量除了8种基本数据类型的变量,其他变量都是引用类型变量类(class)接口(interface)数组Person p;Animal a;int c;对象创建的内存模型对象创建的内存模型0 x80001.7444“lisi”Person p0 x8000nameag
22、eheightPerson p =new Person(“lisi”,44,1.74);引用类型变量的内存模型引用类型变量的内存模型对象创建的内存模型对象创建的内存模型0 x80000 x30001.7444“lisi”Person p0 x3000nameageheight1.7333“zhang”nameageheightPerson q0 x8000引用类型变量的内存模型引用类型变量的内存模型Person p =new Person(“zhang”,33,1.73);Person q =new Person(“lisi”,44,1.74);变量的作用域变量的作用域变量的作用域变量的作用域
23、全局变量类体中声明的成员变量为全局变量全局变量在类的整个生命周期中都有效局部变量方法体中声明的变量,方法中的参数,或代码块中声明的变量,都是局部变量局部变量只在方法调用的过程中有效,方法调用结束后失效变量的作用域变量的作用域变量的作用域变量的作用域class Employee String name;int age;double salary;public String showName()String hello=“你好你好”;System.out.println(hello+name);return name;public void updateName(String name2)name
24、=name2;全局变量全局变量局部变量局部变量变量的作用域变量的作用域变量初始化的顺序变量初始化的顺序 隐式赋予变量默认值 成员变量 显式赋予初始值 通过构造方法体赋予新值 示例 PersianCat.java各类型变量默认初始化值类型类型缺省值缺省值类型类型缺省值缺省值byte(byte)0charu0000 short(short)0float0.0Fint0double0.0Dlong0L引用对象nullbooleanfalse变量的作用域变量的作用域 练习 给定下列代码的执行结果是_?public class X(private static int a;public static v
25、oid main(String args)modify(a);System.out.println(a);public static void modify(int a)a+;A.0 B.1 C.编译错误 D.运行时异常答案:A程序执行过程 硬盘硬盘 程序程序 .java 编译编译 .class 文件文件内存内存 执行过程中的内存管理执行过程中的内存管理代码JVM系统代码 装载到内存区装载到内存区stackheapdata segmentcodesegment 找到找到main方法开始执行方法开始执行基本数据类型变量基本数据类型变量引用类型变量地址引用类型变量地址引用引用变量变量静态变量静态变
26、量常量常量存放代码存放代码Java代码在系统中的执行过程补充:参数传值补充:参数传值当方法被调用时,如果方法有参数,参数必须要实例化,当方法被调用时,如果方法有参数,参数必须要实例化,即参数变量必须有具体的值。即参数变量必须有具体的值。public class Date /类声明类声明 int year,month,day;/成员变量,表示年、月、日成员变量,表示年、月、日 void setDate(int y,int m,int d)/成员方法,设置日期值成员方法,设置日期值 /无返回值,有无返回值,有4个参数个参数 year=y;month=m;day=d;public static vo
27、id main(String args)Date1 aday=new Date1();/创建对象创建对象 aday.setDate(2013,9,28);/调用类方法调用类方法 1基本数据类型基本数据类型参数的传值参数的传值值值这种数据传递方式被称为是值传递,方法接收参数的值,但不能改变这些参数的值。2引用类型引用类型参数的传值参数的传值地址地址引用传值方式引用传值方式:Java的引用类型数据包括对象、数组和接口对象、数组和接口,当方法中参数是引用类型时,引用数据类型传递给方法的是数据在内存中的地址地址,方法中对参数变量的操作可以改变原变量的值。class People String face
28、;void setFace(String s)face=s;class C void f(int x,double y,People p)x=x+1;y=y+1;p.setFace(笑脸笑脸);System.out.println(参数参数x和和y的值分别是的值分别是:+x+,+y);System.out.println(参数对象参数对象p的的face是是:+p.face);public class Ep4_8 public static void main(String args)int m=100;double n=100.88;People zhang=new People();zhan
29、g.setFace(很严肃的样子很严肃的样子);C a=new C();a.f(m,n,zhang);System.out.println(main方法中方法中m和和n的值仍然分别是的值仍然分别是:+m+,+n);System.out.println(main方法中对象方法中对象zhang的的face是是:+zhang.face);zhang.face=很严肃的样子;改变形参值 导致实参值的改变zhang.face=“笑脸;参数x和y的值分别是:101,101.88参数对象p的face是:笑脸main方法中m和n的值仍然分别是:100,100.88main方法中对象zhang的face是:笑脸
30、补充内容补充内容对象数组对象数组在Java中不但可以声明由原始数据组成的数组,还可以声明由对象组成的数组;声明对象数组的方式如:/假设已经定义了一个假设已经定义了一个Student类类/*声明由声明由5个个Student对象组成的数组对象组成的数组*/Student stdAry=new Student5;对象数组对象数组=引用数组引用数组错误的理解方式错误的理解方式学生对象的实例学生对象的实例学生对象的实例学生对象的实例学生对象的实例学生对象的实例学生对象的实例学生对象的实例学生对象的实例学生对象的实例01244堆堆栈栈stdAry堆堆栈栈stdAry正确的理解方式正确的理解方式对象的引用对
31、象的引用01244对象的引用对象的引用对象的引用对象的引用对象的引用对象的引用对象的引用对象的引用对象数组示例对象数组示例/*对象数组示例,假设已经定义了对象数组示例,假设已经定义了Student类类*/public static void main(String args)/*创建包含有创建包含有5个个Student引用的数组引用的数组*/Student stdAry=new Student5;/*逐一为每个引用创建对象实例逐一为每个引用创建对象实例*/stdAry0=new Student(张三张三,18);stdAry1=new Student(李四李四,20);stdAry2=new
32、Student(王五王五,24);stdAry4=new Student(郑六郑六,21);stdAry4=new Student(田七田七,19);for(int i=0;i stdAry.length;i+)stdAryi.display();对象数组的存放形式对象数组的存放形式堆堆栈栈stdAry0124stdAry0stdAry1stdAry2stdAry4stdAry44张三张三18李四李四20王五王五24郑六郑六21田七田七19垃圾回收机制垃圾回收机制垃圾回收器(垃圾回收器(GC,Garbage Collection)Java的一个重要特点句是具有一个垃圾回收器,并且能够自动回收垃
33、圾,这也是Java相对于其他语言有优势的地方对内存的释放和回收的工作是由Java运行系统(JRE)承担的,不用编程者关注在Java程序运行过程中,一个垃圾回收器会不定时地被唤起检查是否有不再被使用的对象,并释放它们所占用的内存空间垃圾回收器的启用不由程序员控制,也无规律可循垃圾回收机制垃圾回收机制垃圾回收机制垃圾回收机制 System.gc()、nullJava里提供了一个System.gc()方法,使用这个方法可以建议垃圾回收器回收垃圾在Java中,可以通过将对象的引用变量设置为null,来暗示垃圾回收器来回收该对象class Employee String name;int age;dou
34、ble salary;public static void main(String args)Employee e=new Employee();new Employee();e=null;System.gc();System.out.println(“The program is end”);垃圾回收机制垃圾回收机制后台线程后台线程主线程主线程Object o2=new Object();o2=null;Object o1=new Object();o1 objectThe heap检查出对象没有引用指向调用o2对象的finalize()方法垃圾回收机制回收分配给该对象的内存垃圾回收采用Ja
35、va多线程机制o2 object 垃圾回收机制垃圾回收机制垃圾回收机制垃圾回收机制 练习 什么时候程序会销毁一个对象x_?A.x.delete()B.x.finalize()C.System.gc()D.设置对象的引用为null F.只有垃圾回收器才可以销毁一个对象答案:FContents类和对象的关系类和对象的关系1构造方法构造方法2对象创建的内存模型对象创建的内存模型3Java中的关键字中的关键字4Java中的关键字中的关键字this关键字关键字代表对象自身的引用一个引用指向调用该方法的当前对象通常在类的方法定义中使用用用this关键字的情况关键字的情况方法中的变量与成员变量重名在一个构造
36、方法中,调用其它重载的构造方法返回当前对象的引用 成员变量和局部变量成员变量和局部变量public class Employee int sideA,sideB,sideC;void setSide(int sideA,int sideB,int sideC)this.sideA=sideA;this.sideB=sideB;this.sideC=sideC;注:注:如果局部变量的名字与成员变量的名字如果局部变量的名字与成员变量的名字相同相同,则成员变量被隐藏,这时,则成员变量被隐藏,这时如果想在该方法内使用成员变量,必须使用关键字如果想在该方法内使用成员变量,必须使用关键字this。Java
37、中的关键字中的关键字static关键字关键字static可以修饰的元素属性方法代码块需要注意的问题需要注意的问题只能修饰类成员,不能修饰局部变量。Java中的关键字中的关键字static修饰的变量修饰的变量 静态变量静态变量所有对象共享也称为类变量用static修饰的成员变量,它们在类被载入时创建,只要类存在,static变量就存在两种方式访问:直接访问:类名.属性;实例化后访问:对象名.属性静态属性静态属性Java中的关键字中的关键字static变量的内存模型变量的内存模型Java中的关键字中的关键字 练习 Person.java在Person类中添加一些代码,使其可以统计在整个使用过程中一
38、共产生了多少个Person类的实例对象提示:利用static修饰的变量Java中的关键字中的关键字static修饰的方法修饰的方法 静态方法静态方法不需要实例化,可以直接访问也称为类方法两种方式访问:直接访问:类名.方法名()实例化后访问:对象名.方法名()static方法的作用方法的作用简化方法的使用;便于访问静态属性;注意事项注意事项静态方法里只能直接访问静态成员,而不能直接访问类中的非静态成员静态方法中不能使用this、super关键字静态方法不能被非静态方法覆盖,静态方法不能修饰构造方法静态方法静态方法Java中的关键字中的关键字static修饰的代码块修饰的代码块 静态代码块静态代码
39、块一个类中由static关键字修饰的,不包含在任何方法体中的代码块当类被载入时,静态代码块被执行,且只被执行一次静态块经常用来进行类属性的初始化静态代码块静态代码块Java中的关键字中的关键字 练习public class CircleStatic static double pi=3.14;int radius=100;public static void main(String args)System.out.println(_1_);/打印pi _2_;System.out.println(_3_);/打印radius 答案:1.pi2.CircleStatic c=new CircleStatic()3.c.radius总总 结结类和对象的关系如何定义类对象的创建构造方法如何定义构造方法方法的重载对象创建的内存模型引用类型变量变量的初始化垃圾回收机制Java中的关键字this关键字static关键字