您的位置:首页 > 编程语言 > Java开发

Java 习题5 参考答案及解析(2)

2017-06-09 22:26 375 查看

阅读程序

(1)请说出E类中【代码1】和【代码2】的输出结果。

Java
class A{
double f(double x,double y){
return x + y;
}
}
class B extends A{
double f(int x,int y){
return x*y;
}
}
public class E{
public static void main(String args[]){
B b = new B();
System.out.println(b.f(3,5));    //【代码1】
System.out.println(b.f(3.0,5.0));    //【代码2】
}
}


(2)请说出B类中【代码1】好【代码2】的输出结果。

Java
class A{
public int getNumber(int a){
return a+1;
}
}
class B extends A{
public int getNumber(int a){
return a+100;
}
public static void main(String args[]){
A a = new A();
System.out.println(a.getNumber(10));    //【代码1】
a = new B();
System.out.println(a.getNumber(10));    //【代码2】
}
}


(3)请说出E类中【代码1】~【代码4】的输出结果。

Java
class A{
double f(double x,double y){
return x+y;
}
static int g(int n){
return n*n;

4000
}
}
class B extends A{
double f(double x,double y){
double m = super.f(x,y);
return m+x*y;
}
static int g(int n ){
int m = A.g(n);
return m+n;
}
}
public class E{
public static void main(String args[]){
B b = new B();
System.out.println(b.f(10.0,8.0));    //【代码1】
System.out.println(b.g(3));    //【代码2】
A a = new B();
System.out.println(a.f(10.0,8.0));    //【代码3】
System.out.println(a.g(3));    //【代码4】
}
}


(4)请说出E类中【代码1】~【代码3】的输出结果。

Java
class A{
int m;
int getM(){
return m;
}
int seeM(){
return m;
}
}
class B extends A{
int m;
int getM(){
return m+100;
}
}
public class E{
public static void main(String args[]){
B b = new B();
b.m = 20;
System.out.println(b.getM());//【代码1】
A a = b;
a.m = -100;        //上转型对象访问的是被隐藏的m
System.out.println(a.getM());//【代码2】上转型对象调用的一定是子类重写的getM()方法
System.out.println(b.seeM());//【代码3】子类继承的seeM()方法操作的m是被子类隐藏的m
}
}


阅读程序解析

1.【代码1】15.0 。【代码2】 8.0

B类继承了A类,但是B中的f方法并不是重写A类中的(参数类型不同),【代码1】调用f传两个int,实际调用的是B类自己的方法,返回值是double,所以输出15.0 。【代码2】调用f传两个double,调用的是继承自A类的方法,输出8.0 。

2.【代码1】:11。 【代码2】:110 。

对象a是A类的对象,调用的是A类自己的方法,接着让a实例化B类,a称为上转型对象,此时调用的是子类重写父类的方法。

3.【代码1】:98.0 。 【代码2】:12 。【代码3】:98.0 。 【代码4】:9

代码1调用b对象的f方法,b对象是B类实例化的,调用的是B类自己的f方法,传入10.0和8.0后,用super关键字调用了父类的f方法,得到18.0赋值给m,最后返回18.0+10.0*8.0也就是98.0。

【代码2】调用B类中的静态方法g传入3,方法内又去调用父类中的g方法传入3,得到9赋值给m后,输出9+3也就是12。

【代码3】a对象是上转型对象,上转型对象可以调用重写父类的方法以及父类派生的方法,所以a调用的f方法是它重写的方法,那么具体过程就跟【代码1】相同,答案为98.0

【代码4】在于g方法是静态方法,静态方法是不允许被重写的,所以B类中的g方法相当于该类特有的方法,那么a调用的g方法实际上是父类的,输出结果为9 。

4.【代码1】:120 【代码2】:120 【代码3】-100

详情请看题目代码中的注释。

编程题

设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声,要求如下。

编写抽象类Animal

Animal抽象类有两个抽象方法cry()和getAnimalName(),即要求各种具体的动物给出自己的叫声和种类名称。

编写模拟器类Simulator

该类有一个playSound(Animal animal)方法,该方法的参数是Animal类型,即参数animal可以调用Animal的子类重写的cry()方法播放具体动物的声音,调用子类重写的getAnimalName()方法显示动物种类的名称。

编写Animal的子类:Dog和Cat类

编写主类Application(用户程序)

在主类Application的main方法中至少包含如下代码:

Simulator simulator = new Simulator();
simulator.playSound(new Dog());
simulator.playSound(new Cat());


编程题解析

Java
Animal.java
public abstract class Animal{
public abstract void cry();
public abstract String getAnimalName();
}

Simulator.java
public class Simulator{
public void playSound(Animal animal){
System.out.println("现在播放"+animal.getAnimalName()+"类的声音:");
animal.cry();
}
}
Dog.java
public class Dog extends Animal{
public void cry(){
System.out.println("汪汪...汪汪");
}
public String getAnimalName(){
return "狗";
}
}
Cat.java
public class Cat extends Animal{
public void cry(){
System.out.println("喵喵...喵喵");
}
public String getAnimalName(){
return "猫";
}
}

Application.java
public class Test{
public static void main(String args[]){
Simulator simulator = new Simulator(); simulator.playSound(new Dog()); simulator.playSound(new Cat());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: