Java程序设计第三章面向对象程序设计山东科技大学信息科学与工程学院2面向对象概述类、域、方法和实例对象继承性多态性包(package)封装性关键字abstract、static、final和this接口内部类变量作用域范围和参数传递方式面向对象程序设计基本思想主要内容为什么需要面向对象编程?32020/1/104面向对象程序设计整体介绍传统的程序设计风格存在着数据抽象简单、信息完全暴露、算法复杂、无法很好地描述客观世界等缺点,可重用性差,如果软件项目庞大,程序的调试和维护将变得异常困难。面向对象的基本思路:首先分析问题并建立相应的对象,然后通过这些对象以及它们之间的配合解决问题,是模拟现实生活求解的一般过程。5面向对象概述(2)面向对象的基本思路对象表示现实世界中某个具体的事物。事物可分为两大部分:物质:表达具体的事物意识:描述抽象的概念现实问题空间面向对象解空间物质对象(客观存在的)意识类(抽象的概念)2020/1/106类的定义classPeople{intmouth;inthand;intfoot;voidwalk(){…}voidstand(){…}voidspeak(){…}}计算机中的对象的原型现实生活中的对象2020/1/107classCar{intengine;intwheel;voidrun(){…}voidstop(){…}voidslowDown(){…}voidbackward(){…}}计算机中的对象的原型现实生活中的对象类的定义8面向对象概述(3)面向对象的程序设计(OOP,ObjectOrientedProgramming)–将数据(属性)和方法(行为或功能)封装到类(classes)中:数据与方法常常是紧密相关的。–对象(objects):类的实例对象或类本身–三个基本特性:封装性、继承性和多态性9面向对象概述(4)结构化程序设计对应的典型的计算机语言,例如:C面向操作(action)的函数(方法)是程序的基本单位面向对象程序设计对应的典型的计算机语言,例如:Java、C++面向对象(object)的类(class)是程序的基本单位方法(函数)被封装在类中数据也常常被封装在类中10面向对象概述类、域、方法和实例对象继承性多态性包(package)封装性关键字abstract、static、final和this接口内部类变量作用域范围和参数传递方式面向对象程序设计基本思想主要内容11类、域、方法和实例对象(1)类(class)本身也是一种对象类(class)同时也是实例对象的模板类(class)的基本组成:(成员)域和(成员)方法每个对象:拥有内存存储成员域/方法静态的成员域/方法属于类其它成员域/方法属于实例对象12类、域、方法和实例对象(2)类定义的语法格式如下:[类修饰词列表]class类名[extends父类名][implements接口名称列表]{类体}publicclassJ_TeacherextendsJ_Employee{publicintm_classHour;//授课的课时publicJ_Teacher(){m_classHour=96;}//J_Teacher构造方法结束publicvoidmb_printInfo(){System.out.println(该教师的工作年限为+m_workYear);System.out.println(该教师授课的课时为+m_classHour);}//方法mb_printInfo结束}//类J_Teacher结束P6713类、域、方法和实例对象(3)类定义的语法格式如下:[类修饰词列表]class类名[extends父类名][implements接口名称列表]{类体}说明:1)方括号[]表示可选项;2)类修饰词包括:public,protected,private,abstract,final,strictfp;3)如果类修饰词列表包括public,则该类的命名须与所在的文件同名;4)如果类修饰词列表不包括public,则该类只能在当前的软件包使用;5)同一个Java源文件可以包含多个类,但是不能有两个或两个以上类的修饰词包括public;6)extends表示继承某一父类;7)implements表示实现一个或多个接口;8)类体定义包括:构造方法,成员域(Field),成员方法(method)。这三者出现的顺序没有限制。14类、域、方法和实例对象(4)类的成员域(Field)通常用来表示和存储类所需要的数据,定义格式如下:[成员域修饰词列表]类型变量名或带初始化的变量名列表说明:1)域修饰词为可选项包括:public,protected,private,static,final,transient,volatile;2)static表示当前成员域是静态的;3)final表示该成员在首次赋值之后不能再修改;4)transient表示该成员域是暂时的,在对象保存时可以不进行保存;5)volatile表示多线程程序中,访问该成员域将采用同步机制。15类、域、方法和实例对象(5)类的成员方法(Method)通常用来实现类所需要的各种功能,定义格式如下:[方法修饰词列表]返回类型方法名(方法的参数列表){方法体}说明:1)方法修饰词包括:public,protected,private,abstract,static,final,synchronized和strictfp;2)abstract表示当前方法是抽象成员方法,不能有方法体;3)static表示当前方法是静态成员方法;4)final表示当前方法所在类的子类不能出现同名方法;5)synchronized表示当前方法是同步成员方法;6)返回类型可以是void、基本数据类型和引用数据类型;7)参数格式为:类型参数变量名;多个参数用逗号隔开;8)在方法无参数时,也不能将方法的参数列表写成void;publicstaticvoidmain(stringargs[])类、域、方法和实例对象(4)volatile与synchronized区别:1)volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.2)volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.3)volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized则可以保证变量的修改可见性和原子性.4)volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.5)volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化.17类、域、方法和实例对象(6)类的构造方法用来实现类所需要的各种初始化功能,定义格式如下:[构造方法修饰词列表]方法名(方法的参数列表){方法体}说明:1)构造方法修饰词包括:public,protected,private;2)构造方法名必须与类名相同;3)构造方法没有返回类型,也不能写成void;4)每个类都至少有一个构造方法,如果没有显式定义,则系统为自动为该类定义一个不含参数的默认构造方法;如果有显式定义,则系统不会创建默认的构造方法;创建类实例对象的格式如下:new构造方法名(构造方法调用参数列表)18类、域、方法和实例对象(7)类引用:使用引用数据类型来引用类(P62)。定义格式如下:类名变量名或带初始化的变量名列表例如:Integera=newInteger(11);说明:1)其中a是引用数据类型变量;2)引用数据类型变量也包括4个属性:变量名、数据类型、存储单元和值;…变量a...类Integer的实例对象变量a的存储示意图19类、域、方法和实例对象(8)类实例对象的构造,构造一个实例对象的过程如下:1)首先内存中创建该实例对象;2)然后初始化带初始化值的成员域;3)调用构造方法完成实例对象的初始化工作。4)构造完毕后,可以通过实例对象的引用来访问该实例对象的成员域和成员方法,具体格式如下:引用变量名.成员域名引用变量名.成员方法名例如:a.intValue()注:构造时各种类型的默认值:基本数值类型:0;boolean:false;引用数据类型:null20类、域、方法和实例对象(9)类实例对象的销毁(P63):在java语言中,对类的实例对象内存的回收是通过垃圾回收机制完成的。1)不被Java程序使用的内存成为垃圾(garbage)。2)对于一个实例对象,如果没有引用指向它,那么该实例对象所占据的内存就成为了垃圾。例如:3)Java虚拟机会使用一定的算法来回收这些垃圾,但并不保证先申请的存储单元会被先释放。4)通过直接调用JavaAPI中类System的方法gc()方法可以申请尽快回收(GarbageCollecting)。5)每个类都含有一个finalize()的成员方法,在实例对象内存被回收之前,会调用该方法。该方法是类java.lang.object的成员方法。Integera=newInteger(11);a=null;此时创建的Integer实例对象成为垃圾。21类、域、方法和实例对象(10)类实例对象的生命周期:从创建、使用、废弃到回收的整个过程。以下是生命周期的例子:J_Finalized.java其中:J_Book(2)和J_Book(3)的内存会被立即回收,而有引用book1的J_Book(1)则会在程序执行完后被回收内存。22面向对象概述类、域、方法和实例对象继承性多态性包(package)封装性关键字abstract、static、final和this接口内部类变量作用域范围和参数传递方式面向对象程序设计基本思想主要内容23继承性(1)面向对象的三大特性:继承性,多态性和封装性。问题:为什么要有继承性?-节省工作量,提高效率。继承性:软件重用的一种方法,其定义格式如下:所有类都有一个默认的父类:java.lang.object。继承具有传递性:类A的父类为类B,类B的父类为类C,则类C可称为类A的父类。[类修饰词列表]class类名[extends父类名][implements接口名称列表]类体}24继承性(2)类继承可通过关键词extends或implements来实现。extends只能指定一个父类(java.lang.object除外),该父类称为直接父类。implements可实现多个接口。子类和父类的构造方法之间存在如下约束关系:子类的构造方法必须调用父类的构造方法,并且该语句必须是子类构造方法的第一条语句。调用格式如下:super(参数列表)其中:1)super为关键字,参数列表须与父类的某个构造方法相匹配。2)如果在子类构造方法里没有书写调用父类构造方法的super语句,则java虚拟机会自动隐式地在子类构造方法的最前面插入super()语句;此时如果父类没有不含任何参数的构造方法,则编译将出错。25继承性(3)类继承的示例(J_Teacher.java):职工和教师之间的继承。classJ_Employee{publicintm_workYear;//工作的年限publicJ_Employee(){m_workYear=1;}//J_Employee构造方法结束}//类J_Employee结束继承于publicclassJ_TeacherextendsJ_Employee{publicintm_classHour;//授课的课时publicJ_Teacher(){m_classHour=96;}//J_Teacher构造方法结束publicvoidmb_printInfo(){System.out.println(该教师的工作年限为+m