Java程序设计任务驱动式教程任务八_保护你的隐私(封装的使用).ppt_第1页
Java程序设计任务驱动式教程任务八_保护你的隐私(封装的使用).ppt_第2页
Java程序设计任务驱动式教程任务八_保护你的隐私(封装的使用).ppt_第3页
Java程序设计任务驱动式教程任务八_保护你的隐私(封装的使用).ppt_第4页
Java程序设计任务驱动式教程任务八_保护你的隐私(封装的使用).ppt_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

,Java程序设计任务驱动式教程,主编:孙修东、王永红高职高专规划示范教材,2,目录,任务一搭建环境(构建Java集成开发环境),任务二Java欢迎你(开发简单Java应用程序,任务三小试牛刀(学习Java语言基础),任务四挑战选择(使用分支控制流程),任务五游戏人生(使用循环控制流程),任务六回归自然(创建、使用类和对象),任务七3G时代的消息传递(定义和使用类方法),任务八保护你的隐私(封装的使用),任务九子承父业(继承和多态的使用),任务十上帝万能之手(接口的使用),3,任务十一用数组存储信息(使用数组),任务十二使用字符串进行交流(使用字符串),任务十三防患于未然(捕获并处理异常),任务十四主动出击(抛出异常),任务十五认识JavaApplet(Applet入门),任务十六丰富多彩的Applet(在Applet中播放声音和显示图像),任务十七进入Windows世界(设计图形用户界面),任务十八布局规划(使用布局管理器),任务十九事件委托处理(如何处理事件),任务二十选择之道(使用选择控件和选择事件),目录,4,任务二十一简明清晰的菜单(使用菜单和其他常用事件),任务二十二访问数据(使用JDBC连接数据库),任务二十三访问数据升级(数据库编程),任务二十四文件管理(目录与文件管理),任务二十五顺序进出之道(文件的顺序访问),任务二十六随机进出之道(文件的随机访问),任务二十七JAVA的分身术(创建和启动线程),任务二十八线程的生命周期与优先级(线程的状态与调度),任务二十九基于连接的通信(Java中的套接字Socket),任务三十基于无连接的通信(Java中的数据报编程),目录,5,任务八保护你的隐私(封装的使用),2,1,知识目标,能力目标,为什么需要封装;对属性封装;用构造方法实现对象成员的初始化。方法重载;Java中的构造方法与实例方法区别;对构造方法进行重载。,理解封装的概念;掌握private关键字;掌握构造方法;掌握方法重载。,6,内容提要,4,跟我做:银行卡类的封装,1,2,3,5,实现方案,代码分析,必备知识,动手做一做,7,8.1跟我做:银行卡类的封装,任务情景银行卡类采用封装技术升级。每张银行卡信息包含年利率;账号、持卡人姓名、身份证号码、地址;交易金额、交易日期、余额。银行类能够存款、取款、查询、购物支付、禁止透支。根据持卡人不同操作,显示不同信息。当存款操作后,显示原有余额、本次存款数额及最终存款余额;当取款操作时,显示原有余额、今日取款数额及最终存款余额。运行结果,第1章目录,8,问题分析在任务七中学习过包,本任务中要使用它来进行Java程序中类的组织。把需要在一起工作的类放在同一包里,除了public修饰的类能够被所有包中的类访问外,缺省修饰符的类只能被其所在包中的类访问,不能在其包外访问。包的这种组织方式,把对类的访问封锁在一定的范围,体现了Java面向对象的封装性。在本任务中,将类放在包com.task08中。包定义如下:packagecom.task08;在面向对象程序设计中,提出“强内聚、弱耦合”编程思想,即一个类的内部联系紧密,类与其他类之间的联系松散。在实现AccountCard银行卡类时,尽可能把类的成员声明为私有的private,只把一些少量的、必要的方法声明为公共的public,提供给外部使用。在AccountCard类中,属性的修饰符为private,对属性的访问只局限于AccountCard类。需要在类外访问的属性有interest年利率、account账号、name持卡人姓名、id身份证号码、address地址,为此专门设置了相应的setter()方法、getter()方法。当在AccountCardTest类中访问这些属性时,使用相应的setter()方法和getter()方法。,第1章目录,8.2实现方案,9,解决步骤1.打开Eclipse,在study项目中创建包com.task08,再确定类名AccountCard,得到类的框架。2.然后,在publicclassAccountCard下面一行输入类的属性描述:privatestaticdoubleinterest;/私有、静态privateStringaccount;3.接着,在AccountCard类中输入private属性的getter()和setter()方法的定义:publicstaticdoublegetInterest()/静态returninterest;publicstaticvoidsetInterest(doubleinterest)/静态AccountCerest=interest;publicvoidsetAccount(Stringaccount)this.account=account;/this代表当前类的实例,8.2实现方案,10,4.定义相应的功能方法:publicvoiddeposit(doublecash)System.out.println(=存款=);/详细实现代码参见8.3publicvoidwithdraw(doublecash)System.out.println(=取款=);/详细实现代码参见8.3publicvoidquery()System.out.println(=查询=);/详细实现代码参见8.3publicvoidpurchase(doublepayment)System.out.println(=购物=);/详细实现代码参见8.35.定义AccountCardTest测试类,运行程序。对AccountCard类的private属性的访问只能通过相应的getter()和setter()方法进行。,8.2实现方案,11,程序代码packagecom.task08;importjava.util.Date;/导入程序中用到的系统类/*AccountCard.java*银行卡的封装*/publicclassAccountCard/自定义AccountCard类/*年利率;账号、持卡人姓名、身份证号码、地址;交易金额、交易日期、余额*/privatestaticdoubleinterest;/私有、静态privateStringaccount;/私有privateStringname;privateStringid;privateStringaddress;privatedoubleDWAmount;privateDateDWDate;privatedoublebalance;/*getter()、setter()方法*/publicstaticdoublegetInterest()/静态getter()returninterest;publicstaticvoidsetInterest(doubleinterest)/静态setter()AccountCerest=interest;publicStringgetAccount()/getter()returnaccount;publicvoidsetAccount(Stringaccount)/setter()this.account=account;/this代表当前类的实例publicStringgetName()returnname;publicvoidsetName(Stringname)=name;publicStringgetId()returnid;publicvoidsetId(Stringid)this.id=id;publicStringgetAddress()returnaddress;publicvoidsetAddress(Stringaddress)this.address=address;/*存款、取款、查询;购物支付、禁止透支*/publicvoiddeposit(doublecash)/类的存款行为(方法),第1章目录,8.3代码分析,12,8.3代码分析,System.out.println(=存款=);System.out.println(您的卡号:+this.account);/this代表当前类的实例System.out.println(您的姓名:+);System.out.println(原有余额:+this.balance);System.out.println(现存入:+cash);this.DWAmount=cash;balance=this.balance+cash;/余额自动计算System.out.println(最终余额:+this.balance);this.DWDate=newDate();/记录当天的日期System.out.println(存款日期:+this.DWDate);publicvoidwithdraw(doublecash)/类的取款行为(方法)System.out.println(=取款=);System.out.println(您的卡号:+this.account);System.out.println(您的姓名:+);System.out.println(原有余额:+this.balance);System.out.println(现取出:+cash);this.DWAmount=cash;if(this.balance-cash)0)/禁止透支this.balance=this.balance-cash;/余额自动计算System.out.println(最终余额:+this.balance);elseSystem.out.println(取出数额太大!请重新输入。);this.DWDate=newDate();/记录当天的日期System.out.println(取款日期:+this.DWDate);publicvoidquery()/类的查询行为(方法)System.out.println(=查询=);System.out.println(您的卡号:+this.account);System.out.println(您的姓名:+);System.out.println(最终余额是:+this.balance);this.DWDate=newDate();/记录当天的日期System.out.println(查询日期:+this.DWDate);publicvoidpurchase(doublepayment)/类的付款行为(方法)System.out.println(=购物=);System.out.println(您的卡号:+this.account);System.out.println(您的姓名:+);System.out.println(原有余额:+this.balance);System.out.println(现付出:+payment);this.DWAmount=payment;if(this.balance-payment)0)/禁止透支this.balance=this.balance-payment;/自动计算余额System.out.println(最终余额:+this.balance);elseSystem.out.println(没有足够的余额!);this.DWDate=newDate();/记录当天的日期System.out.println(付款日期:+this.DWDate);packagecom.task08;importjava.util.Date;publicclassAccountCardTest/定义测试类/*paramargs*/publicstaticvoidmain(Stringargs)AccountCard.setInterest(0.03);/年利率System.out.println(年利率:+AccountCard.getInterest();/设置持卡人信息AccountCardwang=newAccountCard();wang.setAccount(1111111111);wang.setName(王朝);wang.setId;wang.setAddress(持卡人地址);wang.deposit(1000.5);/存款wang.query();/查询wang.withdraw(500);/取款wang.query();wang.purchase(300);/购物wang.query();,第1章目录,13,应用扩展本任务有两个方面的应用扩展,一个是在AccountCard类中增加构造方法,升级后的类名改为AccountCard2,另一个是新建AccountCard2Menu类,类中增加菜单功能。测试类相应升级为AccountCard2Test。在AccountCard2类中增加代码如下:/*无参构造方法*/publicAccountCard2()/初始化持卡人信息super();this.account=1111111110;=王朝;this.idthis.address=持卡人地址;this.balance=0;/*带参构造方法*/publicAccountCard2(Stringaccount,Stringname,Stringid,Stringaddress,doublebalance)/初始化持卡人信息super();this.account=account;=name;this.id=id;this.address=address;this.balance=balance;新建AccountCard2Menu类代码如下:packagecom.task08;publicclassAccountCard2Menu/菜单类/*菜单*/publicvoidmenu()/菜单方法System.out.println(n欢迎使用银行ATM系统2.0版);System.out.println(t1.存款);System.out.println(t2.取款);System.out.println(t3.购物付款);System.out.println(t4.查询);System.out.println(t5.退出);System.out.print(选择请输入数字1-5:);在AccountCard2Test测试类中的代码修改如下:packagecom.task08;importjava.util.Scanner;publicclassAccountCard2Test/测试类/*paramargs*/publicstaticvoidmain(Stringargs)/程序入口方法/AccountCard2.setInterest(0.03);/年利率/System.out.println(年利率:+AccountCard2.getInterest();/通过构造方法初始化持卡人信息AccountCard2wang=newAccountCard2();/创建类的对象intchoice;dowang.menu();/*输入数字,选择菜单*/Scannerinput=newScanner(System.in);/从键盘输入数据choice=input.nextInt();switch(choice)case1:wang.deposit(1000.5);/存款break;case2:wang.withdraw(500);/取款break;case3:wang.purchase(300);/购物break;case4:wang.query();/查询break;case5:System.out.println(谢谢您的使用!);System.exit(1);while(choice!=5);,8.3代码分析,14,8.4必备知识,8.4.1封装的概念1.什么是封装在Java中通过private关键字限制对类的成员变量或成员方法的访问,称为封装。封装性是面向对象的基础,也是面向对象的核心特征之一。类是数据及对数据操作的封装体,类具有封装性。通过封装,将属性私有化,再提供公有方法访问私有属性。2.为什么要封装封装的目的是限制对类的成员的访问,隐藏类的实现细节。类的设计者和使用者考虑的角度不同。设计者考虑如何定义类的属性和方法,如何设置其访问权限等,而类的使用者只需知道类有哪些功能,可以访问哪些属性和方法。只要使用者使用的界面不变,即使类的内部实现细节发生变化,使用者的代码就不需要改变,增强了程序的可维护性。举个生活中封装的例子。张三是一名员工,即张三是员工类的实例。张三的隐私相当于员工类的私有属性,平时我们是无法直接获得张三的隐私。但员工有一个能力就是说出隐私,相当于员工类的公共方法,通过张三说出隐私这个公共方法,我们就可以得到张三的隐私。这就是生活中的封装。,第1章目录,15,3.封装的实现步骤要限制类的外部对类成员的访问,可以使用访问修饰符private修饰属性,让其他类只能通过公共方法访问私有属性。封装的实现步骤如下:修改属性的访问修饰符来限制对属性的访问。例如,AccountCard类中,属性interest、account、name、id、address都设置为private。privateStringaccount;/属性account设为privateprivateStringname;/属性name设为private为每个私有属性创建一对赋值方法setter()和取值方法getter(),用于对属性的访问。例如,AccountCard类对属性account、name提供的公共setter()和getter()方法:publicStringgetAccount()/属性account的getter()方法returnaccount;publicvoidsetAccount(Stringaccount)/属性account的setter()方法this.account=account;/this代表当前类的实例,第1章目录,8.4必备知识,16,publicStringgetName()/属性name的getter()方法returnname;publicvoidsetName(Stringname)/属性name的setter()方法=name;在setter()和getter()方法中,加入对属性的存取限制。例如,对身份证号码不加存取限制时的setter()方法:publicvoidsetId(Stringid)this.id=id;现在要求加入对身份证号码的长度限制,长度不为18位时在控制台显示出错信息,则setter()方法改为:publicvoidsetId(Stringid)if(id.length()=18)this.id=id;elseSystem.out.println(身份证号码不对!);,第1章目录,8.4必备知识,17,4.封装之后的使用在另一个类中要对AccountCard2类中的私有属性account、name赋值,先得到AccountCard2类的实例accountCard2,再通过使用setter()方法进行。accountCard2.setAccount(1111111111);accountCard2.setName(王朝);需要获取私有属性account、name的值,必须使用getter()方法。Stringaccount=accountCard2.getAccount();Stringname=accountCard2.getName();注意:不可以直接用如下方式访问私有属性account和name:accountCard2.account=1111111111;accountC=王朝;Stringaccount=accountCard2.account;Stringname=accountC;,8.4必备知识,18,8.4必备知识,8.4.2private关键字对属性四种访问权限的比较参见表8-1。访问修饰符本类本类所在包其他包中的本类子类其他包中的非子类public能访问能访问能访问能访问protected能访问能访问能访问不能private能访问不能不能不能缺省能访问能访问不能不能注意:,19,属性的public修饰符应少用,其他类访问本类属性应该通过相应的setter()或getter()方法进行。如果没有访问修饰符(缺省),则属性默认只能被同一个包中的类访问。在设计属性时,还有几个修饰符:static定义的属性,称为静态变量,也称为类变量。类变量很特别,与实例变量不同,可以用类直接访问,类的所对象共享该属性。final定义常量,在方法中不可改变它的值。例如publicstaticfinaldoublePI=3.14159265358979323846;语句中,PI是一个常量。参见任务十。transient定义暂时性变量,用于对象存档。Volatile易失(共享)域变量,用于并发线程的共享。参见任务二十七和二十八,8.4必备知识,20,8.4.3构造方法1.构造方法的概念构造方法是一种特殊的类的方法,方法名与类名相同,而且没有返回类型,也不需要void。构造方法的作用在于对象创建时初始化对象,给实例化对象的成员变量赋初值。类中的其他方法就称为实例方法。2.构造方法的目的我们观察一下AccountCard类,它有多个私有属性,为了遵循面向对象封装的思想,就有多个对应的setter方法。在使用AccountCard类的时候,必须调用setter()方法对私有属性初始化。当开发一个项目时,类的私有属性会很多,这是很繁琐也很容易出错的事情。通过构造方法简化了对象初始化的代码。3.构造方法格式与一般的类的方法相似,也有不一样之处。方法名与类名相同,无返回值,也不需要void。构造方法格式如下:public(参数列表)这也是构造方法与实例方法的区别。,8.4必备知识,21,无参构造方法publicclassBookprivateStringbookName;/*无参构造方法,方法名Book与类名Book相同,无返回值,也不需要void*/publicBook()this.bookName=Java程序设计任务驱动式教程;publicStringgetBookName()returnbookName;publicvoidsetBookName(StringbookName)this.bookName=bookName;在BookTest测试类中实例化Book类时,代码如下:Bookbook=newBook();实现了book对象的bookName属性的初始化。book.getBookName()的返回值为Java程序设计任务驱动式教程。,8.4必备知识,22,带参构造方法publicclassBookprivateStringbookName;/*带参构造方法,方法名Book与类名Book相同,无返回值,也不需要void*/publicBook(StringbookName)this.bookName=bookName;publicStringgetBookName()returnbookName;publicvoidsetBookName(StringbookName)this.bookName=bookName;在BookTest测试类中实例化Book类时,代码如下:Bookbook=newBook(Java程序设计任务驱动式教程);/有实参创建book对象的时候,显式地为bookName实例变量赋初始值。book.getBookName()的返回值为Java程序设计任务驱动式教程。当私有属性很多时,带参构造方法的参数也多,省去了多行的赋值语句,灵活性更大些。,8.4必备知识,23,注意:构造方法不能像成员方法那样被直接调用,只能通过new运算符实例化一个对象时,由系统自动调用,实现对成员变量初始化的作用。例如:Bookbook=newBook();/调用构造方法,实例化一个对象bookBook()就是Book类的一个无参构造方法。在前面的任务中学习时,有的类没有定义构造方法,怎么能生成一个类的对象呢?在Java中,系统会为这样的类自动生成一个无参的默认构造方法,然后,使用默认值初始化对象的成员变量。数值型变量的默认值为0,布尔型为false,字符型为“0”,字符串为null。所以,当Book类没有定义构造方法时,我们在代码中仍然可以用newBook()实例化一个对象。,8.4必备知识,24,改错:下面Constructor类中关于构造方法有哪些错误?publicclassConstructorprivateintx;publicConstructor()x=1;publicConstructor(inti)x=i;publicintConstructor(inti)x=i;returnx+;privateConstructor(inti,Strings)publicConstructor(Strings,inti)privateConstructe(inti)x=i+;privatevoidConstructe(inti)x=i+;提示:有1个错误。区分哪些是实例方法,哪些是构造方法。,8.4必备知识,25,8.4.4方法重载1.什么是方法重载在同一个类中,多个方法具有相同的方法名,但却具有不同的参数列表,方法之间的这种关系称为方法重载。重载方法中的参数列表必须不同,也就是说,参数个数、参数类型或参数顺序不同,至少三者中有一项不同。例如,任务中一直使用的java.io.PrintStream类的println()方法,能够打印多种类型数据,有多种实现方式:publicvoidprintln(floatx);publicvoidprintln(Stringy);根据方法重载的定义,这些同名的println()方法之间的关系就是方法重载。方法重载并不由方法的返回类型决定。例如,以下同名的circle()方法之间的关系就不是方法重载。publicfloatcircle(floatx);publicintcircle(floatx);2.为什么需要方法重载因为在完成同一功能时,可能遇到不同的具体情况,比如在控制台输出信息,可能有实数输出、整数输出、字符输出、字符串输出等,定义多个不同方法名的方法,无论在设计还是在调用时,都是很麻烦的事。采用方法重载,用相同的方法名,不同的参数列表,就解决了这些问题。,8.4必备知识,26,3.方法重载举例加法器类代码如下:packagecom.task08;/*Calculate.java*用加法器解释方法重载*/publicclassCalculate/*add()方法之间关系为方法重载*/publicintadd(inta,intb)/方法一:参数类型为intreturna+b;publicdoubleadd(doublea,doubleb)/方法二:参数类型为doublereturna+b;publicfloatadd(floata,floatb)/方法三:参数类型为floatreturna+b;,8.4必备知识,27,测试类代码:packagecom.task08;publicclassCalculateTest/*paramargs*/publicstaticvoidmain(Stringargs)Ca

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论