Java程序设计课件Java程序设计 (3).pdf
《Java程序设计课件Java程序设计 (3).pdf》由会员分享,可在线阅读,更多相关《Java程序设计课件Java程序设计 (3).pdf(81页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java语言程序设计(第2版)1第 2 章 类与对象(二)MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学2MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
2、BBBBBC+语言程序设计(第4版),郑莉,清华大学3 类在不同范围是否可以被访问:类型无修饰(默认)public同一包中的类同一包中的类是是不同包中的类不同包中的类否是类的访问权限控制MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学4 公有(public)可以被其他任何方法访问(前提是对类成员所属的类有访问权限)保护(protected)只可被同一
3、类及其子类的方法访问 私有(private)只可被同一类的方法访问 默认(default)仅允许同一个包内的访问;又被称为“包(package)访问权限”类的成员访问权限控制MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学5类型private无修饰protectedpublic同一类是是是是是是是是同一包中的子类否否是是是是是是同一包中的非子类否否是
4、是是是是是不同包中的子类否否否否是是是是不同包中的非子类否否否否否否是是类成员在不同范围是否可以被访问MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB例:改进的圆类将实例变量设置为privatepublic class Circle static double PI=3.14159265;private int radius;public double circumference()retu
5、rn 2*PI*radius;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB例:改进的圆类 再编译CircumferenceTester.javapublic class CircumferenceTester public static void main(String args)Circle c1=new Circle();c1.radius=50;Circle c2=new Circ
6、le();c2.radius=10;double circum1=c1.circumference();double circum2=c2.circumference();System.out.println(Circle 1 has circumference +circum1);System.out.println(Circle 2 has circumference +circum2);MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
7、BBBBBBBBBBBBBBBBBBBBBBBBB例:改进的圆类 编译时会提示出错在编译语句“c1.radius=50;”及“c2.radius=10;”时会提示存在语法错误“radius has private access in Circle”说错误原因Circle类中变量radius被声明为private,在其它类中不能直接访问radius;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
8、BBJava语言程序设计(第2版),郑莉,清华大学 如果要允许其它类访问radius的值,需要在Circle类中声明相应的公有方法。通常有两类典型的方法用于访问属性值,get方法及set方法9MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学10 功能是取得属性变量的值 get方法名以“get”开头,后面是实例变量的名字 例如:public int g
9、etRadius()return radius;get方法MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学11 功能是修改属性变量的值 set方法名以“set”开头,后面是实例变量的名字 例如:public void setRadius(int r)radius=r;set方法MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
10、MMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJava语言程序设计(第2版),郑莉,清华大学 如果方法的局部变量(包括形参)与类的非静态成员同名怎么办?12MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学13 如果方法
11、内的局部变量(包括形参)名与实例变量名相同,则方法体内访问实例变量时需要this关键字。例如:public void setRadius(int radius)this.radius=radius;this关键字MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJava语言程序设计(第2版),郑莉,清华大学 在这一节我们学习了类和类成员的访问控制。14MMMMMMMMMMMMMMMMMMMMM
12、MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学15MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学16 对象初始化 系统在生成对象时,会为对象分
13、配内存空间,并自动调用构造方法对实例变量进行初始化 对象回收 对象不再使用时,系统会调用垃圾回收程序将其占用的内存回收MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学17构造方法 用来初始化对象 每个类都需要有构造方法MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBB
14、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学18 方法名与类名相同;不定义返回类型;通常被声明为公有的(public);可以有任意多个参数;主要作用是完成对象的初始化工作;不能在程序中显式的调用;在生成一个对象时,会自动调用该类的构造方法为新对象初始化;若未显式声明构造方法,编译器隐含生成默认的构造方法。构造方法MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBB
15、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学19 没有参数(内部类除外),方法体为空;使用默认的构造方法初始化对象时,如果在类声明中没有给实例变量赋初值,则对象的属性值为零或空;默认构造方法MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJava语言程序设计(第2版),郑莉,清华大学 下面我们来看一个默认构造
16、方法的例子20MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB例:一个银行帐户类及测试代码public class BankAccountStringownerName;intaccountNumber;float balance;public class BankTesterpublic static void main(String args)BankAccount myAccount=
17、new BankAccount();System.out.println(ownerName=+myAccount.ownerName);System.out.println(accountNumber=+myAccount.accountNumber);System.out.println(balance=+myAccount.balance);运行结果ownerName=nullaccountNumber=0balance=0.0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBB
18、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJava语言程序设计(第2版),郑莉,清华大学 如何自定义构造方法,使新对象按照程序员设计的方式被初始化?自定义构造方法。22MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学23 在生成对象时给构造方法传送初始值,为对象进行初始化。构造方法可以被重载 一个类中
19、有两个及以上同名的方法,但参数表不同,这种情况就被称为方法重载。在方法调用时,可以通过参数列表的不同来辨别应调用哪一个方法。只要显式声明了构造方法,编译器就不再生成默认的构造方法。也可以显式声明无参数的造方法,方法体中可以定义默认初始化方式。自定义构造方法与方法重载MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJava语言程序设计(第2版),郑莉,清华大学 在下面的例子中,我们为银行账号类
20、声明构造方法24MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB例:为银行帐户类增加构造方法为BankAccount声明一个有三个参数的构造方法public BankAccount(String initName,int initAccountNumber,float initBalance)ownerName=initName;accountNumber=initAccountNumber
21、;balance=initBalance;假设一个新帐号的初始余额可以为0,则可增加一个带有两个参数的构造方法public BankAccount(String initName,int initAccountNumber)ownerName=initName;accountNumber=initAccountNumber;balance=0.0f;无参数的构造方法自定义默认的初始化方式public BankAccount()ownerName=;accountNumber=999999;balance=0.0f;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
22、MMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJava语言程序设计(第2版),郑莉,清华大学 初始化逻辑相同,只是初始值不同的多个重载构造方法,需要冗余地写多个方法体吗?26MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学2
23、7 可以使用this关键字在一个构造方法中调用另外的构造方法;代码更简洁,维护起来也更容易;通常用参数个数比较少的构造方法调用参数个数最多的构造方法。声明构造方法时使用this关键字MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB例:使用this的重载构造方法public BankAccount()this(,999999,0.0f);public BankAccount(String in
24、itName,int initAccountNumber)this(initName,initAccountNumber,0.0f);public BankAccount(String initName,int initAccountNumber,float initBalance)ownerName=initName;accountNumber=initAccountNumber;balance=initBalance;28MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBB
25、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJava语言程序设计(第2版),郑莉,清华大学 在类中定义变量时,加上final修饰,那便是说,这个变量一旦被初始化便不可改变;29MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC+语言程序设计(第4版),郑莉,清华大学30 实例变量和类变量都可被声明为final;final实例变量可以在类中定义时给出初始
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java程序设计课件Java程序设计 3 Java 程序设计 课件
限制150内