Java程序设计任务驱动式教程08章.ppt

上传人:人*** 文档编号:568221356 上传时间:2024-07-23 格式:PPT 页数:30 大小:868.50KB
返回 下载 相关 举报
Java程序设计任务驱动式教程08章.ppt_第1页
第1页 / 共30页
Java程序设计任务驱动式教程08章.ppt_第2页
第2页 / 共30页
Java程序设计任务驱动式教程08章.ppt_第3页
第3页 / 共30页
Java程序设计任务驱动式教程08章.ppt_第4页
第4页 / 共30页
Java程序设计任务驱动式教程08章.ppt_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《Java程序设计任务驱动式教程08章.ppt》由会员分享,可在线阅读,更多相关《Java程序设计任务驱动式教程08章.ppt(30页珍藏版)》请在金锄头文库上搜索。

1、主编:孙修东、王永红高职高专规划示范教材 北京航空航天大学出版社目录任务一 搭建环境(构建Java集成开发环境)任务二 Java欢迎你(开发简单Java应用程序任务三 小试牛刀(学习Java语言基础)任务四 挑战选择(使用分支控制流程)任务五 游戏人生(使用循环控制流程)任务六 回归自然(创建、使用类和对象)任务七 3G时代的消息传递(定义和使用类方法)任务八 保护你的隐私(封装的使用)任务九 子承父业(继承和多态的使用)任务十 上帝万能之手(接口的使用)2 23030任务十一 用数组存储信息(使用数组)任务十二 使用字符串进行交流(使用字符串)任务十三 防患于未然(捕获并处理异常)任务十四

2、主动出击(抛出异常)任务十五 认识Java Applet(Applet入门)任务十六 丰富多彩的Applet(在Applet中播放声音和显示图像)任务十七 进入Windows世界(设计图形用户界面)任务十八 布局规划(使用布局管理器)任务十九 事件委托处理(如何处理事件)任务二十 选择之道(使用选择控件和选择事件)目录3 33030任务二十一 简明清晰的菜单(使用菜单和其他常用事件)任务二十二 访问数据(使用JDBC连接数据库)任务二十三 访问数据升级(数据库编程)任务二十四 文件管理(目录与文件管理)任务二十五 顺序进出之道(文件的顺序访问)任务二十六 随机进出之道(文件的随机访问)任务二十

3、七 JAVA的分身术(创建和启动线程)任务二十八 线程的生命周期与优先级(线程的状态与调度)任务二十九 基于连接的通信(Java中的套接字Socket)任务三十 基于无连接的通信(Java中的数据报编程)目录4 43030任务八 保护你的隐私(封装的使用) 21知识目标知识目标能力目标能力目标为什么需要封装;对属性封装;用构造方法实现对象成员的初始化。方法重载;Java中的构造方法与实例方法区别;对构造方法进行重载。 理解封装的概念;掌握private关键字;掌握构造方法;掌握方法重载。 5 53030内容提要内容提要4跟我做:跟我做:银行卡类的封装银行卡类的封装 1235实现方案实现方案 代

4、码分析代码分析 必备知识必备知识 动手做一做动手做一做 6 630308.1 跟我做:银行卡类的封装 n任务情景任务情景银行卡类采用封装技术升级。每张银行卡信息包含年利率;账号、持卡人姓名、身份证号码、地址;交易金额、交易日期、余额。银行类能够存款、取款、查询、购物支付、禁止透支。根据持卡人不同操作,显示不同信息。当存款操作后,显示原有余额、本次存款数额及最终存款余额;当取款操作时,显示原有余额、今日取款数额及最终存款余额。n运行结果运行结果第1章目录7 73030n问题分析问题分析在任务七中学习过包,本任务中要使用它来进行Java程序中类的组织。把需要在一起工作的类放在同一包里,除了publ

5、ic 修饰的类能够被所有包中的类访问外,缺省修饰符的类只能被其所在包中的类访问,不能在其包外访问。包的这种组织方式,把对类的访问封锁在一定的范围,体现了Java面向对象的封装性。在本任务中,将类放在包com.task08中。包定义如下:package com.task08;在面向对象程序设计中,提出“强内聚、弱耦合”编程思想,即一个类的内部联系紧密,类与其他类之间的联系松散。在实现AccountCard银行卡类时,尽可能把类的成员声明为私有的private,只把一些少量的、必要的方法声明为公共的public,提供给外部使用。在AccountCard类中,属性的修饰符为private,对属性的访

6、问只局限于AccountCard类。需要在类外访问的属性有interest年利率、account账号、name持卡人姓名、id身份证号码、address地址,为此专门设置了相应的setter()方法、getter()方法。当在AccountCardTest类中访问这些属性时,使用相应的setter()方法和getter()方法。第1章目录8.2 实现方案 8 83030n解决步骤解决步骤1.打开Eclipse,在study项目中创建包com.task08,再确定类名AccountCard,得到类的框架。2.然后,在public class AccountCard下面一行输入类的属性描述:pri

7、vate static double interest;/私有、静态private String account;3.接着,在AccountCard类中输入private属性的getter()和setter() 方法的定义:public static double getInterest() /静态return interest;public static void setInterest(double interest) /静态AccountCard.interest = interest;public void setAccount(String account) this.account

8、 = account;/this代表当前类的实例8.2 实现方案 9 930304.定义相应的功能方法:public void deposit(double cash)System.out.println(=存款=); /详细实现代码参见8.3public void withdraw(double cash)System.out.println(=取款=); /详细实现代码参见8.3public void query()System.out.println(=查询=); /详细实现代码参见8.3public void purchase(double payment)System.out.pri

9、ntln(=购物=); /详细实现代码参见8.35.定义AccountCardTest测试类,运行程序。对AccountCard类的private属性的访问只能通过相应的getter()和setter()方法进行。8.2 实现方案 10103030n程序代码程序代码package com.task08;import java.util.Date;/导入程序中用到的系统类/* * AccountCard.java * 银行卡的封装 */public class AccountCard /自定义AccountCard类/*年利率;账号、持卡人姓名、身份证号码、地址;交易金额、交易日期、余额*/pr

10、ivate static double interest;/私有、静态private String account;/私有private String name;private String id;private String address;private double DWAmount;private Date DWDate;private double balance;/*getter( )、setter( )方法方法*/public static double getInterest() /静态getter( )return interest;public static void se

11、tInterest(double interest) /静态setter( )AccountCard.interest = interest;public String getAccount() / getter( )return account;public void setAccount(String account) / setter( )this.account = account; /this代表当前类的实例public String getName() return name;public void setName(String name) this.name = name;pub

12、lic String getId() return id;public void setId(String id) this.id = id;public String getAddress() return address;public void setAddress(String address) this.address = address;/*存款、取款、查询;购物支付、禁止透支*/public void deposit(double cash)/类的存款行为(方法)第1章目录8.3 代码分析 111130308.3 代码分析 System.out.println(=存款=);Syst

13、em.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=new Date();/记录当天的日期System.out.println(存款日期:

14、+this.DWDate);public void withdraw(double cash)/类的取款行为(方法)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.balanc

15、e-cash;/余额自动计算System.out.println(最终余额:+this.balance);elseSystem.out.println(取出数额太大!请重新输入。);this.DWDate=new Date();/记录当天的日期System.out.println(取款日期:+this.DWDate);public void query()/类的查询行为(方法)System.out.println(=查询=);System.out.println(您的卡号:+this.account);System.out.println(您的姓名:+this.name);System.out

16、.println(最终余额是:+this.balance);this.DWDate=new Date();/记录当天的日期System.out.println(查询日期:+this.DWDate);public void purchase(double payment)/类的付款行为(方法)System.out.println(=购物=);System.out.println(您的卡号:+this.account);System.out.println(您的姓名:+this.name);System.out.println(原有余额:+this.balance);System.out.prin

17、tln(现付出: +payment);this.DWAmount=payment;if (this.balance-payment)0)/禁止透支this.balance=this.balance-payment;/自动计算余额System.out.println(最终余额:+this.balance);elseSystem.out.println(没有足够的余额!);this.DWDate=new Date();/记录当天的日期System.out.println(付款日期:+this.DWDate);package com.task08;import java.util.Date;publ

18、ic class AccountCardTest /定义测试类/* * param args */public static void main(String args) AccountCard.setInterest(0.03);/年利率System.out.println(年利率: +AccountCard.getInterest();/设置持卡人信息AccountCard wang=new AccountCard();wang.setAccount(1111111111);wang.setName(王朝);wang.setId(321020199809181215);wang.setAd

19、dress(持卡人地址);wang.deposit(1000.5);/存款wang.query();/查询wang.withdraw(500); /取款wang.query();wang.purchase(300);/购物wang.query();第1章目录12123030n应用扩展应用扩展本任务有两个方面的应用扩展,一个是在AccountCard类中增加构造方法,升级后的类名改为AccountCard2,另一个是新建AccountCard2Menu类,类中增加菜单功能。测试类相应升级为AccountCard2Test。在AccountCard2类中增加代码如下:/*无参构造方法*/publi

20、c AccountCard2() /初始化持卡人信息super();this.account = 1111111110;this.name = 王朝;this.id = 321020199809181215;this.address = 持卡人地址;this.balance = 0;/*带参构造方法*/public AccountCard2(String account, String name, String id, String address,double balance) /初始化持卡人信息super();this.account = account;this.name = name;

21、this.id = id;this.address = address;this.balance = balance;新建AccountCard2Menu类代码如下:package com.task08;public class AccountCard2Menu /菜单类/*菜单*/public void menu()/菜单方法System.out.println(n欢迎使用银行ATM系统2.0版);System.out.println(t 1. 存 款);System.out.println(t 2. 取 款);System.out.println(t 3. 购物付款);System.out

22、.println(t 4. 查 询);System.out.println(t 5. 退 出);System.out.print(选择请输入数字1-5:);在AccountCard2Test测试类中的代码修改如下:package com.task08;import java.util.Scanner;public class AccountCard2Test /测试类/* * param args */public static void main(String args) /程序入口方法/AccountCard2.setInterest(0.03);/年利率/System.out.print

23、ln(年利率: +AccountCard2.getInterest();/通过构造方法初始化持卡人信息AccountCard2 wang=new AccountCard2();/创建类的对象int choice;do wang.menu();/* 输入数字,选择菜单 */Scanner input = new Scanner(System.in);/从键盘输入数据choice = input.nextInt();switch (choice) case 1:wang.deposit(1000.5);/存款break;case 2:wang.withdraw(500); /取款break;cas

24、e 3:wang.purchase(300); /购物break;case 4:wang.query();/查询break;case 5:System.out.println(谢谢您的使用!);System.exit(1);while(choice!=5);8.3 代码分析 131330308.4 必备知识 8.4.1 封装的概念封装的概念1. 什么是封装什么是封装在Java中通过private关键字限制对类的成员变量或成员方法的访问,称为封装。封装性是面向对象的基础,也是面向对象的核心特征之一。类是数据及对数据操作的封装体,类具有封装性。通过封装,将属性私有化,再提供公有方法访问私有属性。2

25、. 为什么要封装为什么要封装封装的目的是限制对类的成员的访问,隐藏类的实现细节。类的设计者和使用者考虑的角度不同。设计者考虑如何定义类的属性和方法,如何设置其访问权限等,而类的使用者只需知道类有哪些功能,可以访问哪些属性和方法。只要使用者使用的界面不变,即使类的内部实现细节发生变化,使用者的代码就不需要改变,增强了程序的可维护性。举个生活中封装的例子。张三是一名员工,即张三是员工类的实例。张三的隐私相当于员工类的私有属性,平时我们是无法直接获得张三的隐私。但员工有一个能力就是说出隐私,相当于员工类的公共方法,通过张三说出隐私这个公共方法,我们就可以得到张三的隐私。这就是生活中的封装。第1章目录

26、141430303. 封装的实现步骤封装的实现步骤要限制类的外部对类成员的访问,可以使用访问修饰符private修饰属性,让其他类只能通过公共方法访问私有属性。封装的实现步骤如下:修改属性的访问修饰符来限制对属性的访问。例如,AccountCard类中,属性interest、account、name、id、address都设置为private。private String account;/属性account设为privateprivate String name;/属性name设为private为每个私有属性创建一对赋值方法setter()和取值方法getter(),用于对属性的访问。例如,

27、AccountCard类对属性account、name提供的公共setter()和getter()方法:public String getAccount() /属性account的getter()方法return account;public void setAccount(String account) /属性account的setter ()方法this.account = account; /this代表当前类的实例 第1章目录8.4 必备知识必备知识 15153030public String getName() /属性name的getter()方法return name;public

28、 void setName(String name) /属性name的setter ()方法this.name = name;在setter()和getter()方法中,加入对属性的存取限制。例如,对身份证号码不加存取限制时的setter()方法:public void setId(String id) this.id = id;现在要求加入对身份证号码的长度限制,长度不为18位时在控制台显示出错信息,则setter()方法改为:public void setId(String id) if (id.length()=18)this.id = id;elseSystem.out.println

29、(身份证号码不对!);第1章目录8.4 必备知识必备知识 161630304. 封装之后的使用封装之后的使用在另一个类另一个类中要对AccountCard2类中的私有属性account、name赋值,先得到AccountCard2类的实例accountCard2,再通过使用setter()方法进行。accountCard2.setAccount(1111111111);accountCard2.setName(王朝);需要获取私有属性account、name的值,必须使用getter()方法。String account=accountCard2.getAccount();String nam

30、e=accountCard2.getName();注意:注意:不可以直接用如下方式访问私有属性account和name:accountCard2.account=1111111111;accountCard2.name=王朝;String account=accountCard2.account;String name=accountCard2.name;8.4 必备知识必备知识 171730308.4 必备知识必备知识 8.4.2 private关键字对属性四种访问权限的比较参见表8-1。访问修饰符本类本类所在包其他包中的本类子类其他包中的非子类public能访问能访问能访问能访问能访问能访

31、问能访问能访问protected能访问能访问能访问不能private能访问能访问不能不能不能缺省能访问能访问不能不能注意:访问修饰符本类本类所在包其他包中的本类子类其他包中的非子类publicpublic能访问能访问能访问能访问能访问能访问能访问能访问protected能访问能访问能访问不能privateprivate能访问能访问不能不能不能缺省能访问能访问不能不能18183030属性的public修饰符应少用,其他类访问本类属性应该通过相应的setter()或getter()方法进行。如果没有访问修饰符(缺省),则属性默认只能被同一个包中的类访问。在设计属性时,还有几个修饰符:static定

32、义的属性,称为静态变量静态变量,也称为类变量。类变量很特别,与实例变量实例变量不同,可以用类直接访问,类的所对象共享该属性。final定义常量,在方法中不可改变它的值。例如public static final double PI = 3.14159265358979323846;语句中,PI是一个常量。参见任务十。transient定义暂时性变量,用于对象存档。Volatile易失(共享)域变量,用于并发线程的共享。参见任务二十七和二十八8.4 必备知识必备知识 191930308.4.3 构造方法1. 构造方法的概念构造方法的概念构造方法是一种特殊的类的方法,方法名与类名相同,而且没有返回

33、类型,也不需要void。构造方法的作用在于对象创建时初始化对象,给实例化对象的成员变量赋初值。类中的其他方法就称为实例方法。2. 构造方法的目的构造方法的目的我们观察一下AccountCard类,它有多个私有属性,为了遵循面向对象封装的思想,就有多个对应的setter方法。在使用AccountCard类的时候,必须调用setter()方法对私有属性初始化。当开发一个项目时,类的私有属性会很多,这是很繁琐也很容易出错的事情。通过构造方法简化了对象初始化的代码。3. 构造方法格式构造方法格式与一般的类的方法相似,也有不一样之处。方法名与类名相同方法名与类名相同,无返回值,也不需要不需要void。构

34、造方法格式如下:public (参数列表)这也是构造方法与实例方法的区别。8.4 必备知识必备知识 20203030无参构造方法public class Bookprivate String bookName;/*无参构造方法,方法名Book与类名Book相同,无返回值,也不需要void */public Book() this.bookName = Java程序设计任务驱动式教程;public String getBookName() return bookName;public void setBookName(String bookName) this.bookName = bookNa

35、me;在BookTest测试类中实例化Book类时,代码如下:Book book = new Book();实现了book对象的bookName属性的初始化。book.getBookName()的返回值为Java程序设计任务驱动式教程。8.4 必备知识必备知识 21213030带参构造方法public class Bookprivate String bookName;/*带参构造方法,方法名Book与类名Book相同,无返回值,也不需要void */public Book(String bookName) this.bookName = bookName;public String getB

36、ookName() return bookName;public void setBookName(String bookName) this.bookName = bookName;在BookTest测试类中实例化Book类时,代码如下:Book book = new Book(Java程序设计任务驱动式教程程序设计任务驱动式教程);/有实参有实参创建book对象的时候,显式地为bookName实例变量赋初始值。book.getBookName()的返回值为Java程序设计任务驱动式教程。当私有属性很多时,带参构造方法的参数也多,省去了多行的赋值语句,灵活性更大些。8.4 必备知识必备知识

37、22223030注意:注意:构造方法不能像成员方法那样被直接调用,只能通过new运算符实例化一个对象时,由系统自动调用,实现对成员变量初始化的作用。例如:Book book = new Book();/调用构造方法,实例化一个对象bookBook()就是Book类的一个无参构造方法。在前面的任务中学习时,有的类没有定义构造方法,怎么能生成一个类的对象呢?在Java中,系统会为这样的类自动生成一个无参的默认构造方法,然后,使用默认值初始化对象的成员变量。数值型变量的默认值为0,布尔型为false,字符型为“0”,字符串为null。所以,当Book类没有定义构造方法时,我们在代码中仍然可以用new

38、 Book()实例化一个对象实例化一个对象。8.4 必备知识必备知识 23233030改错:改错:下面Constructor类中关于构造方法有哪些错误?public class Constructor private int x;public Constructor () x = 1;public Constructor (int i) x = i;public int Constructor (int i) x = i;return x+;private Constructor (int i, String s)public Constructor (String s,int i)priva

39、te Constructe (int i)x=i+;private void Constructe (int i)x=i+; 提示:有1个错误。区分哪些是实例方法,哪些是构造方法。8.4 必备知识必备知识 242430308.4.4 方法重载1. 什么是方法重载什么是方法重载在同一个类中,多个方法具有相同的方法名,但却具有不同的参数列表,方法之间的这种关系称为方法重载。重载方法中的参数列表必须不同,也就是说,参数个数、参数类型或参数顺序不同,至少三者中有一项不同。例如,任务中一直使用的java.io.PrintStream类的println()方法,能够打印多种类型数据,有多种实现方式:pub

40、lic void println(float x);public void println(String y);根据方法重载的定义,这些同名的println()方法之间的关系就是方法重载。方法重载并不由方法的返回类型决定。例如,以下同名的circle ()方法之间的关系就不是方法重载。public float circle(float x);public int circle (float x);2. 为什么需要方法重载为什么需要方法重载因为在完成同一功能时,可能遇到不同的具体情况,比如在控制台输出信息,可能有实数输出、整数输出、字符输出、字符串输出等,定义多个不同方法名的方法,无论在设计还是

41、在调用时,都是很麻烦的事。采用方法重载,用相同的方法名,不同的参数列表,就解决了这些问题。8.4 必备知识必备知识 252530303. 方法重载举例方法重载举例加法器类代码如下:package com.task08;/* * Calculate.java * 用加法器解释方法重载*/public class Calculate /*add()方法之间关系为方法重载*/public int add(int a,int b)/方法一:参数类型为intreturn a+b;public double add(double a,double b)/方法二:参数类型为doublereturn a+b;

42、public float add(float a,float b)/方法三:参数类型为floatreturn a+b;8.4 必备知识必备知识 26263030测试类代码:package com.task08;public class CalculateTest /* * param args */public static void main(String args) Calculate calculate=new Calculate();System.out.println(calculate.add(1, 2);/调用方法一:参数类型为intSystem.out.println(calc

43、ulate.add(1.0, 2.0);/调用方法二:参数类型为doubleSystem.out.println(calculate.add(1.0f, 2.0f);/调用方法三:参数类型为float程序运行之前,在编译时根据参数列表决定调用哪个方法。8.4 必备知识必备知识 27273030改错:改错:下面方法重载有哪些错误?第一组方法重载:public int max(int a, int b);public void max(int a, int b);public int max(int x, int y);public int max(double a, double b);第二组方

44、法重载:public int area(int a);public int area(int a, int b);public double area(double a, double b); public int area(double a, double b);提示:有2+1=3个错误。8.4 必备知识必备知识 282830304. 构造方法的重载构造方法的重载构造方法重载仍然遵守方法重载定义。在Book类中,有两个构造方法,一个无参,一个带参代码如下:public class Bookprivate String bookName;/*无参构造方法*/public Book() this

45、.bookName = Java程序设计任务驱动式教程;/*带参构造方法*/public Book(String bookName) this.bookName = bookName;当在BookTest测试类中实例化时,如果将书名设置为默认的“Java程序设计任务驱动式教程”,则使用Book()构造方法简便,如果将书名设置为其他的名字,则用Book(String bookName) 构造方法灵活。 8.4 必备知识必备知识 292930308.5 动手做一做动手做一做一、实训目的掌握封装的思想和实现;掌握构造方法的创建与使用;掌握方法重载的使用。二、实训内容1.通过封装编写Book类。要求:

46、类具有属性书名、书号、主编、出版社、出版时间、页数、价格,其中页数不能少于200页,否则输出错误信息,并强制赋默认值200;为各属性设置赋值和取值方法;具有方法detail(),用来在控制台输出每本书的信息。编写BookTest测试类。为Book对象的属性赋予初始值,然后调用Book对象的detail方法,看看输出是否正确。2.给Book类增加构造方法,同时对测试类也做相应的修改。三、简要提示首先考虑将类的属性设为private,再设属性的getter()和setter()方法。应该区分在同一个类和不同类中对私有属性的访问方式不同。再考虑构造方法的方法重载,一个是无参构造方法,一个是带参构造方法。四、程序代码参见本教材教学资源。五、实训思考1.属性定义为私有之后,类的内部可以直接访问?类的外部可以直接访问?2.什么情况下使用方法重载?30303030

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号