请写出以下程序运行结果(多态:转型问题) public class d2 { public static void main(String[] args) { X x=new X(); System.out.println(x.name); x.show(); x.display(); X x1=new Y(); System.out.println(x1.name); x1.show(); x1.display(); Y y1=new Y(); System.out.println(y1.name); y1.show(); y1.display(); } } class X{ String name="aa"; static void show(){ System.out.println("10"); } void display(){ System.out.println("20"); } } class Y extends X{ String name="bb"; static void show(){ System.out.println("30"); } void display(){ System.out.println("40"); } }
时间: 2024-01-27 20:03:04 浏览: 18
程序的运行结果为:
```
aa
10
20
aa
30
40
bb
30
40
```
解释如下:
- 对象`x`是`X`类型的,`name`属性的值为`aa`,调用`show()`和`display()`方法分别输出`10`和`20`。
- 对象`x1`是`Y`类型的,但是声明为`X`类型,此时`name`属性的值仍然是`aa`,因为在`X`中已经定义了`name`属性。调用`show()`方法时调用的是`X`中的静态方法,输出`10`,调用`display()`方法时调用的是`Y`中的非静态方法,输出`40`。
- 对象`y1`是`Y`类型的,`name`属性的值为`bb`,调用`show()`方法时调用的是`Y`中的静态方法,输出`30`,调用`display()`方法时调用的也是`Y`中的非静态方法,输出`40`。
相关问题
在测试主类TestClass创建static类型getMsg方法:public static void getMsg(Buddhism bu),在main方法中使用接口多态的方式创建BuddhistStudent实现类对象,并对getMsg方法进行调用,实现显示佛学的专业课程。
下面是代码实现:
```java
public interface Buddhism {
void studyBuddhism();
}
public class BuddhistStudent implements Buddhism {
@Override
public void studyBuddhism() {
System.out.println("学习佛学专业课程");
}
}
public class TestClass {
public static void getMsg(Buddhism bu) {
bu.studyBuddhism();
}
public static void main(String[] args) {
Buddhism bu = new BuddhistStudent();
getMsg(bu);
}
}
```
首先定义了一个Buddhism接口,接口中有一个studyBuddhism()方法。
然后创建了一个BuddhistStudent实现类,实现了Buddhism接口中的studyBuddhism()方法。
接着在TestClass类中创建了一个static类型的getMsg()方法,该方法接受一个Buddhism类型的参数,并调用其studyBuddhism()方法。
最后在main方法中使用接口多态的方式创建了一个BuddhistStudent对象,并将其传入getMsg()方法中进行调用,实现显示佛学的专业课程。
2. 有程序定义如下,请回答问题: public class Sy12_2 { public static void main(String[] args) { Card c; c = new GoldCard("zhangsan",10000); c.pay(500); System.out.println("剩余:" + c.getMoney()); c = new SilverCard(); c.setMoney(10000); c.pay(500); System.out.println("剩余:" + c.getMoney()); } } ① 定义一个抽象类Card,包括成员变量:name、money,抽象方法void pay(double); ② 定义GoldCard子类:重写pay方法,按照原价的8折计算输出; ③ 定义SilverCard子类:重写pay方法,按照原价的8.5折计算输出。 ④ 运行程序,记录程序输出结果。 ⑤ 结合程序说明什么是多态?补充完成代码
1. 以下是代码输出结果:
剩余:9500.0
剩余:9150.0
2. 多态是面向对象编程的一个重要特性,指的是同一种类型的对象,在不同的情况下表现出不同的行为。在上述程序中,Card是一个抽象类,定义了pay方法,而GoldCard和SilverCard是Card的子类,它们都重写了pay方法,按照不同的折扣计算并输出支付金额。在main方法中,通过Card类型的引用c来分别实例化GoldCard和SilverCard对象,并调用它们的pay方法,此时c所引用的对象具有不同的行为,即表现出了多态性。
3. 补充完成的代码如下:
```
public abstract class Card {
protected String name;
protected double money;
public Card(String name, double money) {
this.name = name;
this.money = money;
}
public abstract void pay(double num);
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
public class GoldCard extends Card {
public GoldCard(String name, double money) {
super(name, money);
}
@Override
public void pay(double num) {
double payMoney = num * 0.8;
money -= payMoney;
System.out.println("原价:" + num + ",打8折后:" + payMoney + ",剩余:" + money);
}
}
public class SilverCard extends Card {
public SilverCard(String name, double money) {
super(name, money);
}
@Override
public void pay(double num) {
double payMoney = num * 0.85;
money -= payMoney;
System.out.println("原价:" + num + ",打8.5折后:" + payMoney + ",剩余:" + money);
}
}
public class Sy12_2 {
public static void main(String[] args) {
Card c;
c = new GoldCard("zhangsan", 10000);
c.pay(500);
System.out.println("剩余:" + c.getMoney());
c = new SilverCard("lisi", 10000);
c.pay(500);
System.out.println("剩余:" + c.getMoney());
}
}
```