1:(FenshuTest.java)理解课本4.5章有理数的类封装,(例4-7)根据内容完成:定义一个类名为FenShu,成员变量:fenZi, fenMu; 方法 :构造函数(参数分别为分子和分母),add方法,要求调用该方法,能返回两个分数的和,即另一个分数,这个分数需要除掉公约数。例如算出的和为9/15 返回的值应该是3/5。创建相应的测试类调用Fenshu的构造函数和add方法。 2:(Student.java)定义一个学生Student类,分别有ID,Name,Sex成员变量,有构造函数(ID, ID和Name),对于学生的Sex, 不能直接赋值给Sex成员变量,需要通过setSex函数和getSex函数来分别设置和获取Sex 变量,思考如何设计这个类? 3:(Calculator.java)创建一个Calculator 类,有add方法,能利用重载实现以下效果: 1:传进两个整数,返回两个整数之和。 2:传进一个整数,一Z个分数,返回一个分数 3:传进两个分数,返回一个分数 注意:分数是个类。 创建相应的测试类调用以上函数 (测试函数直接放在Calculator类里) 4: 定义类:cn.goods.Apple,有价钱,重量 |
包装好的FenShu类的代码,接下可以直接调用就好了,(FenShu.java)代码如下: public class FenShu { public int fenZi; public int fenMu; FenShu(){//构造方法,因为下面用了构造方法这个空的构造函数就没了,但我们需要这个,所以必须写出来
} public boolean isInteger(FenShu f) {//判断这个分数是不是整数 if(f.fenZi%f.fenMu==0) { return true; }else { return false; } } FenShu(int fenZi,int fenMu){//构造分数,参数分别是分子和分母 this.fenZi=fenZi; this.fenMu=fenMu; } public String toString() {//把分数转换成字符串,输出会比较方便 return this.fenZi+"/"+this.fenMu; } public FenShu add(FenShu f1,FenShu f2) {//分数相加的方法 FenShu f3 = new FenShu(); f3.fenZi=f1.fenZi*f2.fenMu+f2.fenZi*f1.fenMu;//分子相加的表达式 f3.fenMu=f1.fenMu*f2.fenMu;//分母相加的表达式 int g=gcd(f3.fenZi,f3.fenMu);//gcd就是求最大公约数的函数,g就是最大公约数 f3.fenZi/=g;//分子和分母同时除以最大公约数这个分数就是最简的了 f3.fenMu/=g; return f3;//返回求和的分数类型 } public int gcd(int a,int b) { return b==0?a:gcd(b,a%b);//这个是辗转相除法的表示,采用递归思想 } } 测试这个分数求和进行的数据测试的代码如下(FenShuTest.java): public class FenShuTest {//这个类就是对分数求和创建的一个类,FenShu这个类已经包装好了,直接进行调用这个类就好了 public static void main(String args[]) { FenShu f1 = new FenShu(1,15);//声明一个分数并同时对它进行初始化 FenShu f2 = new FenShu(8,15);//声明一个分数并同时对它进行初始化 FenShu f3 = new FenShu();//单纯的声明一个分数变量,等下求和需要 f3=f3.add(f1, f2);//调用f3的分数求和的方法 System.out.println(f1.toString()+"+"+f2.toString()+"="+f3.toString());//输出分数求和的结果 } } 运行结果:
public class Student { String ID;//成员变量 String Name; boolean Sex;//false代表女性,true代表男性 Student(){
} Student(String ID){//构造函数,进行赋值ID this.ID=ID; } Student(String ID,String Name){//构造函数,进行赋值ID和名字 this.ID=ID; this.Name=Name; } void setSex(boolean Sex) {//设置性别的函数 this.Sex=Sex;//对传进来的参数进行赋值给这个对象 } public boolean getSex() { return this.Sex;//获取这个对象的性别 } public static void main(String args[]) { Student stu1 = new Student("3171911132");//stu1这个对象的ID进行初始化 Student stu2 = new Student("3171911134","黄湘平");//stu2这个对象的ID和Name进行初始化 stu1.setSex(false);//设置性别 stu2.setSex(true);//设置性别 System.out.printf("学号:%s 姓名:%s 性别:%s",stu2.ID,stu2.Name,stu2.getSex()==true?"男":"女");//输出 } } 运行结果:
public class Calculator { int add(int a,int b) {//重载方法两个整型相加 return a+b; } FenShu add(int a,FenShu f2) {//重载方法一个整型加一个分数 FenShu f1 = new FenShu(a*f2.fenMu,f2.fenMu);//把整数化成分数,与另一个分数的分母相关 return f1.add(f1,f2);//直接调用FenShu类中的分数相加就可以了 } FenShu add(FenShu f1,FenShu f2) {//重载方法两个分数相加 FenShu f3 = new FenShu();//声明一个对象 return f3.add(f1, f2);//直接调用FenShu类中的分数相加就可以了 } public static void main(String args[]) { int a=5,b=4; FenShu f1 = new FenShu(1,15);//声明的同时进行初始化赋值 FenShu f2 = new FenShu(14,15);//声明的同时进行初始化赋值 FenShu f = new FenShu(); Calculator f3 = new Calculator();//声明Calculator类,调用它的重载方法要用 //进行数据测试
System.out.printf("两个整数相加的结果:%d+%d=%d%n",a,b,f3.add(a, b)); f=f3.add(a, f2); if(f.isInteger()) {//这个是调用FenShu里的方法,判断该结果的分数是不是一个整数 System.out.printf("整数加分数的结果:%d+%s=%d%n",a,f2.toString(),f.fenZi/f.fenMu); }else { System.out.printf("整数加分数的结果:%d+%s=%s%n",a,f2.toString(),f.toString()); } f=f3.add(f1, f2); if(f.isInteger()) {//这个是调用FenShu里的方法,判断该结果的分数是不是一个整数 System.out.printf("两个分数相加的结果:%s+%s=%d%n",f1.toString(),f2.toString(),f.fenZi/f.fenMu); }else { System.out.printf("两个分数相加的结果:%s+%s=%s%n",f1.toString(),f2.toString(),f.toString()); } } } 运行结果:
包名:cn.goods 类名:Apple package cn.goods; public class Apple { public double price; public Apple(double price){ this.price=price;//初始化苹果的单价 } } 包名:cn 类名:Consumer package cn; import cn.goods.Apple; public class Consumer { public double weight;//顾客买的单价 public double sum;//总价 public Consumer(double weight) { this.weight=weight;//初始化顾客要买的数量 } public void buy(Consumer con,Apple app) { con.sum=con.weight*app.price;//顾客要付的总价 System.out.printf("顾客买了%.2f斤苹果,苹果的单价是%.2f元,总价是%.2f元%n",con.weight,app.price,con.sum); } public static void main(String args[]) { Apple app_ower= new Apple(10.5); Consumer con = new Consumer(5.5); con.buy(con,app_ower); } } 运行结果:
|
错误1: 错误代码:
错误提示:
错误原因分析: 以上错误的代码是我想测试下构造函数是否能单独使用,结果发现了一些问题,构造函数只能在new的后面进行使用,而且它只进行一次,单独去用是不行的,通过提示我们可以看出,如果想让第三行成立的就必须构造一个方法与这个名字相同,并且还要是静态的方法才可以,因为静态方法才可以不用加对象名。 解决方法: static void Student(String st) { return ; } 在前面加上这段代码就可以运行了。
错误2: 错误代码关键截图:
错误提示:
错误原因分析: 这个判断该分数的方法是一开始的写法,到运行的时候才发现不能进行运行,我就进行了分析提示,首先我就发现这个判断分数是不是整数的方法没有对象名,再者就是这个Calculator类没有这个相关的方法,我的本意是调用FenShu里的那个方法名,如果一定要让这句话实现的话也是可行的,在这个类进行相关的方法构造方法,解决方法在接下来的解决方法。 解决方法: 方案1:在Calculator类里进行构造方法Student,并且这个方法是静态方法的才可以。如下: static boolean isInteger(FenShu f) { if(f.fenZi%f.fenMu==0) { return true; }else { return false; } } 方案2: 把那个if的语句进行修改就行了,改成调用FenShu里的该方法名,正确写法if(f.isInteger())就可以了。
错误3: 错误代码:
正确代码:
错误提示:
错误原因分析: 正确代码和错误代码差了一个static,这个一个词让这两个方法差了很多,我无意添加了static,也就让这个方法变成了静态方法,静态方法是不能使用this这个语句,所以那个提示就是这个意思了。 解决方法: 去掉static,让这个方法从静态方法变成普通方法,这样就可以调用this的语句了。 |
第一题: public String toString() {//把分数转换成字符串,输出会比较方便 return this.fenZi+"/"+this.fenMu; } public FenShu add(FenShu f1,FenShu f2) {//分数相加的方法 FenShu f3 = new FenShu(); f3.fenZi=f1.fenZi*f2.fenMu+f2.fenZi*f1.fenMu;//分子相加的表达式 f3.fenMu=f1.fenMu*f2.fenMu;//分母相加的表达式 int g=gcd(f3.fenZi,f3.fenMu);//gcd就是求最大公约数的函数,g就是最大公约数 f3.fenZi/=g;//分子和分母同时除以最大公约数这个分数就是最简的了 f3.fenMu/=g; return f3;//返回求和的分数类型 } public int gcd(int a,int b) { return b==0?a:gcd(b,a%b);//这个是辗转相除法的表示,采用递归思想 }
第二题: Student(String ID){//构造函数,进行赋值ID this.ID=ID; } Student(String ID,String Name){//构造函数,进行赋值ID和名字 this.ID=ID; this.Name=Name; } void setSex(boolean Sex) {//设置性别的函数 this.Sex=Sex;//对传进来的参数进行赋值给这个对象 } public boolean getSex() { return this.Sex;//获取这个对象的性别 }
第三题: int add(int a,int b) {//重载方法两个整型相加 return a+b; } FenShu add(int a,FenShu f2) {//重载方法一个整型加一个分数 FenShu f1 = new FenShu(a*f2.fenMu,f2.fenMu);//把整数化成分数,与另一个分数的分母相关 return f1.add(f1,f2);//直接调用FenShu类中的分数相加就可以了 } FenShu add(FenShu f1,FenShu f2) {//重载方法两个分数相加 FenShu f3 = new FenShu();//声明一个对象 return f3.add(f1, f2);//直接调用FenShu类中的分数相加就可以了 } 第四题: public class Apple { public double price; public Apple(double price){ this.price=price;//初始化苹果的单价 } } public class Consumer { public double weight;//顾客买的单价 public double sum;//总价 public Consumer(double weight) { this.weight=weight;//初始化顾客要买的数量 } public void buy(Consumer con,Apple app) { con.sum=con.weight*app.price;//顾客要付的总价 System.out.printf("顾客买了%.2f斤苹果,苹果的单价是%.2f元,总价是%.2f元%n",con.weight,app.price,con.sum); } } |
本次实验让我掌握了使用类来封装对象的属性和行为,掌握对象的组合以及参数传递,并且能定义类的构造函数,重载函数。用类来封装在其他类使用的确方便了很多,但在调用的过程一定要注意它们之间的关系,要调用正确。构造函数只能在new的后面下进行使用,并且它只能调用一次,构造函数的参数不同也就代表着不同的构造函数,使用起来是不一样的,如果我们创建了属于自己想要的构造函数的话,那么原本默认的构造函数就不会自动调用了,如果我们还需要这个默认的构造函数就必须写出来,把它的隐式写出来才能进行使用。在一个测试数据的类里进行重载函数,然后调用其他包装好的类,也就是说这个类里只有重载函数,没有成员变量,使用过程就可以很多情况下使用其他类来调用进行想要的功能实现,就比如第三题的Calculator类那样,也就有点再次包装这个类,方便以后进行使用,或者调用这个类。通过本次实验,我最大的收获就是为何要包装,以及它的意义,好处。多实践,多领悟,多编程,写一套属于自己的代码风格。 |
实验二 基于对象的java编程
最新推荐文章于 2022-10-30 23:07:15 发布