版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章类与对象14.1类与对象的概念
4.2类的定义
4.3对象4.4成员变量4.5成员方法
4.6类的组织方式——包
4.7访问权限
4.8内部类4.9可变参数24.1类与对象的概念
现实世界中的任何事物都是对象。
所有的事物都有它的属性和行为。
属性表示事物的静态特征,在某个时刻各个属性的取值反映事物的状态;行为表示事物的动态特征,一个行为可能会影响或改变事物的状态。人们通过属性和行为来区分事物。3概念名称:人属性:性别、年龄、身高、体重等行为:直立行走、会说话、能劳动等人脑的概念世界张三李四王五陈六现实世界抽象实例化张三李四王五陈六计算机世界类名:人变量:性别、年龄、身高、体重等方法:直立行走、会说话、能劳动等映射映射4类与对象的关系在计算机世界中,类是人脑概念世界的软件模型,由变量和方法组成,它定义了对象的本质属性和共同行为,是创造对象的“模板”。对象是对现实世界中实体的描述,是现实世界中事物的软件模型,由数据(变量值)和方法组成。并且通过对类的实例化产生对象,进而引用对象。简而言之,类是对象的模板,对象是类的实例。54.2类的定义4.2.1类定义的基本形式4.2.2类定义的一般形式64.2.1类定义的基本形式定义的基本形式是:class类名{成员变量;成员方法;}
⑴class是关键字,表明其后定义的是一个类。⑵类名是用户为该类所起的名字,它必须是一个合法的Java标识符。⑶类体中的成员变量可以有多个,成员方法也可以有多个。7【例4-1】定义一个表示圆的类
classCircle{
//成员变量:圆的半径doubleradius;
//成员方法:计算圆的面积doublegetArea(){ returnradius*radius*Math.PI;}
//成员方法:计算圆的周长doublegetPerimeter(){ return2*radius*Math.PI;}}【模仿例4-1】定义矩形类、三角形类、梯形类。8【例4-2】在Java语言中,定义人类。编程思路:首先,将现实世界中各种人抽象成人脑概念世界中的概念“人”。它包括属性:姓名(name)、性别(sex)、年龄(age)等状态信息,和行为:直立行走(walk)、会说话(speak)、能劳动(work)等。其次,在Java程序中,用变量表示状态信息,用方法表示行为。9classHumankind{ Stringname; charsex; intage; intheight; floatavoirdupois; voidwalk(){ System.out.println(name+"canwalk."); } voidspeak(){ System.out.println(name+"canspeak."); } voidwork(){ System.out.println(name+"canwork."); }}10【例4-3】定义职员类
编程思路:首先,将现实世界中各种职员抽象成人脑概念世界中的概念“职员”。包括属性和行为。其次,为了解决工资管理问题,性别、年龄、身高、体重等属性以及会说话、能劳动等行为,与工资管理关系不大,可被忽略。这样,就抽象成人脑概念世界中的概念“职工”,它包括工号(id)、姓名(name)、职务(post)、工资(salary)等属性,以及升职(changePost)、调资(changeSalary)、打印职工信息(print)等行为。。11classEmployee{ intid; Stringname,post; longsalary;
voidchangePost(StringnewPost){ post=newPost; } voidchangeSalary(longamount){ salary=salary+amount; } voidprint(){ System.out.println("工号:"+id+"\t姓名:"+name+ "\t职务:"+post+"\t月薪:"+salary); }}124.2.2类定义的一般形式类的定义格式:类修饰符class类名称[extends父类名称][implements接口名称列表]{成员变量的定义及初始化成员方法的定义及初始化}类的定义分为三个部分:IS,HAS,DOES。类的并列和嵌套在一个程序中,有时需要定义多个类。多个类的定义形式有两种:并列和嵌套。134.3
对象
4.3.1对象的声明
4.3.2对象的创建与初始化
4.3.3对象的引用和清除144.3.1对象的声明对象声明的格式:
类名对象变量名;其中,类名为引用类型(包括类、接口和数组)。声明不为对象分配空间,只为引用型变量分配一个空间,用来存放引用值。例如下列语句:
HumankindzhangSan,liSi;Humankind是已经定义的类,是类型。zhangSan,liSi为引用变量。引用类型变量存储一个对象的引用值,不是对象本身。
154.3.1对象的声明(续)熟悉C语言的同学,可进行如下类比。在C语言中定义int*p;//p是一个指针变量,它存放某个整型变量的地址,不存放某个整型值。structNode{intdata;structNode*next;}*p;//p是一个指针变量,它存放Node结构体类型的某个变量地址,不存放Node结构体类型某个变量的值。在Java中,引用型变量就相当于指针变量,引用值就相当于变量地址,对象就相当于Node结构体类型某个变量的值。引用类型变量只存储某个对象的引用值,不存储对象本身。164.3.2对象的创建与初始化
实例创建表达式的一般格式如下:
new类名([实参表]);实例创建表达式用于创建指定类的一个实例。其具体功能包括:(1)为实例分配内存空间;(2)初始化实例变量;(3)返回该实例的引用值。根据例4-1,创建zhangSan对象的过程如下:①HumankindzhangSan;②zhangSan=newHumankind();174.3.3对象的引用和清除
引用成员变量的格式为:
对象变量名.成员变量名实例创建表达式用于创建指定类的一个实例。其具体功能包括:(1)为实例分配内存空间;(2)初始化实例变量;(3)返回该实例的引用值。根据例4-1,创建zhangSan对象的过程如下:①HumankindzhangSan;②zhangSan=newHumankind();184.3.3对象的引用和清除(续)
引用成员方法的格式为:
对象变量名.成员方法名([参数表]);
对象的清除是当不存在对某一对象的引用时,就释放该对象所占用的内存空间。对象清除的基本方法有:⑴依靠垃圾回收机制回收内存。它周期性地回收不用对象所占用的内存。⑵调用System.gc(),请求垃圾回收器释放不用对象所占内存。⑶Java系统开始时,自动调用Java.lang.Object.finalize()释放对象所占内存。⑷在程序中调用重写的finalize()释放对象所占内存。对象清除是由垃圾回收器自动完成的,一般来说,程序员不需要做任何工作。
19【例4-4】定义圆类,创建圆对象,计算周长和面积
classCircle{
//成员变量:圆的半径doubleradius;
//成员方法:计算圆的面积doublegetArea(){ returnradius*radius*Math.PI;}
//成员方法:计算圆的周长doublegetPerimeter(){ return2*radius*Math.PI;}}20【例4-4】创建圆对象,计算周长和面积(续)
classEx4_4{ publicstaticvoidmain(String[]args){ //圆类对象obj的创建及初始化Circleobj=newCircle();
obj.radius=10;//obj成员变量radius的引用 //obj成员方法getArea()的引用System.out.println("Area="+obj.getArea());//obj成员方法getPerimeter()的引用 System.out.println("Perimeter="+obj.getPerimeter()); }}【例4-5】编写一个程序,创建张三、李四对象,测试例4-2的Humankind类。21classHumankind{ Stringname; charsex; intage; intheight; floatavoirdupois; voidwalk(){ System.out.println(name+"canwalk."); } voidspeak(){ System.out.println(name+"canspeak."); } voidwork(){ System.out.println(name+"canwork."); }}22classEx4_5{ publicstaticvoidmain(String[]args[]){ HumankindzhangSan; zhangSan=newHumankind(); HumankindliSi=newHumankind(); //zhangSan对象成员变量的引用(赋值) zhangS="张三"; zhangSan.sex='m'; zhangSan.age=18; zhangSan.height=170; zhangSan.avoirdupois=60.5f; //lisi对象成员变量的引用(赋值) liS="李四";liSi.sex='f'; liSi.age=20; liSi.height=180; liSi.avoirdupois=70.5f;23 //zhangSan对象成员变量的引用(取值) System.out.println("姓名"+"\t"+"性别"+"\t"+"年龄"+"\t"+"身高"+"\t"+"体重"); System.out.println(zhangS+"\t"+zhangSan.sex+"\t"+zhangSan.age+"\t"+zhangSan.height+"\t"+zhangSan.avoirdupois);//lisi对象成员变量的引用(取值)System.out.println(liS+"\t"+liSi.sex+"\t"+liSi.age+"\t"+liSi.height+"\t"+liSi.avoirdupois); //zhangSan对象成员方法的引用 zhangSan.walk(); zhangSan.speak(); zhangSan.work(); //lisi对象成员方法的引用 liSi.walk(); liSi.speak();liSi.work(); }}244.4
成员变量
4.4.1成员变量声明的一般形式
4.4.2实例变量和类变量
4.4.3变量的初始化
4.4.3常量4.4.3变量的作用域254.4
成员变量在Java语言中,变量分为局部变量和成员变量两大类。成员变量是指在类体内且在方法体外定义的变量。其作用域是整个类。局部变量是指在方法体内声明的变量,其作用域是从声明处开始至它所在的最小块语句结束处。另外,方法中的形参、for语句中定义的循环变量也都属于局部变量。264.4.1成员变量声明的一般形式
成员变量声明的一般格式是:[可访问性修饰符][static][final][其它]类型名变量名[=初始化表达式][,变量名[=初始化表达式]]…;上述可选项,其含义分别为:⑴可访问性修饰符说明该变量的可访问属性,即定义可被访问的范围。这些修饰符是public、protected、private和默认(或缺省)。其用法在4.7访问权限中详细介绍。274.4.1成员变量声明的一般形式(续)
⑵被static修饰的成员变量称为类变量(或静态变量),而没有被static修饰的成员变量称为实例变量。类变量是属于类;实例变量是属于对象(或实例)。⑶被final修饰的变量(局部变量或成员变量)通常被称为有名常量。与普通变量不同,有名常量必须赋值且只能赋值一次。之后,有名常量的值就不能再被修改。⑷其它是指transient和volatile。transient:定义一个暂时变量,指示Java虚拟机该变量不是对象永久状态的一部分,在对象序列化时不需要考虑。volatile:定义一个共享变量,告诉Java编译器该变量的值可能会被当前线程之外的其他线程改变。284.4.2实例变量和类变量
实例变量:在类体内且在方法体外定义的变量,且变量名前没有static修饰符。类变量:在类体内且在方法体外定义的变量,且变量名前有static修饰符。局部变量:在方法体内或块内定义的变量,变量名前只能用final修饰或没有修饰符。29【例4-7】定义圆类Circle,它包含半径、圆类对象的总个数和局部变量,并用测试类测试Circle类。classCircle{
staticinttotal=0;//类变量 doubleradius;//实例变量 voidprint(){ intvar_number=0;//局部变量 System.out.println("Circletotal="+total);var_number++; System.out.println("radius="+radius);var_number++; System.out.println("var_number="+var_number); } }30【例4-7】(续)publicclassEx4_7{publicstaticvoidmain(String[]args){ Circleobject1,object2,object3; object1=newCircle(); object1.radius=10;object1.total++;object1.print(); object2=newCircle(); object2.radius=20;object2.total++;object2.print(); object3=newCircle(); object3.radius=30;object3.total++;object3.print();
31【例4-7】(续) System.out.println("total="+Circle.total); System.out.println("object1radius="+object1.radius);System.out.println("total="+object2.total); System.out.println("object2radius="+object2.radius);System.out.println("total="+Circle.total); System.out.println("object3radius="+object3.radius);}}32引用引用堆区方法区main()方法栈区Java栈区局部变量object3局部变量object1局部变量object2Circle类型信息(包含print()方法和静态变量total)CircleTest类型信息(包含main()方法)object1实例radius:10object1实例radius:20object1实例radius:30运行时数据区(内存)引用33对象、类变量和实例变量在数据区的位置:①类变量和方法:方法区②对象:堆区③局部变量:Java栈区④引用型变量:引用型变量是局部变量时,它在Java栈区引用型变量是类的实例变量时,它在堆区引用型变量是静态变量时,它在方法区344.4.3变量的初始化变量初始化是指变量定义以后,首次给它赋初始值的过程。成员变量(类变量和实例变量)的初始化:无论是实例变量还是类变量,在建立时,系统首先赋一个默认的初始值。初始化为默认值的规则为:⑴整数型(byte、short、int和long)基本类型变量的默认值为0。⑵单精度浮点型(float)基本类型变量的默认值为0.0f。354.4.3变量的初始化(续)⑶双精度浮点型(double)基本类型变量的默认值为0.0d。⑷字符型(char)基本类型变量的默认值为“\u0000”,即空字符。⑸布尔型(boolean)基本类型变量的默认值为false。⑹引用型变量的默认值为null。⑺数组引用类型变量的默认值为null。如果一个变量在定义时包含有初始化表达式,那么系统会随后计算该表达式并给变量重新赋值。这种情况也被称为显式初始化变量。
36【例4-8】【例4-8】定义职员类,包含公司名称、职员姓名、姓名、年龄、性别、婚否及工资等变量。打印变量的初始值。publicclassEmployee{staticStringcorpName;//公司名称Stringname;//职员姓名intage;//职员年龄charsex;//职员性别booleanisMarried;//婚否floatsalary;//工资37【例4-8】(续)publicstaticvoidmain(String[]ags){ Employeeo=newEmployee(); System.out.println("corpName="+corpName); System.out.println("name="+); System.out.println("age="+o.age); System.out.println("isMarried="+o.isMarried); System.out.println("salary="+o.salary); System.out.println("sex="+o.sex);}}38【例4-9】局部变量的错误引用
classErrLocalVar{publicstaticvoidmain(Stringargs[]){ inti;//局部变量i //引用局部变量iSystem.out.println("i="+i);}}39类变量和实例变量在类中的初始化类的结构为:classclassName{成员变量(实例变量、类变量)成员方法(实例方法、类方法)构造方法静态初始化块动态初始化块}40常见错误根据类的结构,成员变量只能在成员变量、成员方法中、构造方法中、静态初始化块中或动态初始化块中引用,否则,编译器会报错。【例4-10】成员变量的错误引用。将例4-7的Circle类改写如下。41classErrRefVar{staticinttotal;doubleradius;
total=0;//成员变量的引用在成员方法外
radius=10;//成员变量的引用在成员方法外voidprintVar(){ System.out.println("total="+total); System.out.println("radius="+radius);}publicstaticvoidmain(String[]args){ ErrRefVarobj=newErrRefVar(); obj.printVar();}}42静态初始化块和动态初始化块
静态初始化块初始化类变量。格式:static{...}动态初始化块初始化实例变量。格式:{...}一个类中可以定义一个或多个静态/动态初始化块。不是方法,只是初始化变量。区别:静态初始化块在类装入时自动执行动态初始化块在创建对象时自动执行43【例4-11】定义职员类,包含公司名称、职员姓名、年龄、性别、婚否及工资等变量。使用静态初始化块和动态初始化块初始化变量,并打印变量的初始值。classEmployee{staticStringcorpName="辉煌公司";//静态初始化块static{ corpName="辉煌国际集团";}//动态初始化块 { name="李四";}44intage=20;//职员年龄charsex='m';//职员性别//动态初始化块{ age=30; sex='f';}//动态初始化块{ isMarried=true; salary=2000.1f;}booleanisMarried=false;//婚否floatsalary=1000.9f;//工资Stringname="张三";//职员姓名publicstaticvoidmain(String[]ags){ Employeeo=newEmployee();
45 System.out.println("corpName="+corpName); System.out.println("name="+); System.out.println("age="+o.age); System.out.println("isMarried="+o.isMarried); System.out.println("salary="+o.salary); System.out.println("sex="+o.sex);}}464.4.4常量一个变量不管它是类变量、实例变量,还是局部变量,只要被final修饰,那么就被称为有名常量。有名常量必须赋值且只能赋值一次。
【例4-12】定义有名常量PI,求圆的面积和周长。classCircle{doubleradius;//成员变量:圆的半径//有名常量PI,STATIC_PIfinaldoublePI=3.1415926;staticfinaldoubleSTATIC_PI=3.1415926;}474.4.4常量(续)classEx4_12{publicstaticvoidmain(String[]args){ Circleobj=newCircle(); obj.radius=10; System.out.println("Area="+obj.radius*obj.radius*obj.PI); System.out.println("Perimeter="+2*obj.radius*obj.PI); System.out.println("STATICArea="+obj.radius*obj.radius*Circle.STATIC_PI); System.out.println("STATICPerimeter="+2*obj.radius*Circle.STATIC_PI);}}484.4.5变量的作用域变量的作用域是指变量有效使用的范围,是变量的属性。根据定义变量的位置不同,其作用域也不相同。局部变量是定义在块内、方法内的变量。其作用域是以块和方法为单位的,仅在定义该变量的块或方法内有效。实例变量和类变量定义在类内、方法外的变量,它们的作用域是以类为单位的。区别在于引用变量的方式不同。方法参数和异常处理参数的作用域分别是以方法和块为单位的,与局部变量类似。49局部变量可以与类变量、实例变量同名50局部变量、实例变量和类变量的小结
⑴局部变量与成员变量(实例变量、类变量)的变量名可以相同。⑵局部变量的语句块发生嵌套时,内层语句块定义的变量不能与外层语句块定义的变量同名。⑶成员变量名可与成员方法名相同。⑷方法的参数属于局部变量。⑸局部变量必须显式初始化,成员变量不必显式初始化,系统首先给成员变量分配一个默认值。⑹方法体内不能定义类变量。514.5
成员方法
4.5.1成员方法声明的一般形式
4.5.2实例方法与类方法
4.5.3构造方法
4.5.4方法重载
4.5.5数据传递524.5.1成员方法声明的一般形式格式是:[可访问性修饰符][abstract][static][final][native][synchronize]返回类型方法名(形参表)[throws异常类名表]{…//方法体}1.修饰符2.返回类型3.形参表4.方法体534.5.2实例方法与类方法类方法(或静态方法):被static修饰,实例方法:没有被static修饰。类方法和实例方法的区别:⑴调用方式不同:不在同一个类中,方法名([实参表])
不在同一个类中,对象引用.方法名([实参表])
类名.方法名([实参表])
544.5.2实例方法与类方法(续)⑵访问的成员不同:·实例方法可以直接访问该类的实例变量和实例方法,也可以访问类变量和类方法。类方法只能访问该类的类变量和类方法,不能直接访问实例变量和实例方法
55【例4-13】类方法不能直接访问实例变量
classStaticError{Stringmystring=“hello”;publicstaticvoidmain(Stringargs[]){System.out.println(mystring);}}编译时错误信息:nonstaticvariablemystringcannotbereferencedfromastaticcontext“System.out.println(mystring);”。56【例4-13改正1】classNoStaticError{
staticStringmystring=“hello”;publicstaticvoidmain(Stringargs[]){System.out.println(mystring);}}57【例4-13改正2】classNoStaticError{Stringmystring=“hello”;publicstaticvoidmain(Stringargs[]){
NoStaticErrorobj;
obj=newNoStaticError();System.out.println(obj.mystring);}}58一般来说,把实例变量声明为private(只能被这个类的成员访问,在类外不可见),向外提供get方法及set方法访问该实例变量。通过这种的策略,避免类外代码直接操作实例变量。即相对于类外代码而言,实例变量隐藏起来(看不见),无法直接操作。59get方法的功能是取得成员变量的值。get方法的格式如下:public类型get成员变量名(){return成员变量;}set方法的功能是修改成员变量的值。set方法的格式如下:publicvoidset成员变量名(成员变量类型参数名){成员变量=参数名;}60【例4-14】使用带get方法及set方法,完善例4-4的Circle类。classCircle{privatedoubleradius;//成员方法:设置圆的半径,r为负数时,半径为0
publicvoidsetRadius(doubler){
if(r<0) {radius=0;}
else{ radius=r;}
}//成员方法:得到圆的半径
publicdoublegetRadius(){ returnradius;
}61【例4-14】(续)
publicdoublegetArea(){ returnradius*radius*Math.PI;}publicdoublegetPerimeter(){ return2*radius*Math.PI;}}classEx4_14{ publicstaticvoidmain(String[]args){ Circleobj=newCircle(); obj.setRadius(-10); System.out.println("Area="+obj.getArea()); System.out.println("Perimeter="+obj.getPerimeter()); }62【例4-15】模仿例4-13,使用带get方法及set方法,改写完善例4-6的Employee类。classEmployee{
privatestaticintnextId=1; privateintid; privateStringname,post; privatelongsalary; //使用类变量nextId实现自动生成职工的工号
publicvoidsetId(){ id=nextId; nextId++; }63 publicvoidsetName(StringmyName){name=myName;} publicvoidsetPost(StringmyPost){post=myPost;} publicvoidsetSalary(longmySalary){salary=mySalary;} publicintgetId(){returnid;} publicStringgetName(){returnname;} publicStringgetPost(){returnpost;} publiclonggetSalary(){returnsalary;} voidchangePost(StringnewPost){post=newPost;} voidchangeSalary(longamount){salary=salary+amount;} voidprint(){System.out.println("工号:"+id+"\t姓名:"+name+ "\t职务:"+post+"\t月薪:"+salary); }}
64classEx4_15{publicstaticvoidmain(String[]args){ Employee丁一,倪二,张三; 丁一=newEmployee();倪二=newEmployee(); 张三=newEmployee(); 丁一.setId();丁一.setName("丁一"); 丁一.setPost("部门经理");丁一.setSalary(9000);倪二.setId();倪二.setName("倪二"); 倪二.setPost("部门副经理");倪二.setSalary(6000); 张三.setId();张三.setName("张三"); 张三.setPost("职员");张三.setSalary(3000); 丁一.print(); 倪二.print(); System.out.print("工号:"+张三.getId()+"姓名:"+张三.getName()); System.out.println("职务:"+张三.getPost()+"月薪:"+张三.getSalary()); }}654.5.3构造方法构造方法:在创建对象时就对对象进行初始化是一种简单而有效的方法。其具体功能是:为实例分配内存空间;初始化实例变量;返回该实例的引用值。其中,实例变量的初始化按以下步骤进行:(1)创建所有的实例变量并赋以默认的初始值。数值型:0逻辑型:false引用型:null(2)按照在程序正文中出现的先后次序,计算实例变量定义语句中的初始化表达式并赋值,或者执行实例初始化块中的语句。这部分可称为显式初始化。(3)执行构造方法中的代码。664.5.3构造方法构造方法定义的格式如下:[访问修饰符]类名([形参表]){构造方法体}【例4-16】使用构造方法,改写完善例4-6的Employee类。classEmployee{ privatestaticintnextId=1; privateintid; privateStringname,post; privatelongsalary;674.5.3构造方法(续) //构造方法 publicEmployee(StringmyName,StringmyPost,longmySalary){ setId(); setName(myName); setPost(myPost); setSalary(mySalary); }/*为了节约篇幅,与例4-15相同部分省略,*/}684.5.3构造方法(续)classEx4_16{publicstaticvoidmain(String[]args){ Employee丁一,倪二,张三; 丁一=newEmployee("丁一","部门经理",9000); 倪二=newEmployee("倪二","部门副经理",6000); 张三=newEmployee("张三","职员",3000);
丁一.print(); 倪二.print();张三.print();}}694.5.3构造方法(续)classEx4_16{publicstaticvoidmain(String[]args){ Employee丁一,倪二,张三; 丁一=newEmployee("丁一","部门经理",9000); 倪二=newEmployee("倪二","部门副经理",6000); 张三=newEmployee("张三","职员",3000);
丁一.print(); 倪二.print();张三.print();}}704.5.4方法重载在一个类中,如果出现方法名相同但形参表不同的多个方法,这种情形称为方法重载。其中,形参表不同是指:⑴参数的类型不同⑵参数的顺序不同。如:voidmethod(inti,floatf){…}与voidmethod(floatf,inti){…}⑶参数的个数不同注意:只要在同一个类中,方法名相同且形参表不同就是重载,而不管方法的返回类型是否相同、方法的修饰符是否相同。71【例4-17】【例4-17】定义一个类,并使用方法重载,计算平面和空间的点到原点的距离。classEx4_17{publicdoubledistance(doublex,doubley){ returnMath.sqrt(x*x+y*y);}publicdoubledistance(doublex,doubley,doublez){ returnMath.sqrt(x*x+y*y+z*z);}publicstaticvoidmain(String[]args){ Ex4_17obj=newEx4_17(); System.out.println("place="+obj.distance(1,1)); System.out.println("space="+obj.distance(1,2,2));}}72【例4-18】构造方法重载
classCircle{doubleradius;//构造方法publicCircle(){…}与publicCircle(doubler){…}重载publicCircle(){
this(0);System.out.println("defaultconstructor");}publicCircle(doubler){ radius=r;System.out.println("Circle(doubler)constructorr="+r);}publicdoublegetArea(){ returnradius*radius*Math.PI;}publicdoublegetPerimeter(){ return2*radius*Math.PI;}}73【例4-18】构造方法重载(续)classEx4_18{ publicstaticvoidmain(String[]args){ Circleobj1=newCircle(); Circleobj2=newCircle(10); //obj1成员方法getArea()的引用System.out.println("obj1Area="+obj1.getArea());//obj2成员方法getArea()的引用 System.out.println("obj2Area="+obj2.getArea()); }}744.5.5数据传递⑴参数传递:调用方法的对象(发送对象)向包含方法的对象(接收对象)传递数据。⑵方法返回:包含方法的对象(接收对象)向调用方法的对象(发送对象)传递数据。⑶实例变量:实例变量是作为一个对象中诸方法的共享的变量来传送数据。⑷类变量:类变量是作为同一类中所有对象诸方法的共享变量来传送数据。754.5.5数据传递1.参数传递:参数是基本类型:按值传递。形参值可能会改变,但不能改变对应的实参值。其特点是“数据单向传送”。参数是引用类型:按引用值传递。其特点是“引用值单向传送,数据双向传送”。【例4-20】参数是基本类型和引用类型,在参数传递中的区别。classMemberVar{ intvar=0; }764.5.5数据传递(续)classParamTransfer{//n是值传递,o1,o2是引用值传递publicvoidchangeParameter(intn,MemberVaro1,MemberVaro2){ n=10; o1.var=10; o2=newMemberVar(); o2.var=20; }}classEx4_20{ publicstaticvoidmain(String[]args){ inti=0; MemberVarobj1=newMemberVar(); MemberVarobj2=newMemberVar(); ParamTransfero=newParamTransfer(); o.changeParameter(i,obj1,obj2);//方法调用,传递参数
System.out.println("i="+i); System.out.println("obj1.var="+obj1.var); System.out.println("obj2.var="+obj2.var);}}774.5.5数据传递(续)2.方法返回:返回值的类型可以是基本类型,也可以是引用类型。
【例4-21】定义了复数类Complex,其中定义了两个double变量real和imag(分别表示一个复数的实部与虚部)、一个构造方法、一个用于完成两个复数相加的方法add和一个用于输出复数的方法print。classComplex{privatedoublereal,imag;publicComplex(doubler,doublei){real=r;imag=i;}784.5.5数据传递(续)publicComplexadd(Complexc){//方法返回引用类型
returnnewComplex(real+c.real,imag+c.imag);}publicvoidprint(){System.out.println(real+"+"+imag+"i");}} classEx4_21{publicstaticvoidmain(String[]args){Complexc1=newComplex(5,2);Complexc2=newComplex(6,4);
Complexc3=c1.add(c2);c3.print();}}794.5.5数据传递(续)3.实例变量和类变量【例4-22】作为共享变量的实例变量和类变量,它们共享范围的区别。classEmployee{staticStringcorpName="辉煌公司";Stringname="张三";//职员姓名voidselfIntroduction(){ System.out.println("I'm"+name+",andworkin"+corpName+".");}}804.5.5数据传递(续)publicclassEx4_22{publicstaticvoidmain(String[]args){ Employeeobj1,obj2; obj1=newEmployee(); obj2=newEmployee(); ="Tom";//对象obj1改名为"Tom" obj1.corpName="Disney"; //对象obj1改公司名为"Disney" ="李四";//对象obj2改名为"李四" obj1.selfIntroduction(); obj2.selfIntroduction();}}814.6类的组织方式——包
4.6.1包的概念
4.6.2包的创建
4.6.3包的引入
3.6.4静态成员的引入
824.6.1包的概念包是一组相关的类和接口的集合,或者说,包是一组相关的类和接口以及子包的集合。
1.包的作用⑴包可以划分和组织类,使类和接口按功能、来源分为不同的集合。⑵包是类名空间,一个包中的类不能重名,但不同包中的类可以重名。⑶包提供了包一级的封装及存取权限。同一个包的类彼此不加限制的访问,对其他包中的类提供了访问控制。832.Java类库Java的应用程序接口API是以包的形式提供的,每个包内包含大量相关的类、接口和异常。这些包中的类构成了Java类库。使用包中系统类的方法有三种:⑴继承系统类,在用户程序中创建系统类的子类,例如JavaApplet程序的起始类作为java.applet包中Applet类的子类;⑵创建系统类的对象,例如创建包装类的对象;⑶直接使用系统类,例如程序中常用的System.out.println()方法,就是系统类System的静态属性out的方法。84创建包语法格式:package包名;功能:把源文件中定义的类、接口放到指定的包中,即指明源文件中定义的类和接口属于哪个包。【例4-23】将例4-4的Circle类和Ex4_4类放到chapter4包中。packagechapter04;classCircle{/*省略Circle类类体中的代码*/}classEx4_4{/*省略Ex4_4类类体中的代码*/}4.6.2包的创建85如果把例4-4中的package语句改为:packagexiyou.zxl.javabook.chapter04;Java编译器javac将在classpath指定的目录下,首先创建xiyou目录,然后再在xiyou目录下创建zxl目录,再在zxl目录下创建javabook目录,再在javabook目录下创建chapter04目录,并且把编译后产生的类文件Circle.class和Ex4_4.class放到chapter04目录中。具体来说,包名xiyou.zxl.javabook.chapter04对应Windows上的xiyou\zxl\javabook\chapter04目录。864.6.3包的引入
一个类访问来自另一个包(java.lang包除外)中的类,须引用这个类的完整类名。【例4-24】例4-23的Circle类在xiyou.zxl.javabook.chapter04包中,内容是:packagexiyou.zxl.javabook.chapter04;publicclassCircle{
publicdoubleradius;publicdoublegetArea(){ returnradius*radius*Math.PI;}
publicdoublegetPerimeter(){ return2*radius*Math.PI;}}874.6.3包的引入(续)packagexiyou.zxl.javabook;classEx4_4{ publicstaticvoidmain(String[]args){ //xiyou.zxl.javabook.chapter04.Circle是完整的类名xiyou.zxl.javabook.chapter04.Circleobj;obj=newxiyou.zxl.javabook.chapter04.Circle(); obj.radius=10; System.out.println("Area="+obj.getArea()); System.out.println("Perimeter="+obj.getPerimeter()); }}Ex4_4类不在这个包中,而在xiyou.zxl.javabook包中884.6.3包的引入(续)import语句有两种格式:格式1:import包名.类名;功能:引入指定包中需要使用的一个类或接口,类或接口只用它的简单类名即可(不需要加包的前缀)。例如:将importxiyou.zxl.javabook.chapter04.Circle;放在Ex4_4类的前面。这样,在类体中就可以引用其简单类名Circle,而不用其完整的类名。格式2:import包名.*;功能:引入指定整个包。使得指定包中的任何类或接口只用它的简单类名即可(不需要加包的前缀)。例如:将importxiyou.zxl.javabook.chapter04.*;放在Ex4_4类的前面。这样,该包中的任何类或接口,在类体中就可以引用其简单类名,而不用其完整的类名。当然简单类名Circle也不例外,直接使用即可。894.6.4静态成员的引入
格式1:importstatic包名.类或接口名.静态成员名;此格式可当前整个源文件的范围内,用简单名称访问指定的静态成员,即精确引入。格式2:importstatic包名.类或接口名.*;此格式可在当前整个源文件的范围内,用简单名称访问指定类型中的所有静态成员,即按需引入。例如:importstaticjava.lang.System.out;importstaticjava.lang.Math.*;publicclassStaticImportSample1{publicstaticvoidmain(String[]args){
out.println("HelloWorld!"); out.println(sin(PI/2));}}904.7访问权限
4.7.1类的访问权限4.7.2类中成员的访问权限914.7.1类的访问权限类的访问权限有两种:用public修饰和没用public修饰。public:该类可以被任何包的代码访问;没用public(或缺省):该类可被本包的代码访问。例4-23的Circle类和Ex4_4类在同一个包chapter04中:Ex4_4类中总能访问Circle类例4-24的Circle类和Ex4_4类不在同一个包中:92Circle类在xiyou.zxl.javabook.chapter04包中,Ex4_4类在xiyou.zxl.javabook包中,其内容是:packagexiyou.zxl.javabook;importxiyou.zxl.javabook.chapter04.Circle;classEx4_4{ publicstaticvoidmain(String[]args){ Circleobj;//引用Circle类obj=newCircle();//引用Circle类//省略Ex4_4类部分代码}}934.7.2类中成员的访问权限访问权限的范围大小从小到大:·私有(private)成员:仅在本类内中的代码可访问它。·默认(无修饰符)成员:在同一包内中的代码可访问它。·保护(protected)成员:在同一包内及其子类(不同包)中的代码可访问它。·公共(public)成员:在所有包内中的代码可访问它。941.私有(private)成员classCircle{
privatedoubleradius;publicvoidsetRadius(doubleradius){this.radius=radius;}publicdoublegetRadius(){returnradius;}
privatedoublegetArea(){ returnradius*radius*Math.PI;}publicdoublegetPerimeter(){ return2*radius*Math.PI;}}classEx4_25{ publicstaticvoidmain(String[]args){ Circleobj=newCircle(); obj.radius=10;//非法访问私有变量obj.setRadius(10); System.out.println("Area="+obj.getArea());System.out.println("Perimeter="+obj.getPerimeter()); }95私有构造方法的访问
classCircle{privatedoubleradius;
privateCircle(){radius=0.0;}
staticCirclecreateCircle(){ returnnewCircle();}publicdoublegetPerimeter(){ return2*radius*Math.PI;}}classEx4_26{ publicstaticvoidmain(String[]args){ Circleobj=newCircle();//非法
Circleobj=Circle.createCircle();
System.out.println("Perimeter="+obj.getPerimeter()); }}962.
默认(无修饰符)成员在同一个包
3.
保护(protected)成员类中修饰为protected的成员可以被这个类本身、同一个包中的其它的类以及其它包中的子类访问。packagexiyou.chapter04;publicclassCircle{protecteddoubleradius;publicCircle(){}publicCircle(doubleradius){ this.radius=radius;}protecteddoublegetArea(){returnradius*radius*Math.PI;}doublegetPerimeter(){ return2*radius*Math.PI;}}97packagexiyou;importxiyou.chapter04.Circle;classBallextendsCircle{Ball(){}Ball(doubler){ super(r);}voidprint(){ System.out.println("radius="+radius); System.out.println("Area="+getArea());// System.out.println("Perimeter="+getPerimeter());//没有修饰符,不在同一个包 Circleobj=newBall();//radius被protected修饰,访问位置是不同包的子类Ball,obj的类型不是当前子类Ball。// System.out.println("radius="+obj.radius);// System.out.println("Area="+obj.getArea());//getArea()被protected修饰,同上
98// System.out.println("Perimeter="+obj.getPerimeter());Ballobject=newBall(1); System.out.println("radius="+object.radius); System.out.println("BallArea="+object.getArea());//System.out.println("Perimeter="+object.getPerimeter());}}publicclassEx4_27{publicstat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 炭黑生产工岗中转正晋升考核试卷含答案
- 膨胀烟丝设备操作工岗位行业发展考核试卷含答案
- 绝缘防爆工具制作工岗中工作改进考核试卷含答案
- 2026年数字工厂高级架构师招聘笔试试卷 招录16人题型大全
- 2026年影视数字化高级特效专家招聘笔试试卷 招录10人考试题库
- 救助站疫情应急处置指南
- 2026年山东省即墨市高三数学下册期末考试模拟卷【必刷】附答案
- 2026年广东省连州市高三数学下册期末考试模拟试卷带答案(黄金题型)
- 2026年山东省荣成市高三数学下册期末考试模拟考试卷附参考答案【满分必刷】
- 2026届阿里地区札达县四年级数学下学期期中检测模拟试题(含答案)
- DB34T 2042-2014 地理标志产品 五城米酒
- 《Photoshop》完整教学课件
- DL-T-5161.5-2018电气装置安装工程质量检验及评定规程第5部分:电缆线路施工质量检验
- HYT 0302-2021 沸石离子筛法海水提钾工程设计规范(正式版)
- 碳排放管理师考试练习题(含答案)
- 2024年1月自考18960礼仪学试题及答案含解析
- 5第五章历史时期的沙漠变迁
- 蒙迪欧维修手册
- GB/T 37329-2019电子围栏导体用铝合金线材
- (word完整版)高中物理实验读数专题
- 2015年抗菌药物临床应用指导原则(2015年版)
评论
0/150
提交评论