1、利用数据抽象和数据隐藏技术创建类创建和使用对象对属性和方法进行访问方法的重载构造方法及其使用this引用的用法static方法和属性的使用类的组合方法包的创建和使用面向过程的程序设计中,问题被看作一系列需要完成的功能模块,函数(泛指高级语言实现功能模块的实体)用于完成这些任务,解决问题的焦点是编写函数,函数是面向过程的,它关注如何依据规定的条件完成指定的任务。在多函数程序中,许多重要的数据被放置在全局数据区,这样它们可以被所有的函数访问(每个函数还可以具有它们自己的局部数据),这种数据和对数据的操作相分离的结构很容易造成全局数据在没商量的情况下被改动,因而程序的正确性不易保证。面向对象的程序设
2、计将数据和对数据的操作行为封装在一起,作为一个相互依存、不可分割的整体-类。类中的大多数数据只能为本类的行为使用,类会提供公开的外部接口与外界进行通信。类是抽象的数据类型,用类创建对象。程序的执行,表现为一组对象之间的交互通信。对象之间通过公共接口进行通信,从而完成系统功能。面向对象的程序模块间关系简单,程序的独立性高、数据安全。面向对象的显著特点包括:封装性、继承性和多态性。封装:把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部细节。“封装”的两个含义 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位 实现“信息隐蔽”,尽可能隐藏对象的内部细节,对外界形成一个边
3、界,只保留有限的外部接口与外界进行联系。类作为一个抽象的数据类型,用来描述相同类型的对象。面向对象编程就是定义这些类。“抽象”是面向对象设计中的重要环节。面向过程程序设计:自顶向下,逐步求精面向对象设计:从设计类开始,然后向类中添加方法面向对象的思维方式:以对象为中心,分析对象的行为、状态,抽取出类的设计。有一个酒店,酒店有若干客房,向客户提供查询、有一个酒店,酒店有若干客房,向客户提供查询、入住、退房等功能。入住、退房等功能。名词对象动词对象的行为酒店酒店 客房客房 客户客户查询查询入住入住退房退房1定义类的语法格式类的修饰符 class 类名 extends 父类名 /类体【例4-1】定义
4、一个酒店类Hotel。(1)类的访问控制符(2)数据成员(成员变量):记录对象性质和状态的变量(3)数据成员的set和get方法(4)构造方法1.数据成员 修饰符 数据类型 成员名=默认值;例:privateprivate String hotelName;privateprivate String rooms;数据类型关键字缺省数值布尔型booleanfalse字符型charu0000字节型byte0短整型short0整型int0长整型long0浮点型float0.0F双精度型double0.0D引用类型类、接口null2.方法一般是对类中的数据成员进行操作数据访问公共接口:如果类中的数据成
5、员是private型的,则往往定义public的方法来设置数据成员的值或读取数据成员的值3.构造方法 构造方法名与类名相同 构造方法一般用于初始化类的对象 创建类的对象时,new运算符为该对象分配内存,并调用构造方法来初始化该对象如果一个类中未定义构造方法,则编译时系统会自动提供一个缺省的无参的构造构造方法,其方法体为空。public 类名()至少写一个无参的构造方法this 区分成员变量和方法的局部变量this()调用本类的其他构造方法对象是类的一个实例 类是抽象的,对象是具体的 酒店:类 某个酒店:对象对象:通过new关键字调用某个构造方法创建,为该对象分配内存空间,并按照构造方法的方法体
6、对对象的数据成员赋初值,创建好的对象在堆内存中。引用:Java不允许直接访问堆内存中的对象,只能通过对象的引用变量操作该对象,引用变量在栈内存中【例】酒店问题中的对象和引用。垃圾回垃圾回收收机制机制this:代表一个引用,指向正在调用该方法的当前对象。hotel.setHotelName(MiniStarwood);publicpublic voidvoid setHotelName(String hotelName)thisthis.hotelName=hotelName;【例4-2】设计swap()方法交换两个Hotel的对象。交换引用变量【例4-2】设计swap()方法交换两个Hotel
7、的对象。交换引用变量指向的数据当在类中声明一个成员时,可以指定它是为一个类的各个对象各自拥有(实例成员),还是为一个类的所有对象共享(类范围的成员)。类范围的成员称为静态成员,以关键字static声明。static数据成员:为类的对象所共享的数据static方法:工具方法,不必创建对象直接使用类名即可调用。Math.PIMath.random()Math.sin()虽然static成员也可以通过对象来引用,但是,绝对不鼓励这个方式。强烈建议使用类名类名.成员成员的形式进行存取,以区别于非static成员。在static方法中不允许使用非static成员在非static方法中既可以使用非stat
8、ic成员,也可以使用static成员生命周期【例4-3】定义含有static数据成员的Person类。publicpublic classclass Person publicpublic staticstatic String nationalitynationality=Chinese;/static成员 private private String name;/非static成员publicpublic staticstatic String getNationality()returnreturn name+:+nationality;/static方法访问非static成员,报错报错
9、publicpublic staticstatic voidvoid setNationality(String nationality)/static方法访问static成员Person.nationality=nationality;publicpublic voidvoid sayHello()/非static方法可以引用static成员System.out.println(hello,+nationality+!);publicpublic staticstatic voidvoid main(String args)newnew Person().sayHello();/创建Pers
10、on类的匿名对象调用sayHello方法【练习】编写一个学生类,包括学号、姓名、性别、年龄和记录学生总数的数据成员。(1)编写合理的重载构造方法。(2)编写各数据成员的set、get方法。(3)在测试类中创建学生数组存储学生对象,打印数组中每个学生的信息和当前学生总数。数据成员/局部变量?数据成员:属于每个对象/属于类?方法局部变量/代码块局部变量?数据成员存在于堆内存中,其释放由Java的垃圾回收机制控制),导致更大的内存开销;同时也扩大了变量的作用域,使程序的内聚性降低(软件设计的基本原则是高内聚、低耦合)代码段1:publicpublic classclass TestScope1 st
11、aticstatic intint i;/定义一个类数据成员作为循环变量publicpublic staticstatic voidvoid main(String args)forfor(i=0;i10;i+)System.out.println(i);【例4-4】变量的使用规则示例。代码段2:publicpublic classclass TestScope2 publicpublic staticstatic voidvoid main(String args)intint i;/定义一个方法局部变量做循环变量forfor(i=0;i10;i+)System.out.println(i)
12、;代码段3:publicpublic classclass TestScope3 publicpublic staticstatic voidvoid main(String args)forfor(intint i=0;i d:java_source javacjavac d .Hotel.java d .Hotel.java参数1“-d”:指定编译时在文件系统中创建与包对应的文件夹结构,必须使用。参数2:指定类文件(包结构+class文件)的存储位置。该参数由程序设计者按需指定。参数3:指定被编译的源文件。一定要保证按照路径可以找到被编译的源文件。2执行 完整的类名:包名.类名 执行cla
13、ss文件 在当前路径下可以按照包名结构找到被执行的类文件 必须使用完整的类名组合关系:“has a”,一个类的成员可以是其他类的引用。“HAS-A”关系体现了OO设计中类的专属性,类的专用化程度越高,在其他应用中就越可能被复用,OO设计不提倡用单独的类来完成大量不相关的操作。组合是OO设计中大量存在的类间关系。Course-courseName:String-courseHour:int+Course()+Course(courseName:String,couseHour:int)+setCourseName(courseName:String):void+getCourseName():S
14、tring+setCourseHour(courseHour:int):void+getCourseHour():intStudent-name:String-grade:int-courses:Course+Student()+setName(name:String):void+getName():String+setGrade(grade:iint):void+getGrade():int+setCourses(courses:Course):void+getCourse():Course+getHours():int+showMessage():voidClient+main(args:String):void