Java程序设计任务驱动式教程任务八保护你的隐私(封装的使用).ppt

上传人:tia****nde 文档编号:11496771 上传时间:2020-04-25 格式:PPT 页数:30 大小:868.50KB
返回 下载 相关 举报
Java程序设计任务驱动式教程任务八保护你的隐私(封装的使用).ppt_第1页
第1页 / 共30页
Java程序设计任务驱动式教程任务八保护你的隐私(封装的使用).ppt_第2页
第2页 / 共30页
Java程序设计任务驱动式教程任务八保护你的隐私(封装的使用).ppt_第3页
第3页 / 共30页
点击查看更多>>
资源描述
,Java程序设计任务驱动式教程,主编:孙修东、王永红高职高专规划示范教材,北京航空航天大学出版社,230,目录,任务一搭建环境(构建Java集成开发环境),任务二Java欢迎你(开发简单Java应用程序,任务三小试牛刀(学习Java语言基础),任务四挑战选择(使用分支控制流程),任务五游戏人生(使用循环控制流程),任务六回归自然(创建、使用类和对象),任务七3G时代的消息传递(定义和使用类方法),任务八保护你的隐私(封装的使用),任务九子承父业(继承和多态的使用),任务十上帝万能之手(接口的使用),330,任务十一用数组存储信息(使用数组),任务十二使用字符串进行交流(使用字符串),任务十三防患于未然(捕获并处理异常),任务十四主动出击(抛出异常),任务十五认识JavaApplet(Applet入门),任务十六丰富多彩的Applet(在Applet中播放声音和显示图像),任务十七进入Windows世界(设计图形用户界面),任务十八布局规划(使用布局管理器),任务十九事件委托处理(如何处理事件),任务二十选择之道(使用选择控件和选择事件),目录,430,任务二十一简明清晰的菜单(使用菜单和其他常用事件),任务二十二访问数据(使用JDBC连接数据库),任务二十三访问数据升级(数据库编程),任务二十四文件管理(目录与文件管理),任务二十五顺序进出之道(文件的顺序访问),任务二十六随机进出之道(文件的随机访问),任务二十七JAVA的分身术(创建和启动线程),任务二十八线程的生命周期与优先级(线程的状态与调度),任务二十九基于连接的通信(Java中的套接字Socket),任务三十基于无连接的通信(Java中的数据报编程),目录,530,任务八保护你的隐私(封装的使用),2,1,知识目标,能力目标,为什么需要封装;对属性封装;用构造方法实现对象成员的初始化。方法重载;Java中的构造方法与实例方法区别;对构造方法进行重载。,理解封装的概念;掌握private关键字;掌握构造方法;掌握方法重载。,630,内容提要,4,跟我做:银行卡类的封装,1,2,3,5,实现方案,代码分析,必备知识,动手做一做,730,8.1跟我做:银行卡类的封装,任务情景银行卡类采用封装技术升级。每张银行卡信息包含年利率;账号、持卡人姓名、身份证号码、地址;交易金额、交易日期、余额。银行类能够存款、取款、查询、购物支付、禁止透支。根据持卡人不同操作,显示不同信息。当存款操作后,显示原有余额、本次存款数额及最终存款余额;当取款操作时,显示原有余额、今日取款数额及最终存款余额。运行结果,第1章目录,830,问题分析在任务七中学习过包,本任务中要使用它来进行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实现方案,930,解决步骤1.打开Eclipse,在study项目中创建包com.task08,再确定类名AccountCard,得到类的框架。2.然后,在publicclassAccountCard下面一行输入类的属性描述:privatestaticdoubleinterest;/私有、静态privateStringaccount;3.接着,在AccountCard类中输入private属性的getter()和setter()方法的定义:publicstaticdoublegetInterest()/静态returninterest;publicstaticvoidsetInterest(doubleinterest)/静态AccountCard.interest=interest;publicvoidsetAccount(Stringaccount)this.account=account;/this代表当前类的实例,8.2实现方案,1030,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实现方案,1130,程序代码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()AccountCard.interest=interest;publicStringgetAccount()/getter()returnaccount;publicvoidsetAccount(Stringaccount)/setter()this.account=account;/this代表当前类的实例publicStringgetName()returnname;publicvoidsetName(Stringname)this.name=name;publicStringgetId()returnid;publicvoidsetId(Stringid)this.id=id;publicStringgetAddress()returnaddress;publicvoidsetAddress(Stringaddress)this.address=address;/*存款、取款、查询;购物支付、禁止透支*/publicvoiddeposit(doublecash)/类的存款行为(方法),第1章目录,8.3代码分析,1230,8.3代码分析,System.out.println(=存款=);System.out.println(您的卡号:+this.account);/this代表当前类的实例System.out.println(您的姓名:+this.name);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(您的姓名:+this.name);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(您的姓名:+this.name);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(您的姓名:+this.name);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(321020199809181215);wang.setAddress(持卡人地址);wang.deposit(1000.5);/存款wang.query();/查询wang.withdraw(500);/取款wang.query();wang.purchase(300);/购物wang.query();,第1章目录,1330,应用扩展本任务有两个方面的应用扩展,一个是在AccountCard类中增加构造方法,升级后的类名改为AccountCard2,另一个是新建AccountCard2Menu类,类中增加菜单功能。测试类相应升级为AccountCard2Test。在AccountCard2类中增加代码如下:/*无参构造方法*/publicAccountCard2()/初始化持卡人信息super();this.account=1111111110;this.name=王朝;this.id=321020199809181215;this.address=持卡人地址;this.balance=0;/*带参构造方法*/publicAccountCard2(Stringaccount,Stringname,Stringid,Stringaddress,doublebalance)/初始化持卡人信息super();this.account=account;this.name=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代码分析,1430,8.4必备知识,8.4.1封装的概念1.什么是封装在Java中通过private关键字限制对类的成员变量或成员方法的访问,称为封装。封装性是面向对象的基础,也是面向对象的核心特征之一。类是数据及对数据操作的封装体,类具有封装性。通过封装,将属性私有化,再提供公有方法访问私有属性。2.为什么要封装封装的目的是限制对类的成员的访问,隐藏类的实现细节。类的设计者和使用者考虑的角度不同。设计者考虑如何定义类的属性和方法,如何设置其访问权限等,而类的使用者只需知道类有哪些功能,可以访问哪些属性和方法。只要使用者使用的界面不变,即使类的内部实现细节发生变化,使用者的代码就不需要改变,增强了程序的可维护性。举个生活中封装的例子。张三是一名员工,即张三是员工类的实例。张三的隐私相当于员工类的私有属性,平时我们是无法直接获得张三的隐私。但员工有一个能力就是说出隐私,相当于员工类的公共方法,通过张三说出隐私这个公共方法,我们就可以得到张三的隐私。这就是生活中的封装。,第1章目录,1530,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必备知识,1630,publicStringgetName()/属性name的getter()方法returnname;publicvoidsetName(Stringname)/属性name的setter()方法this.name=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必备知识,1730,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;accountCard2.name=王朝;Stringaccount=accountCard2.account;Stringname=accountCard2.name;,8.4必备知识,1830,8.4必备知识,8.4.2private关键字对属性四种访问权限的比较参见表8-1。访问修饰符本类本类所在包其他包中的本类子类其他包中的非子类public能访问能访问能访问能访问protected能访问能访问能访问不能private能访问不能不能不能缺省能访问能访问不能不能注意:,1930,属性的public修饰符应少用,其他类访问本类属性应该通过相应的setter()或getter()方法进行。如果没有访问修饰符(缺省),则属性默认只能被同一个包中的类访问。在设计属性时,还有几个修饰符:static定义的属性,称为静态变量,也称为类变量。类变量很特别,与实例变量不同,可以用类直接访问,类的所对象共享该属性。final定义常量,在方法中不可改变它的值。例如publicstaticfinaldoublePI=3.14159265358979323846;语句中,PI是一个常量。参见任务十。transient定义暂时性变量,用于对象存档。Volatile易失(共享)域变量,用于并发线程的共享。参见任务二十七和二十八,8.4必备知识,2030,8.4.3构造方法1.构造方法的概念构造方法是一种特殊的类的方法,方法名与类名相同,而且没有返回类型,也不需要void。构造方法的作用在于对象创建时初始化对象,给实例化对象的成员变量赋初值。类中的其他方法就称为实例方法。2.构造方法的目的我们观察一下AccountCard类,它有多个私有属性,为了遵循面向对象封装的思想,就有多个对应的setter方法。在使用AccountCard类的时候,必须调用setter()方法对私有属性初始化。当开发一个项目时,类的私有属性会很多,这是很繁琐也很容易出错的事情。通过构造方法简化了对象初始化的代码。3.构造方法格式与一般的类的方法相似,也有不一样之处。方法名与类名相同,无返回值,也不需要void。构造方法格式如下:public(参数列表)这也是构造方法与实例方法的区别。,8.4必备知识,2130,无参构造方法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必备知识,2230,带参构造方法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必备知识,2330,注意:构造方法不能像成员方法那样被直接调用,只能通过new运算符实例化一个对象时,由系统自动调用,实现对成员变量初始化的作用。例如:Bookbook=newBook();/调用构造方法,实例化一个对象bookBook()就是Book类的一个无参构造方法。在前面的任务中学习时,有的类没有定义构造方法,怎么能生成一个类的对象呢?在Java中,系统会为这样的类自动生成一个无参的默认构造方法,然后,使用默认值初始化对象的成员变量。数值型变量的默认值为0,布尔型为false,字符型为“0”,字符串为null。所以,当Book类没有定义构造方法时,我们在代码中仍然可以用newBook()实例化一个对象。,8.4必备知识,2430,改错:下面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必备知识,2530,8.4.4方法重载1.什么是方法重载在同一个类中,多个方法具有相同的方法名,但却具有不同的参数列表,方法之间的这种关系称为方法重载。重载方法中的参数列表必须不同,也就是说,参数个数、参数类型或参数顺序不同,至少三者中有一项不同。例如,任务中一直使用的java.io.PrintStream类的println()方法,能够打印多种类型数据,有多种实现方式:publicvoidprintln(floatx);publicvoidprintln(Stringy);根据方法重载的定义,这些同名的println()方法之间的关系就是方法重载。方法重载并不由方法的返回类型决定。例如,以下同名的circle()方法之间的关系就不是方法重载。publicfloatcircle(floatx);publicintcircle(floatx);2.为什么需要方法重载因为在完成同一功能时,可能遇到不同的具体情况,比如在控制台输出信息,可能有实数输出、整数输出、字符输出、字符串输出等,定义多个不同方法名的方法,无论在设计还是在调用时,都是很麻烦的事。采用方法重载,用相同的方法名,不同的参数列表,就解决了这些问题。,8.4必备知识,2630,3.方法重载举例加法器类代码如下:packagecom.task08;/*Calculate.java*用加法器解释方法重载*/publicclassCalculate/*add()方法之间关系为方法重载*/publicintadd(inta,intb)/方法一:参数类型为intreturna+b;publicdoubleadd(doublea,doubleb)/方法二:参数类型为doublereturna+b;publicfloatadd(floata,floatb)/方法三:参数类型为floatreturna+b;,8.4必备知识,2730,测试类代码:packagecom.task08;publicclassCalculateTest/*paramargs*/publicstaticvoidmain(Stringargs)Calculatecalculate=newCalculate();System.out.println(calculate.add(1,2);/调用方法一:参数类型为intSystem.out.println(calculate.add(1.0,2.0);/调用方法二:参数类型为doubleSystem.out.println(calculate.add(1.0f,2.0f);/调用方法三:参数类型为float程序运行之前,在编译时根据参数列表决定调用哪个方法。,8.4必备知识,2830,改错:下面方法重载有哪些错误?第一组方法重载:publicintmax(inta,intb);publicvoidmax(inta,intb);publicintmax(intx,inty);publicintmax(doublea,doubleb);第二组方法重载:publicintarea(inta);publicintarea(inta,intb);publicdoublearea(doublea,doubleb);publicintarea(doublea,doubleb);提示:有2+1=3个错误。,8.4必备知识,2930,4.构造方法的重载构造方法重载仍然遵守方法重载定义。在Book类中,有两个构造方法,一个无参,一个带参代码如下:publicclassBookprivateStringbookName;/*无参构造方法*/publicBook()this.bookName=Java程序设计任务驱动式教程;/*带参构造方法*/publicBook(StringbookName)this.bookName=bookName;当在BookTest测试类中实例化时,如果将书名设置为默认的“Java程序设计任务驱动式教程”,则使用Book()构造方法简便,如果将书名设置为其他的名字,则用Book(StringbookName)构造方法灵活。,8.4必备知识,3030,8.5动手做一做,一、实训目的掌握封装的思想和实现;掌握构造方法的创建与使用;掌握方法重载的使用。二、实训内容1.通过封装编写Book类。要求:类具有属性书名、书号、主编、出版社、出版时间、页数、价格,其中页数不能少于200页,否则输出错误信息,并强制赋默认值200;为各属性设置赋值和取值方法;具有方法detail(),用来在控制台输出每本书的信息。编写BookTest测试类。为Book对象的属性赋予初始值,然后调用Book对象的detail方法,看看输出是否正确。2.给Book类增加构造方法,同时对测试类也做相应的修改。三、简要提示首先考虑将类的属性设为private,再设属性的getter()和setter()方法。应该区分在同一个类和不同类中对私有属性的访问方式不同。再考虑构造方法的方法重载,一个是无参构造方法,一个是带参构造方法。四、程序代码参见本教材教学资源。五、实训思考1.属性定义为私有之后,类的内部可以直接访问?类的外部可以直接访问?2.什么情况下使用方法重载?,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!