收藏 分享(赏)

类与对象编程.doc

上传人:hskm5268 文档编号:6983135 上传时间:2019-04-29 格式:DOC 页数:20 大小:91.50KB
下载 相关 举报
类与对象编程.doc_第1页
第1页 / 共20页
类与对象编程.doc_第2页
第2页 / 共20页
类与对象编程.doc_第3页
第3页 / 共20页
类与对象编程.doc_第4页
第4页 / 共20页
类与对象编程.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、实验 3.1 类与对象编程1 实验目的(1) 了解类的成员设计(2) 掌握类与对象的关系(3) 理解静态方法与实例方法的使用差异;2 知识要点2.1 类作为 java 程序的基本要素,类由成员变量(也称属性)和成员方法组成。属性包括常量和变量,方法则包括构造方法和一般方法,在定义类时,它们习惯上按如下次序排列:class Order / final 属性/ 属性/ 构造方法/ 方法类的属性一般定义为私有的,而将类的方法定义为 public。2.2 对象创建与构造方法类是创建对象的模板,而对象是类的实例。对象是一组属性和方法的封装体。创建对象用到保留字 new。格式为: 引用变量 = new 构

2、造方法(参数)有关构造方法有以下几点说明:(1)创建对象时将用到构造方法;系统自动调用参数匹配的构造方法为对象初始化。(2)构造方法的名称必须与类名同名,构造方法没有返回类型;(3)一个类可提供多个构造方法,这些方法的参数不同。(4)如果程序中未提供构造方法,系统自动提供空的无参构造方法。 2.3 对象引用变量与对象关系对象创建后,将对象的引用赋值给某个引用变量,就可以通过该变量访问对象的成员属性和方法。成员的调用通过“.”运算符实现,格式为:对象名.属性对象名.方法(参数)以下结合实例介绍对象引用变量与对象的关系。class Point int x,y; /属性变量public Point(

3、int x1,int y1) /构造方法x=x1; /将参数值赋值给对象的属性变量y=y1;public static void main(String args) Point p1=new Point(2,3); /创建点(2,3)用 p1 引用Point p2=new Point(3,5); /创建点(3,5)用 p2 引用Point p3=p1; /p3 和 p1 代表同一对象p1.x=18; /修改 p1 的 x 属性值System.out.println(p3.x); /输出 p3 的 x 属性值p1=p2; /p1“叛变”,改为和 p2 指向同一点System.out.printl

4、n(p1.x);【运行结果】183【有关说明】(1)main 方法中首先创建两个对象,用带阴影的方框表示,分别用 p1 和 p2 两个引用变量存储其引用地址。(2)语句 Point p3=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。【重要提示】 对象和对象引用变量是两个

5、不同的概念,对象引用变量中存放的是对象的地址。通常访问对象需要借助对象引用变量,将对象的地址赋值给对象引用变量,则该引用变量就“代表”这个对象,但是引用变量与对象并不是固定的关系,通过更改引用变量的值,可让其“代表”另一对象,也可以通过引用变量之间的赋值让多个引用变量指向同一对象。如果一个对象没有任何引用变量指向它,则要访问该对象就再也不可能,Java 垃圾回收器将自动回收该对象占用的内存。 2.4 静态空间与实例空间带有 static 修饰的属性称为静态属性或称类变量;带有 static 修饰的方法称为静态方法,在静态方法内可以直接访问静态属性或调用其他静态方法,静态属性在分配空间时与对象无

6、关,静态空间的引用是与类关联,一个类的静态属性成员只有一份,访问静态成员可以通过类名(在自己类中也可以直接访问),也可以通过对象,静态属性是共享的,该类的任何对象均可访问它。【思考】静态属性外层包裹的是类,因此必须指明是访问哪个类的静态成员,如果是在自己类中则可以省略,由于对象是由类创建,自然对象能标识其所属类,因此也允许用对象做前缀访问静态属性。非静态属性也称实例变量,也就是说,要通过实际的对象才能访问,其外层包裹的是对象,不同对象其实例变量的值通常是不同的。例如,以下类中 y 是属于类的属性变量,而 x 是属于对象的实例变量,y 是依托类的,在类装载时将给其分配空间并赋值,整个类只有一个

7、y;而 x 只有创建了具体对象才存在,不同对象有各自的 x 属性,如图 7-2 所示。class demo int x;Static int y=12;【重要提示】对象方法中可以访问静态空间的方法或属性;反之,在静态方法中绝对不允许在没有指定对象的情况下访问属于对象的成员属性或方法。3 样例程序样例 1: 创建 5 个学生对象给一个学生数组赋值,每个学生属性有:学号、姓名、年龄(1)将学生按学号排序输出;(2)给所有学生年龄加 1;(3)统计大于 20 岁的学生人数。【参考程序】public class Studentint num;int age;String name;public Str

8、ing toString( ) String s = “学号:“ + num + “,“;s += “姓名:“ + name + “,“;s += “年龄:“ + age;return s;public Student(int Num,int Age,String Name) num = Num;age = Age;name = Name;public static void main(String args) Student s1 = new Student(3,18,“张三“);Student s2 = new Student(1,21,“小路“);Student s3 = new Stu

9、dent(33,20,“John“);Student s4 = new Student(13,20,“Lucy“);Student s5 = new Student(8,17,“Jack“);Student s = s1,s2,s3,s4,s5;System.out.println(“班级学生名单如下:“);output(s); /第 1 次调用 output 方法输出数组/* 将学生按学号排序 */ for (int i=0;isj.num) Student tmp=si; si=sj;sj=tmp; System.out.println(“按学号由小到大排序.“);output(s); /

10、第 2 次调用 output 方法输出数组for (int i=0;i=20) count+;System.out.println(“大于 20 岁人数是:“ + count);/* 以下方法输出学生数组的所有元素 */static void output(Student s) for (int i=0;i“);p=p.next;System.out.println();public static void main(String a) /* 创建含 10 个元素的链表,并输出该链表*/Link x=new Link(10);x.outputLink (); /输出链表/* 创建一个数据为 1

11、00 的新结点,放到链表的头部 */Node q=new Node();q.data=100;q.next= x.header; x.header=q; x.outputLink(); /输出链表/* 至链表的尾部,在尾部增加一个 data 值为 100 的新结点 */Node p=x.header;while (p!=null) /通过遍历链表,将 q 定位到最后一个结点q=p;p=p.next;p=new Node();p.data=100;q.next=p; /q 的下一个结点为新建结点x.outputLink(); /输出链表【说明】对链表操作的一个重要特点是对象引用变量的值经常变化,

12、要掌握如何实现链表的遍历访问以及结点插入的处理办法。【运行结果样例】131934357673875365861001319343576738753658610013193435767387536586100【编程技巧】(1) 如何利用引用变量的特点来表示结点的链接关系。(2) 要始终用一个变量指向链表的头。(3) 遍历链表要用两个变量,分别指向链表的相邻结点,以方便插入新结点,如何推进,如何判断是否到链尾。4 上机练习 基本题1) 利用随机函数定义 10 对(x,y)值,由此创建的 Point 类实例存入一个数组中,按与原点(0,0)的距离由小到大的顺序输出所有的点及到原点的距离。2)编写一个

13、三角形类,能根据 3 个实数构造三角形对象,如果三个实数不满足三角形的条件,则自动构造以最小值为边的等边三角形。输入任意三个数,求构造的三角形面积。3) 将以下程序补充完整,调试分析import javax.swing.*;import java.text.DecimalFormat;public class Java_1/*Found*public static _ main( String args )SimpleTime t = new SimpleTime( 12, 30, 19 );/*Found*_.showMessageDialog( null, t.buildString(),

14、“ “this“ 引用示范“,JOptionPane.INFORMATION_MESSAGE );System.exit( 0 );class SimpleTime private int hour, minute, second; public SimpleTime( int hour, int minute, int second )this.hour = hour;/*Found*_ = minute;this.second = second;public String buildString()/*Found*return “this.toString(): “ + _() +“nto

15、String(): “ + toString() +“nthis (with implicit toString() call): “ +this;public String toString()DecimalFormat twoDigits = new DecimalFormat( “00“ ); return twoDigits.format( this.hour ) + “:“ +twoDigits.format( this.minute ) + “:“ +twoDigits.format( this.second );4) 将以下程序补充完整,调试分析public class Java

16、_3 /点的坐标int x,y;public Java_3() /*Found*public Java_3(int x,int y)_/*Found*public Java_3(Java_3 p)_/以对象的形式返回当前点的位置public Java_3 getLocation()/*Found*Java_3 p=_; /实例化一个 Java_3 对象 p,其坐标是(x,y) /*Found*_; /返回对象 p/返回点的横坐标public int getX()return x;/返回点的纵坐标public int getY()return y;/把当前点移到新的位置(x,y)上public

17、void move(int x,int y)this.x = x;this.y = y;/以(x,y)的格式返回点的位置public String toString()return “(“+x+“,“+y+“)“;/在原有坐标上分别增加 x 和 y public void translate(int x,int y)this.x += x;this.y += y;public static void main(String args)/*Found*Java_3 p=_; /生成一个对象(5,5)System.out.println(“x=“+ p.x+“ y=“+ p.y); System.

18、out.println(“Location is“+ p.toString(); /以(x,y)的方式打印坐标的位置/*Found*_; /在原有位置上增加(3,4)System.out.println(“x=“+ p.x+“ y=“+ p.y); /打印横坐标和纵坐标的值System.out.println(“Location is“+ p.toString(); /以(x,y)的方式打印坐标的位置 提高题1) 编程根据一个已存在的链表创建一个倒序链表。利用如下方法实现一个链表的倒序。static Link reverse( Link list ) Link rev = null; Link

19、 runner = list; while (runner != null) Link newNode = new Link();newNode.data = runner.data;newNode.next = rev;rev = newNode;runner = runner.next;return rev; 2) 设计一个扑克洗牌算法。将 52 张牌(不包括大、小王)用对象的形式表示,每张牌包括花色和大小。大小按如下序号排列:(2、3、4、5、6、7、8、9、10、J、Q、K、A), 花色为: 、 ,首先将扑克按顺序存放到一个一维数组中,然后按洗牌算法进行洗牌,最后,按东、南、西、北进行

20、分发,显示扑克时将同一花色放在一起。5 思考练习1) 以下程序的运行结果为:public class Myint value;public static void main(String args) My x=new My();if (x=null)System.out.println(“No Object“);elseSystem.out.println(x.value); A. 0 B. 1 C. No Object D. 编译错误 E. null(2)以下程序的运行结果为:public class A static int k=3;public static void main(Stri

21、ng args) int k=4;A x1=new A();x1.k+;A x2=new A();x2.k+;k+;System.out.println(x1.k); A. 3 B. 4 C.5 D.6 E.73) 编译和运行以下程序结果为:public class A static int k=3;static int m;public static void main(String args) k+;if (m=0) System.out.println(k); elseSystem.out.println(B.k); k+;class B static int k=6; A. 3 B.

22、4 C.5 D.编译错误 E.64)编译和运行以下程序结果为:1: public class Q21 2: int maxElements;3: void Q21() 4: maxElements = 100;5: System.out.println(maxElements);6: 7: Q21(int i) 8: maxElements = i;9: System.out.println(maxElements);10: 11: public static void main(String args) 12: Q21 a = new Q21();13: Q21 b = new Q21(99

23、9);14: 15: A. 输出 100 和 999.B. 输出 999 和 100.C. 第 2 行出现编译错误,变量 maxElements 未初始化.D. 12 行出现编译错误.5)以下的程序的调试结果为 public class Scopeint i;public static void main(String argv)Scope s = new Scope();s.amethod();public static void amethod()System.out.println(i);A. 输出结果为:0 B. 无输出 C. 编译错误 D. 输出 null6)给出下面代码: publ

24、ic class Person static int arr = new int10;public static void main(String a) System.out.println(arr1); 以下那个说法正确? A. 编译时将产生错误; B. 编译时正确,运行时将产生错误; C. 输出 0; D. 输出 null。7)以下的程序的调试结果为?public class Asint i = 10;int j;char z= 1;boolean b;public static void main(String argv)As a = new As();a.amethod();publi

25、c void amethod()System.out.println(j);System.out.println(b); A输出 0 和 falseB. 输出 0 和 trueC. 编译错误,b 未初始化D. 编译错误, z 必须赋字符值8)以下的程序的调试结果为?public class MyArpublic static void main(String argv) MyAr m = new MyAr();m.amethod();public void amethod()static int i;System.out.println(i);A. 输出结果为 0B. 运行出错C. 输出结果为

26、 nullD. 编译错误9) 以下程序的运行结果为?class ValHoldpublic int i = 10;public class ObParmpublic static void main(String argv)ObParm o = new ObParm();o.amethod();public void amethod()int i = 99;ValHold v = new ValHold();v.i=30;another(v,i);System.out.print( v.i ); public void another(ValHold v, int i)i=0;v.i = 20;ValHold vh = new ValHold();v = vh;System.out.print(v.i);System.out.print(i); A10030 B. 20030 C. 209930 D. 10020

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报