Java面向对象程序设计第4章_类与对象续1

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《Java面向对象程序设计》第4章类与对象续主讲:王美丽办公室:信息学院204Email:meili_w@nwsuaf.edu.cn本章内容面向对象程序设计的基本概念类的定义创建对象隐藏和封装4123三、创建对象1、对象的使用(1)使用对象的成员变量或方法对象间赋值(拷贝它的引用)把对象作为方法的参数注1:先声明对象引用的名字,加一个“.”,跟上对象成员的名字注2:在Java语言里,方法只能是类的一部分;因此,只能通过对象来调用方法equivalance.java返回publicclassEquivalance{publicstaticvoidmain(String[]args){Integern1=newInteger(47);Integern2=newInteger(47);System.out.println(n1==n2);System.out.println(n1!=n2);}}assignment.java返回classNumber{inti;}publicclassAssignment{publicstaticvoidmain(String[]args){Numbern1=newNumber();Numbern2=newNumber();n1.i=9;n2.i=47;System.out.println(n1.i=+n1.i+;n2.i=+n2.i);n1=n2;System.out.println(n1.i=+n1.i+;n2.i=+n2.i);n1.i=27;System.out.println(n1.i=+n1.i+;n2.i=+n2.i);}}n1n2Number对象i:Number对象i:0094727Passobject返回classLetter{charc;}publicclassPassObject{staticvoidf(Lettery){y.c='z';}publicstaticvoidmain(String[]args){Letterx=newLetter();x.c='a';System.out.println(1:x.c:+x.c);f(x);System.out.println(2:x.c:+x.c);}}y=x;Letter对象c:xayzcallbyvalue返回classCallbyvalue{publicstaticvoidmain(String[]args){Passtestobj=newPasstest();intx=5,y=30;System.out.println(xandybeforecall:+x++y);obj.f(x,y);System.out.println(xandyaftercall:+x++y);}}classPasstest{voidf(inti,intj){i*=2;j/=2;}}返回publicclassCallby{intx,y;Callby(inti,intj){x=i;y=j;}voidf(Callbyobj){//传入对象obj.x*=2;obj.y/=2;}publicstaticvoidmain(String[]args){Callbyobj=newCallby(5,30);System.out.println(obj.xandobj.ybeforecall:+obj.x++obj.y);obj.f(obj);System.out.println(obj.xandobj.yaftercall:+obj.x++obj.y);}}this的使用•可以调用本类中的方法•-一般方法(表示当前对象)this.jump•-构造方法(注意)•可以调用本类中的属性(Flower.java)三、创建对象4、this(1)classDog{publicvoidjump(){System.out.println(“jumping”);}publicvoidrun(){System.out.println(“jumping”);}}Dogd=newDog();d.jump();如何在run方法中调用jump方法?publicclassTestDog{publicstaticvoidmain(String[]args){Dogdog=newdog();dog.run();}}在run方法中考虑2个问题:1、调用jump时是否一定需要一个Dog对象?2、是否一定需要重新创建一个Dog对象?this.jump();此时this所代表的对象是不确定的,但它的类型是确定的,它所代表的对象只能是当前类;只有当这个方法被调用时,它所代表的对象才被确定下来;谁在调用这个方法,this就代表谁。三、创建对象4、this(2)•在一个构造函数中调用另外一个构造函数时,用this,但构造函数调用必须是该构造函数的第一句话,并且不能在一个构造函数里调用2个构造函数打开:Flower.javaFlower.java4、this(2)publicclassFlower{privateinti=0;privateStrings=newString(null);Flower(intj){i=j;System.out.println(Firstconstructor,i=+i);}Flower(Strings,intj){this(j);System.out.println(“Secondconstructor);}publicstaticvoidmain(String[]args){Flowerhua=newFlower(asd,3);}}调用哪个?三、创建对象6、static关键字(1)回顾内存分配栈内存:对象的名字堆内存:对象的具体内容(属性)全局代码区:保存所有的方法全局数据区:存放static类型的属性三、创建对象6、static关键字(1)一般我们怎样访问类中的成员?必须通过一个类对象才能访问。若想创建一个无需引用具体的实例对象就能访问的类成员,只需在声明前加上static关键字即可。三、创建对象6、static关键字(2)两种情况:1)无论创建对象与否,都要有一段保存某些数据的内存2)有某个方法不从属于任何对象当声明某些方法或变量是static时,这项数据或方法没有被连到类的任何一个实例上。三、创建对象6、static关键字(3)区别:不管为类创建了多少对象,系统仅在第一次调用类的时候为类变量分配内存,所有对象共享该类的类变量。因此,可以通过类本身或某个对象来访问类变量。没用关键字static修饰的方法就是实例方法,只能通过对象来调用;反之称为类方法重要用途:不用创建对象就能调用方法。三、创建对象6、static关键字(5)类方法只能访问类变量,不能访问实例变量类方法既可以用类名来调用,也可以用对象来调用。但用类名调用类方法程序的可读性更好(FlowerStatic.java)三、创建对象7、初始化使用构造方法初始化对象2调用方法进行初始化3在定义数据成员的时候赋初值1定义初始化classA{booleanb=false;charx=‘a’;inti=47;}classA{Flowerhua=newFlower();}classa{inti=f();}classa{inti=f();intj=g(i);}classa{intj=g(i);inti=f();}×Cons.java—构造函数的重载classRock{Rock(){System.out.println(缺省构造函数!);}Rock(inti){System.out.println(带参数的构造函数!);}}publicclassCons{publicstaticvoidmain(Stringargs[]){RockRock1=newRock();RockRock2=newRock(1);}}返回四、隐藏和封装1、理解封装封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。如:Person对象的age属性,通常不能随意修改它。四、隐藏和封装2、使用控制符(1)访问控制级别由小到大privatedefaultprotectedpublic如果类里的一个成员(包括属性和方法)使用private修饰,则这个成员只能在该类的内部被访问。默认访问控制,可以被相同包下的其它类访问。既可以被同一个包中其它类访问,也可以被不同包中的子类访问。可以被所有类访问。四、隐藏和封装2、使用控制符(2)同一个类同一个包子类中全局范围内private*default**protected***public****四、隐藏和封装publicclassPerson{privateintage;publicvoidsetAge(intage){this.age=age;}publicintgetAge(){returnthis.age;}}只能在Person类内才可以操作和访问四、隐藏和封装publicclassTestPerson{publicstaticvoidmain(String[]args){Personp=newPerson();}}p.age=1000;p.setAge(50);System.out.println(“age=”+p.getAge());四、隐藏和封装publicclassPerson{privateintage;publicvoidsetAge(intage){if(age100||age0){System.out.println(“年龄不合法”);return;}else{this.age=age;}}publicintgetAge(){returnthis.age;}}在方法中允许程序员增加自己的控制逻辑,从而保证age属性不会出现与实际不符的情形。四、隐藏和封装2、使用控制符(3)类里的绝大部分属性都应该用private修饰,除了一些static修饰的、类似全局变量的属性,考虑使用public。如果某个类主要用作其它类的父类,该类里包含的大部分方法可能仅希望被其子类重写,而不想被外界直接调用,则应该用protected修饰。希望暴露出来给其它类自由调用的方法应该用public修饰。四、隐藏和封装3、package和import(1)Java引入了包(package)机制,提供了类的多层命名空间,用于解决类的命名冲突、类文件管理等问题。四、隐藏和封装3、package和import(2)包的定义语句格式为:package〈包名〉;注:如果一个Java文件中有package语句,那么package语句必须写在Java源程序的第一行,最多只能有一条package语句。一个包对应一个文件夹,一个包中可以包括许多类文件。Java语言的包等级和windows的文件组织方式完全相同,只是表示方法不同。四、隐藏和封装3、package和import(3)如:packagemypackage;publicclassMyclass{//……}mypackage.Myclassm=newmypackage.Myclass();用import来引入包或包里的成员,如:importjava.util.*;importjava.util.Timer;四、隐藏和封装3、package和import(4)如:packagemypackage;publicclassMyclass{//……}importmypackage;Myclassm=newMyclass();mypackage.Myclassm=newmypackage.Myclass();初学者不要涉及太多包的概念,把所有类放在一个文件下即可。返回主菜单§4.12反编译和文档生成器JDK提供的反编译器javap.exe可以将字节码反编译为源码,查看源码类中的public方法名字和public成员变量的名字,例如:javapjava.util.Date§4.12.1javap反编译§4.12

1 / 34
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功