您好,欢迎访问三七文档
实验3.1类与对象编程1实验目的(1)了解类的成员设计(2)掌握类与对象的关系(3)理解静态方法与实例方法的使用差异;2知识要点2.1类作为java程序的基本要素,类由成员变量(也称属性)和成员方法组成。属性包括常量和变量,方法则包括构造方法和一般方法,在定义类时,它们习惯上按如下次序排列:classOrder{//final属性//属性//构造方法//方法}类的属性一般定义为私有的,而将类的方法定义为public。2.2对象创建与构造方法类是创建对象的模板,而对象是类的实例。对象是一组属性和方法的封装体。创建对象用到保留字new。格式为:引用变量=new构造方法(参数)有关构造方法有以下几点说明:(1)创建对象时将用到构造方法;系统自动调用参数匹配的构造方法为对象初始化。(2)构造方法的名称必须与类名同名,构造方法没有返回类型;(3)一个类可提供多个构造方法,这些方法的参数不同。(4)如果程序中未提供构造方法,系统自动提供空的无参构造方法。2.3对象引用变量与对象关系对象创建后,将对象的引用赋值给某个引用变量,就可以通过该变量访问对象的成员属性和方法。成员的调用通过“.”运算符实现,格式为:对象名.属性对象名.方法(参数)以下结合实例介绍对象引用变量与对象的关系。classPoint{intx,y;//属性变量publicPoint(intx1,inty1){//构造方法x=x1;//将参数值赋值给对象的属性变量y=y1;}publicstaticvoidmain(Stringargs[]){Pointp1=newPoint(2,3);//创建点(2,3)用p1引用Pointp2=newPoint(3,5);//创建点(3,5)用p2引用Pointp3=p1;//p3和p1代表同一对象p1.x=18;//修改p1的x属性值System.out.println(p3.x);//输出p3的x属性值p1=p2;//p1“叛变”,改为和p2指向同一点System.out.println(p1.x);}}【运行结果】183【有关说明】(1)main方法中首先创建两个对象,用带阴影的方框表示,分别用p1和p2两个引用变量存储其引用地址。(2)语句Pointp3=p1;的作用是定义一个Point类型的引用变量p3和p1值向同一对象;如图1所示。(3)语句p1.x=8;的作用是修改p1所引用对象的x1值,由于p1和p3是“代表”同一对象,因此,输出p3.x和p1.x是一样的,也就是18.(4)语句p1=p2将p1改为指向和p2所指的对象,这样,再输出p1.x则结果为3。【重要提示】对象和对象引用变量是两个不同的概念,对象引用变量中存放的是对象的地址。通常访问对象需要借助对象引用变量,将对象的地址赋值给对象引用变量,则该引用变量就“代表”这个对象,但是引用变量与对象并不是固定的关系,通过更改引用变量的值,可让其“代表”另一对象,也可以通过引用变量之间的赋值让多个引用变量指向同一对象。如果一个对象没有任何引用变量指向它,则要访问该对象就再也不可能,Java垃圾回收器将自动回收该对象占用的内存。2.4静态空间与实例空间带有static修饰的属性称为静态属性或称类变量;带有static修饰的方法称为静态方法,在静态方法内可以直接访问静态属性或调用其他静态方法,静态属性在分配空间时与对象无关,静态空间的引用是与类关联,一个类的静态属性成员只有一份,访问静态成员可以通过类名(在自己类中也可以直接访问),也可以通过对象,静态属性是共享的,该类的任何对象均可访问它。【思考】静态属性外层包裹的是类,因此必须指明是访问哪个类的静态成员,如果是在自己类中则可以省略,由于对象是由类创建,自然对象能标识其所属类,因此也允许用对象做前缀访问静态属性。非静态属性也称实例变量,也就是说,要通过实际的对象才能访问,其外层包裹的是对象,不同对象其实例变量的值通常是不同的。例如,以下类中y是属于类的属性变量,而x是属于对象的实例变量,y是依托类的,在类装载时将给其分配空间并赋值,整个类只有一个y;而x只有创建了具体对象才存在,不同对象有各自的x属性,如图7-2所示。classdemo{intx;Staticinty=12;}【重要提示】对象方法中可以访问静态空间的方法或属性;反之,在静态方法中绝对不允许在没有指定对象的情况下访问属于对象的成员属性或方法。3样例程序样例1:创建5个学生对象给一个学生数组赋值,每个学生属性有:学号、姓名、年龄(1)将学生按学号排序输出;(2)给所有学生年龄加1;(3)统计大于20岁的学生人数。【参考程序】publicclassStudent{intnum;intage;Stringname;publicStringtoString(){Strings=学号:+num+,;s+=姓名:+name+,;s+=年龄:+age;returns;}publicStudent(intNum,intAge,StringName){num=Num;age=Age;name=Name;}publicstaticvoidmain(Stringargs[]){Students1=newStudent(3,18,张三);Students2=newStudent(1,21,小路);Students3=newStudent(33,20,John);Students4=newStudent(13,20,Lucy);Students5=newStudent(8,17,Jack);Students[]={s1,s2,s3,s4,s5};System.out.println(班级学生名单如下:);output(s);//第1次调用output方法输出数组/*将学生按学号排序*/for(inti=0;is.length-1;i++)for(intj=i+1;js.length;j++)if(s[i].nums[j].num){Studenttmp=s[i];s[i]=s[j];s[j]=tmp;}System.out.println(按学号由小到大排序...);output(s);//第2次调用output方法输出数组for(inti=0;is.length;i++)//将所有学生年龄加1s[i].age++;System.out.println(所有学生年龄加1后...);output(s);//第3次调用output方法输出数组/*以下统计大于20岁的学生个数*/intcount=0;for(inti=0;is.length;i++)if(s[i].age=20)count++;System.out.println(大于20岁人数是:+count);}/*以下方法输出学生数组的所有元素*/staticvoidoutput(Students[]){for(inti=0;is.length;i++)System.out.println(s[i]);}}【说明】本例包括了对象访问的典型操作,创建对象调用构造方法,直接输出对象将调用对象的toString()方法,通过数组管理学生对象,这里演示如何通过数组元素访问对象的编程技巧。由于要多次输出学生数组,所以程序中编写了一个output方法。【运行结果】班级学生名单如下:学号:3,姓名:张三,年龄:18学号:1,姓名:小路,年龄:21学号:33,姓名:John,年龄:20学号:13,姓名:Lucy,年龄:20学号:8,姓名:Jack,年龄:17按学号由小到大排序...学号:1,姓名:小路,年龄:21学号:3,姓名:张三,年龄:18学号:8,姓名:Jack,年龄:17学号:13,姓名:Lucy,年龄:20学号:33,姓名:John,年龄:20所有学生年龄加1后...学号:1,姓名:小路,年龄:22学号:3,姓名:张三,年龄:19学号:8,姓名:Jack,年龄:18学号:13,姓名:Lucy,年龄:21学号:33,姓名:John,年龄:21大于20岁人数是:3【编程技巧】(1)如何根据构造方法的要求创建对象;(2)如何给对象数组赋值。(3)如何通过数组元素操作访问各对象的属性。(4)输出对象会自动调用对象的toString()方法。样例2:在以下复数类的基础上扩充乘法运算。publicclassComplexNumber{privatedoublex,y;//私有类变量publicComplexNumber(doublereal,doubleimaginary){x=real;y=imaginary;}publicStringtoString(){return{+x+,+y+};}publicstaticComplexNumberadd(ComplexNumbera,ComplexNumberb){returnnewComplexNumber(a.x+b.x,a.y+b.y);}publicComplexNumberadd(ComplexNumbera){returnnewComplexNumber(x+a.x,y+a.y);}}编写一个测试程序调用以上复数类,实现以下求解调用,由命令行提供数据:命令“javatest+2345”意思是求(2,3i)与(4,5i)之和.命令“javatest*4635”意思是求(4,6i)与(3,5i)之积.【参考程序】publicclassComplexNumber{privatedoublex,y;//复数的实部、虚部/**构造函数*/publicComplexNumber(doublereal,doubleimaginary){this.x=real;this.y=imaginary;}publicStringtoString(){return{+x+,+y+};}/**两复数相加*/publicstaticComplexNumberadd(ComplexNumbera,ComplexNumberb){returnnewComplexNumber(a.x+b.x,a.y+b.y);}/**本复数加上一个复数*/publicComplexNumberadd(ComplexNumbera){returnnewComplexNumber(this.x+a.x,this.y+a.y);}/**两复数相乘*/publicstaticComplexNumbermultiply(ComplexNumbera,ComplexNumberb){returnnewComplexNumber(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}/**本复数乘上一个复数*/publicComplexNumbermultiply(ComplexNumbera){returnnewComplexNumber(x*a.x-y*a.y,x*a.y+y*a.x);}publicstaticvoidmain(Stringargs[]){ComplexNumberx,y,z;/*以下根据命令行参数构造两复数*/x=newComplexNumber(Double.parseDouble(args[1]),Double.parseDouble(args[2]));y=newComplexNumber(Double.parseDouble(args[3]),Double.parseDouble(args[4]));if(args[0].equals(+))//判断是做加法还是乘法z=add(x,y);//用静态方法elsez=x.multiply(y);//用实例方法System.out.println(result=+z);}}【说明】访问静态方法不依赖对象,使用静态方法通常用类名做前缀,例如:ComplexNumber.add(x,y),在ComplexNumber类的内部可以省略直接写add(x,y),我们也可以用对象做前缀访问静态方法,例如写成x.add(x,y),因为静态方法是共享的。实例方法
本文标题:类与对象编程
链接地址:https://www.777doc.com/doc-5915782 .html