您好,欢迎访问三七文档
Sun服务第4章封装Sun服务封装第4章2/80目标当完成本章后,你应该能够:•定义类•创建并使用对象•定义构造器•理解并使用方法重载•使用this关键字•使用static关键字•使用public与private关键字•理解并定义枚举类•定义和导入包•使用内部类Sun服务封装第4章3/80封装•万事万物皆对象•类•对象•访问权限控制•类与对象•构造对象•方法重载•this句柄•static修饰符Sun服务封装第4章4/80万事万物皆对象•Everythingisobject!•数据库需求分析,分析实体、联系例如,学生Student、课程Course成绩SC•对象•物以类聚,人以群分Sun服务封装第4章5/80类•类的实例•类的属性•类的方法•定义类Sun服务封装第4章6/80类的实例•类的实例:灯泡•类的名称:Light•类的对外接口:开、关、变亮、变暗Sun服务封装第4章7/80类的属性•类似于数据库中实体的属性•可表示的状态•例如,要表示帐户,类Account帐号accountNumber余额balance以上均为该类的属性属性是类的静态属性,基本上都是名词Sun服务封装第4章8/80类的方法•类的方法:类的动态特性,即本身可操作或提供操作的接口方法主要是现实世界中具体的动作,动词例如,类帐户Account查询余额取款存款以上都是该类的方法Sun服务封装第4章9/80定义类•类的定义包括两部分:属性—成员变量操作—成员方法,方法•方法在Java语言中,所有的方法均属于相应的类,都是成员方法,没有不属于类的全局方法(如C/C++中的main()方法)Sun服务封装第4章10/80定义类•使用关键字class•类中包括:成员变量成员方法,方法•成员变量和方法均为类的成员•示例:帐户Sun服务封装第4章11/80对象•定义了类帐户Account后,只是对该类别进行了说明,描述了该类有哪些属性,可以进行哪些操作,但是这些都只是定义,还没有一个具体的帐户,也不能进行任何操作,类是抽象的•如何得到类的一个实例呢?对象使用关键字newSun服务封装第4章12/80new•Java语言的关键字,用于创建指定类的对象•语法:Accountac=newAccount();•等价于:Accountac;ac=newAccount();•语义:句柄ac,句柄(handle),引用对象的变量new真正地创建Account类的一个对象=表示左边的句柄引用右边的对象Sun服务封装第4章13/80运行Account•在main()方法中创建Account类的一个对象ac,输出该帐户的帐号、余额•ac这个对象的成员变量accountNumber和balance并没有进行明确的初始化,那么程序能够通过编译吗?•编译:javacAccount.java•运行:javaAccountSun服务封装第4章14/80变量分类•根据声明的地点,变量可分为:成员变量局部变量•区别:作用域初始化使用方式……Sun服务封装第4章15/80变量初始化•局部变量必须明确初始化,否则不能通过编译•成员变量编译器会进行默认初始化成员变量默认初始化Sun服务封装第4章16/80成员变量默认初始化Sun服务封装第4章17/80访问成员•通过句柄访问对象的成员•成员访问符:点号..前为对象,.后为成员.表示右边属于左边,是左边的成员成员变量、成员方法,二者区分方法•点号.在HelloWorld.java中在Account.java中Sun服务封装第4章18/80面向对象程序设计•类的分析:分析业务中有哪些类•类的设计:分析每个类有哪些属性和操作•类的实现:获取业务细节并实现•在main()方法中创建对象对象之间进行交互,模拟和完成现实世界中的实际业务Sun服务封装第4章19/80访问权限控制•表示访问权限,用于修饰类的成员包括成员变量和成员方法•Account.java中:privateStringaccountNumber;privatedoublebalance;publicStringgetAccountNumber();publicdoublegetBalance();publicvoiddeposit(double);publicvoidwithdraw(double);Sun服务封装第4章20/80访问权限控制修饰符•private最严格的访问权限只允许本类的成员方法访问•public最宽松的访问权限任何类的方法均可访问Sun服务封装第4章21/80权限设计•如何指定成员的访问权限?•成员变量大多数都不是public可以指定private,然后编写两个public的访问方法getter/setter•成员方法对外接口,大多数是public本类的辅助方法,不允许其它类调用,privateSun服务封装第4章22/80成员变量访问权限•有两种方法:(1)把成员变量声明为publicpublicStringaccountNumber;(2)把成员变量声明为private然后编写两个public的getter/setter方法Sun服务封装第4章23/80getter/setterprivateStringaccountNumber;publicStringgetAccountNumber(){returnaccountNumber;}publicvoidsetAccountNumber(Stringnumber){accountNumber=number;}Sun服务封装第4章24/80使用方式•生产者/消费者•提供者/使用者•第一种方法:Accountac=newAccount();//通过赋值来指定帐号ac.accountNumber=“110623998015666”;•第二种方法:Accountac=newAccount();//通过成员方法调用来指定帐号ac.setAccountNumber(“110623998015666”);Sun服务封装第4章25/80使用方式的区别•类型检查•权限控制•逻辑判断•业务变化Sun服务封装第4章26/80Whygetter/setter?•更符合现实世界中外因通过内因起作用的客观规律,一个对象的属性发生变化应该是外因和内因共同作用的结果•能够灵活的控制属性的读和修改的访问级别,对象的有些属性只允许使用者读,但不允许使用者修改,只有对象内部才能修改•防止使用者错误地修改属性在方法中通过if来判断参数是否合法•有助于对象封装,隐藏实现细节Sun服务封装第4章27/80判断逻辑主要用在setter中例如,假定合法的帐号应该是15位publicvoidsetAccountNumber(Stringnumber){if(number.length()!=15){System.out.println(“帐号位数不正确!”);}else{accountNumber=number;}}Sun服务封装第4章28/80类与对象•二者联系密切,但又有所区别•联系:类是对象的模板,对象是类的实例(instance)实例化:从类得到对象,使用关键字new•区别:类是抽象的,对象是具体的对象的各成员变量在内存中有相应的存储空间可以存储值,而类则不然Sun服务封装第4章29/80构造对象•从类创建一个对象,其成员变量会被默认初始化,各数据类型有相应的默认值•在实际构造一个Account的对象时,帐号由银行产生,初始余额则由用户交纳的金额决定•需要按照指定值来给成员变量赋值而不是单纯依赖默认初始化来进行赋值Sun服务封装第4章30/80使用setter•一种方案是使用setter来构造对象例如:Accountac=newAccount();ac.setAccountNumber(“110623998015666”);ac.setBalance(10.0);•看上去很美,但有问题原有目的是在给成员变量分配内存空间时,即完成指定的赋值工作,这样更安全,而setter的运行时间比内存分配要晚,有可能还没来得及运行setter,已经有使用者通过getter来访问成员变量很不安全!Sun服务封装第4章31/80Weneed…?那为了达到目的,需要什么东西呢?在创建对象的时候即可完成成员变量的初始化工作,比一般方法(包括getter/setter)运行时间更早,保证在调用一般方法时,成员变量已经被正确地初始化了创建对象的时候,new不一般的方法,特殊的成员方法Sun服务封装第4章32/80构造器•特殊的成员方法,用来在创建对象的时候构造对象,主要包括成员变量的初始化•例如:添加了构造器的类AccountSun服务封装第4章33/80构造器的特殊性•构造器是一个特殊的成员方法,其特殊性体现在:(1)方法名称特殊(2)方法返回类型特殊(3)方法调用特殊(4)方法作用特殊Sun服务封装第4章34/80构造器的名称•构造器的名称必须与类名完全相同,包括大小写形式例如,类Account其无参数的构造器为:publicAccount(){//构造器的方法体}Sun服务封装第4章35/80构造器的返回类型•构造器不允许返回任何值不能指定其返回类型,包括void例如,类Account以下方法不是真正的构造器只是一个名称与类名相同的普通成员方法publicvoidAccount(){//方法体}Sun服务封装第4章36/80构造器的调用•构造器的调用一般在使用new创建对象时由编译器自动调用,该调用是强制性的,程序员不能改变•创建一个对象的时刻,构造器被调用,以后就再也不会调用构造器了•构造器的调用时间早于普通的成员方法例如,getter/setter•构造器和普通成员方法的调用形式:Accountac=newAccount();doublebalance=ac.getBalance();Sun服务封装第4章37/80构造器的作用•构造器的作用是用于创建对象时进行对象的初始化,主要包括成员变量的初始化•这个作用和一般的普通成员方法是不同的Sun服务封装第4章38/80默认构造器•在编写第一个程序时,并没有编写任何构造器•如果一个类没有构造器,那么编译器会给该类增加一个无参数的构造器,方法体为空,例如,对于类HelloWorld,添加的构造器形式如下:publicHelloWorld(){}默认的构造器Sun服务封装第4章39/80反编译•编译:.java—.class•反编译:.class—.java•反编译工具:jad.exe下载地址:可拷贝到jdk安装目录\bin下•Java程序发布形式:class文件或jar包•如何防止反编译?Java混编器(Javaobfuscator)Sun服务封装第4章40/80构造器•如果程序员编写了一个构造器,那么编译器不会添加无参数的默认构造器•例如在AccountWithConstructor.java的main()方法中增加以下代码,则产生编译错误:AccountWithConstructora;a=newAccountWithConstructor();因为不存在一个无参数的构造器Sun服务封装第4章41/80构造器•在这种情况下,程序员必须手动添加该构造器,例如:publicAccountWithConstructor(){accountNumber=“”;balance=0.0;}之后程序就可以通过编译了Sun服务封装第4章42/80构造器•一个类中可以有多个构造器吗?根据编译结果,说明是可以的•大多数类都拥有多于1个的构造器例如,类String有13个构造器一个构造器意味着可以通过这种形式来构造该类的对象,程序中不同的情况下可能通过不同的形式来构造同一个类的对象,因此往往都有多个构造器Sun服务封装第4章43/80构造器•由于构造器的名称与类名必须相同因此一个类的多个构造器必定具有相同的方法名称,这种不同方法具有相同的方法名称在C语言中是不
本文标题:4 封装_Java
链接地址:https://www.777doc.com/doc-4867773 .html