java类和对象实验.pdf
实验八:类和对象实验目的:1掌握类的定义,熟悉属性、构造函数、方法的作用,掌握用类作为类型声明变量和方法返回值;2理解类和对象的区别,掌握构造函数的使用,熟悉通过对象名引用实例的方法和属性,理解static 的作用和使用规则;3理解访问控制修饰符的作用;实验数据记录及分析(或程序及运行结果)1.写出运行结果public class Reference public static void main(String args)double d=12.3;Decrement dec=new Decrement();dec.decrement(d);System.out.println(d);class Decrement public void decrement(double me)/参数传递me=me-1.0;预行结果是:12.3 分析原因:me 是引用类型的参数,参数值不改变2.给出下面的类,找出后面的5 个声明中,哪些是重载后的构造函数public class ConstOver public ConstOver(int x,int y,int z)A.ConstOver()B.Protected int ConstOver()C.Private ConstOver(int z,int y,byte x)D.Public Object ConstOver(int x,int y,int z)E.Public void ConstOver(byte x,byte y,byte z)A、C 是重载后的构造函数3.解释下面的程序运行的结果输出为什么是null public class My String s;public void My()s=”Constructor”;public void Go()System.out.println(s);public static void main(String args)My m=new My();m.go();因为程序中s=”Constructor”;是在方法My 中进行的,Main 方法中并没有调用方法 My,所以 s 的值是 null 4.运行下面的程序,写出运行结果,写出类成员属性和实例成员属性的区别。class MyParts static/初始化先于构造方法的执行x=10;public static int x=7;public int y=3;public class JLab1101 public static void main(String args)MyParts a=new MyParts();MyParts b=new MyParts();System.out.println(输出一:a.x=+a.x);System.out.println(输出一:b.x=+b.x);a.y=5;b.y=6;a.x=1;b.x=2;System.out.println(输出二:a.y=+a.y);System.out.println(输出二:b.y=+b.y);System.out.println(输出三:a.x=+a.x);System.out.println(输出三:b.x=+b.x);1)输出一的结果是什么,它的值的来源是什么,反映了什么特性?输出一:a.x=7 输出一:b.x=7 来源于 public static int x=7 在 static中定义的属性,只能通过静态方法调用2)输出二的结果是什么,它的值的来源是什么,反映了什么特性?输出二:a.y=5 输出二:b.y=6 来源于 a.y=5;b.y=6;实例成员的属性,可以分别对他进行赋值。3)输出三的结果是什么,它的值的来源是什么,反映了什么特性?输出三:a.x=2 输出三:b.x=2 值来源于b.x=2;类成员属性是全局变量,后面的赋值会覆盖前一个。5.写出程序运行结果class StaticDemo static int x;int y;static x=10;public static int getX()return x;public static void setX(int newX)x=newX;public int getY()return y;public void setY(int newY)y=newY;public static void main(String args)System.out.println(静态变量 x=+StaticDemo.getX();/System.out.println(实例变量 y=+StaticDemo.getY();/非法,编译时将出错StaticDemo a=new StaticDemo();StaticDemo b=new StaticDemo();a.setX(1);a.setY(2);b.setX(3);b.setY(4);System.out.println(静态变量 a.x=+a.getX();System.out.println(实例变量 a.y=+a.getY();System.out.println(静态变量 b.x=+b.getX();System.out.println(实例变量 b.y=+b.getY();运行结果:静态变量 x=10 静态变量 a.x=3 实例变量 a.y=2 静态变量 b.x=3 实例变量 b.y=4 6.编写一个圆形类Circle,定义其成员变量(半径):double radius i.该类含有两个构造函数:public Circle(double r)初始化半径为r public Circle()初始化半径为1 ii.该类含有下列方法:public double area()返回圆形的面积public double circumference()返回圆形的周长public String toString()返回该类对象的文字描述,如:Circle 半径是 2.5 public void setRadius(double r)设置半径为r public double getRadius()返回半径的值。iii.编写一个含有主方法的类JLab0301,完成下列验证:1在主方法中用创建一个半径为10的Circle 类的实例 myCircle1,输出它的周长和面积;程序:Circle c1=new Circle();c1.setRadius(10);System.out.println(圆的面积是:+c1.area();System.out.println(圆的周长是:+c1.circumference();运行结果:圆的面积是:314.0 圆的周长是:62.8000000000000042 在主方法中用创建一个不指定半径的Circle 类的实例myCircle2,输出它的周长和面积,然后利用修改半径的方法设置它的半径为5,再次输出它的周长和面积。程序:Circle c2=new Circle();System.out.println(圆的面积是:+c2.area();System.out.println(圆的周长是:+c2.circumference();c2.setRadius(5);System.out.println(圆的面积是:+c2.area();System.out.println(圆的周长是:+c2.circumference();运行结果:圆的面积是:3.14 圆的周长是:6.28 圆的面积是:78.5 圆的周长是:31.4000000000000027.一副牌 Deck 有 52 张扑克 Card 组成(不含王牌),每张牌有自己的牌型suit 和点数 rank,完成下面的要求。1)定义一个类Card,表示每张扑克牌public class Card char suit;String rank;public Card(char suit,String rank)this.suit=suit;this.rank=rank;public String toString()return suit+-+rank;2)写出 toString()方法的作用显示牌的牌型和点数3)定义一个类Deck,表示一副牌,每副牌包含52 张牌,考虑有什么样的属性和方法,Deck 和 Card 之间属于什么关系。属性:牌的张数:size 方法:初始化牌、输出牌、洗牌关系:聚合。8.输入下面的类,结合上题中的Card 类,完成下面的要求public class JLab1103 static final char suits=H,S,D,C;static final String ranks=A,2,3,4,5,6,7,8,9,10,J,Q,K;static Card cards=new Card52;/*初始化扑克牌数组*/public static void init()for(int i=0;isuits.length;i+)for(int j=0;jranks.length;j+)cardsi*ranks.length+j=new Card(suitsi,ranksj);P1 p2 1001(24)1002(32)C1 c2 1001(32)1002(24)public static void swap1(Card c1,Card c2)Card c=c1;c1=c2;c2=c;public static void swap1(int i,int j)Card c=cardsi;cardsi=cardsj;cardsj=c;public static void swap2(Card c1,Card c2)char s=c1.suit;c1.suit=c2.suit;c2.suit=s;String r=c1.rank;c1.rank=c2.rank;c2.rank=r;/*param args*/public static void main(final String args)init();/任取两张牌Card c1=cards10;Card c2=cards12;System.out.println(第 11 张牌是:+c1+t 第 13 张牌是:+c2);1)在 main 方法中,添加下面几行语句,写出并分析结果swap1(c1,c2);System.out.println(执行 swap1(c1,c2)后);System.out.println(c1 引用的牌是:+c1+tc2 引用的牌是:+c2);System.out.println(第 11 张牌是:+cards10+t 第 13 张牌是:+cards12);运行结果:第11 张牌是:H-J 第13 张牌是:H-K 执行 swap1(c1,c2)后c1 引用的牌是:H-J c2 引用的牌是:H-K 第 11 张牌是:H-J 第 13 张牌是:H-K 2)在 main 方法中,去掉刚才添加的语句,添加下面几行语句,写出并分析结果swap1(10,12);System.out.println(执行 swap1(10,12)后);System.out.println(c1 引用的牌是:+c1+tc2 引用的牌是:+c2);System.out.println(第 11 张牌是:+cards10+t 第 13 张牌是:+cards12);运行结果:第11 张牌是:H-J 第13 张牌是:H-K 执行 swap1(10,12)后c1 引用的牌是:H-J c2 引用的牌是:H-K 第 11 张牌是:H-K 第 13 张牌是:H-J3)在 main 方法中,去掉刚才添加的语句,添加下面几行语句,写出并分析结果swap2(c1,c2);System.out.println(执行 swap2(c1,c2)后);System.out.println(c1 引用的牌是:+c1+tc2 引用的牌是:+c2);System.out.println(第 11 张牌是:+cards10+t 第 13 张牌是:+cards12);运行结果:执行 swap2(c1,c2)后c1 引用的牌是:H-K c2 引用的牌是:H-J 第 11 张牌是:H-K 第 13 张牌是:H-J9.一个 Fan 有自己的品牌,其调速旋钮speed可以调整Fan 的速度(档级在0、1、2、3 范围内),通电开关可以改变电扇状态(通电表示工作就绪或者工作,断电表示停止工作)请仔细分析并提供Fan 类的定义。并编写程序对其进行测试。具体要求如下:b)表示该类对象的状态可以用品牌(brand,可以用字符串型表示,因为品牌通常都是多个字符组成的)、工作状态(status,用来反映一个电风扇是否处于通电就绪 ready、正在转动working 或者静止stop)、当前的速度(speed,可以用数值型表示);c)用构造函数可以创建一个电风扇对象,指定其品牌就可以了,一个电风扇的初始状态可以是静止,而且初始速度为,分析为什么不适宜直接通过构造函数的形式参数来指定初始状态和速度;d)考虑是否应该给该类提供如下的方法,重点考虑每个动作导致的状态变化,形成代码逻辑;模拟一个开关动作,提供一个方法来表示电风扇的开与关通过加速和减速两个方法来调整速度,当速度超出极限(0 或),向控制台输出一条告警信息作为提示,并且不执行该动作。提供一个方法能够返回电风扇当前的状态和速度e)添加一个main 方法,按顺序完成以下工作,考虑状态与速度变化和开关动作之间的关系:创建一个电风扇对象,用表示;加速一次电风扇;向控制台输出f 的状态和速度;启动电风扇(调用对象的开关方法);向控制台输出f 的状态和速度;连续加速次(考虑发生什么情况);向控制台输出f 的状态和速度;连续减速次(考虑发生什么情况);向控制台输出f 的状态和速度;关掉电风扇(调用对象的开关方法);连续加速 2 次向控制台输出f 的状态和速度;运行结果:品牌:美的,速度:0,当前状态:通电未工作已经是最大速度,无法加速品牌:美的,速度:3,当前状态:通电工作已经是最小速度,无法减速品牌:美的,速度:0,当前状态:通电未工作品牌:美的,速度:2,当前状态:未通电10.分析程序,写出运行结果,解释原因。public class Test static int i=0;public int aMethod()i+;return i;public static void main(String args)Test test=new Test();test.aMethod();int j=test.aMethod();System.out.printIn(j);运行结果:2 执行 test.aMethod()后,i 的值为 1;运行 j=test.aMethod();后,j=2;12.分析下面的程序,完成后面的要求。ClassOne.java 1.package com.abc.pkg1;2.public class ClassOne 3.private char var=a;4.char getVar()return var;5.ClassTest.java 1.package com.abc.pkg2;2.import com.abc.pkg1.ClassOne;3.public class ClassTest extends ClassOne 4.public static void main(Stringargs)5.char a=new ClassOne().getVar();6.char b=new ClassTest().getVar();7.8.要求:1)ClassTest.java程序编译和运行正确吗?,如果错误,解释原因。不正确.getVar();是友好类型的,只能在类和同一个包下运行。2)删除 ClassOne.java第一行的public,分析 ClassTest.java程序有何变化?不能继承 ClassOne类和里面的方法。3)保持 ClassOne.java第一行的public,修改第四行getVar的访问范围分别为public、private、protected,分析 ClassTest.java程序有何变化?Public:两个都可以调用getVar();Private:无法调用getVar();Protected:ClassOne().getVar()不能执行;评语:日期:年月日