Java实验报告
观察以下代码,进行实验。
该程序实现了一个父类Telephone和其子类Mobilephone,该类有电话品牌,电话号码等属性,另外还有计算话费和显示信息等方法。子类Mobilephone除了具有父类的属性外,还有网络类型,被叫时间等属性,另外它还有自己的计算话费和显示信息的方法。
class Telephone{
String brand,number;
double dialledTime;
double rate;
Telephone(String b, String n){
brand = b;
number = n;
}
String getBrand(){return brand;}
String getNumber(){return number;}
double getRate(){return rate;}//返回费率值
double getDialledTime(){return dialledTime;}
void setBrand(String b){
brand = b;
}
void setNumber(String n){
number = n;//设置电话号码
}
void setRate(double r){
rate = r;
}
void setDialledTime(double d){
dialledTime = d;
}
double callCost(){
return dialledTime * rate;
}
void display(){
System.out.println("电话品牌:"+brand+"电话号码:"+number);
System.out.println("通话时间:"+dialledTime+"费率:"+rate);
System.out.println("话费"+callCost());
}
}
class Mobilephone extends Telephone{
String network;
double receivedTime;
Mobilephone(String b,String num,String net){
super(b,num);
network = net;
}
String getNetwork(){return network;}
double getReceivedTime(){return receivedTime;}
void setNetwork(String n){
network = n;
}
void setReceivedTime(double d){
receivedTime = d;//设置被叫时间
}
double callCost(){
return (dialledTime+0.5*receivedTime)*rate;
}
void display(){
System.out.println("电话品牌:"+brand+"电话号码:"+number+"网络:"+network);
System.out.println("主叫时间:"+dialledTime+"被叫时间:"+receivedTime+"费率:"+rate);
System.out.println("花费"+callCost());
}
}
public class Inheritance{
public static void main(String[] args){
Telephone tel;
Mobilephone mobile;
tel = new Telephone("TCL","8309600");
mobile = new Mobilephone("Nokia","13007091010","CDMA");
tel.setRate(0.2);
tel.setDialledTime(150);
mobile.setRate(0.4);
mobile.setDialledTime(80);//设置主叫时间为80
mobile.setReceivedTime(120);
tel.display();
System.out.println();
mobile.display();//显示移动电话的信息
}
}
1、使用DOS命令进入其所存放的目录,编译运行该程序。并将运行结果展示。
2、Mobilephone类的display( )方法中的 callCost( )方法调用的是谁的方法?如何调用父类的callCost( )方法?另外,将Mobilephone类的构造方法中的super(b, num)去掉,有什么结果?为什么?
- Mobilephone类中的display()方法中的callCost()方法调用Mobilephone()类的方法。使用super关键字可以调用父类的callCost()方法,即在Mobilephone类中的display()方法中的callCost()改为super.callCost().
- 如果去掉Mobilephone类中super(b,num)语句,程序将会报错。因为在Mobilephone类的构造方法中,指定了三个参数,在这个类中的display()方法也使用了这些参数。如果没有显式继承(即通过super语句继承),则继承父类中无参数的构造函数。在本程序中Telephone类中明显没有无参数构造函数,所以如果去掉super(b,num)这个语句,Mobilephone构造方法无法从父类Telephone中继承 b,num属性,会导致程序无法通过编译,无法正常运行。
- 通过去掉这个语句,重新编译运行验证。无法通过编译,结果与分析大致相符。