目录
实验二 对象和类
实验目的
如何定义类、创建对象、使用类与对象。
掌握类及成员的修饰符的运用。
掌握构造函数的使用、不同参数的构造函数如何使用。
如何定义方法、调用方法、他们的方法参数和返回值。
形式参数与实际参数的不同概念、他们之间如何结合。
局部变量和全局变量在使用中的影响。
实验内容
为二次方程式ax^2+bx+c=0设计一个名为QuadraticEquation的类。这个类包括:
- 代表三个稀疏的私有数据域a、b、c。
- 一个参数为a、b、c的构造方法。
- a、b、c的三个get方法。
- 一个名为getDiscriminant()的方法返回判别式,b^2-4ac。
- 名为getRoot1()和getRoot2()的方法返回等式的两个根。
- 名为test()的方法,返回值为void,如果判别式为正数,显示两个根,返回2;如果判别式为0,显示一个根,返回1;否则,显示“The equation has no roots.”,返回0。
实验示例代码
QuadraticEquation.java
public class QuadraticEquation {
private double a,b,c;
public QuadraticEquation(double a,double b,double c){
this.a=a;
this.b=b;
this.c=c;
}
public double getA() {
return a;
}
public double getB() {
return b;
}
public double getC() {
return c;
}
public double getDiscriminant(){
return b*b-4*a*c;
}
public double getRoot1(){
double delta=getDiscriminant();
return ((-b)+Math.sqrt(delta))/(2*a);
}
public double getRoot2(){
double delta=getDiscriminant();
return ((-b)-Math.sqrt(delta))/(2*a);
}
public int test(){
double delta=getDiscriminant();
if(delta>0){
System.out.println("Root1="+getRoot1()+";Root2="+getRoot2());
return 2;
}else if(delta<0){
System.out.println("The equation has no roots.");
return 0;
}else {
System.out.println("Root1=Root2="+getRoot1());
return 1;
}
}
}
实验设计的思路和考量
二次方程的测试用例设计
文中需要验证的是delta大于、等于、小于0的三种情况,并分别得出各自的根的值。因此有以下三种测试用例
a | b | c | Root1 | Root2 |
1 | 3 | 1 | -0.381966 | -2.61803 |
1 | 2 | 1 | -1 | |
1 | 2 | 3 | 无实根 |
测试用例验证代码
public static void quadraticEquation(){
List<QuadraticEquation> list=new ArrayList<>();
List<Integer> result=new ArrayList<>();
QuadraticEquation q=new QuadraticEquation(1,3,1);
list.add(q);
result.add(2);
q=new QuadraticEquation(5,88,13);
list.add(q);
result.add(2);
q=new QuadraticEquation(1,2,1);
list.add(q);
result.add(1);
q=new QuadraticEquation(25,-40,16);
list.add(q);
result.add(1);
q=new QuadraticEquation(25,50,50);
list.add(q);
result.add(0);
q=new QuadraticEquation(1,2,3);
list.add(q);
result.add(0);
for(int i=0;i<list.size();i++){
QuadraticEquation testQ=list.get(i);
if(testQ.test()!=result.get(i)){
System.out.println("测试用例:“a="+testQ.getA()+"、b="+testQ.getB()+"、c="+testQ.getC()+"”结果错误!");
return;
}else System.out.println("测试用例:“a="+testQ.getA()+"、b="+testQ.getB()+"、c="+testQ.getC()+"”结果正确,通过!");
}
System.out.println("测试用例全部通过!");
}
定义类和创建对象
类是对象的定义,对象从类创建。因此,实验中需要对象有abc等数据域(属性),和各种方法,就需要在类中定义。需要注意的是,我们可以把两个类放在同一个java文件当中,但是一个文件中只能有一个类是公共(public)类,并且公共类必须与文件同名。运行这个文件时,Java运行系统会调用这个主类的main方法。
使用构造方法构造对象
构造方法有以下三个特殊性:
- 构造方法必须具备和所在类同样的名字。
- 构造方法没有返回值类型,甚至连void也没有。
- 构造方法是在创建一个对象使用new操作符时调用的。构造方法的作用是初始化对象。
构造方法也可以重载,但是他们要有不同的签名。这样更易于用不同的初始数据之来构造对象。
熟练使用java库中的类
在初级学习的阶段,java库中需要熟悉的是Date类、Random类、Math类、Point2D类等。随着学习的积累,会认识更多的java API。比如在本次实验中就会用到Math类中的sqrt()方法。
静态变量、常量和方法
静态变量被类中的所有对象所共享。静态方法不能访问类中的实例成员。
如果想让一个类的所有实例共享数据,就要使用静态变量。静态变量将变量值存储在一个公共的内存地址。因为他是公共的地址,所以如果一个对象修改了静态变量的值,那么同一个类的所有对象都会受到影响。Java支持静态方法和静态变量,无需创建类的实例就可以调用静态方法。
可见性修饰符
可见性修饰符一颗在类、方法、属性(数据域)前使用,表示一个类及他的成员的可见性。如果没有可见性修饰符,那么则默认类、方法、属性是可以被同一个包中的任何一个类访问的。
this引用
关键字this是指向调用对象本身的引用名,可以用this关键字引用对象的实例成员。他也可以在构造方法内部用于调用同一个类的其他构造方法。