实验三-Java继承和多态之成员变量隐藏之优惠促销价格计算

任务要求

任务描述

本关任务:计算商品打折后的价格。

相关知识

在编写子类的时候,我们仍然可以声明一些新的成员变量,其中有一种特殊的情况就是,所声明的成员变量的名字和从父类继承来的成员变量的名字相同(声明的类型可以不同),在这种情况下,子类就会隐藏所继承的成员变量。

子类继承的方法只能操作子类继承和隐藏的成员变量(意思就是说子类继承的方法所操作的成员变量一定是被子类继承和隐藏的成员变量)。子类新定义的方法可以操作子类继承和子类新声明的成员变量,但是无法操作子类隐藏的成员变量。

例子:

 

class Father {
// 定义名称属性
String name = "Jack";
}
class Son extends Father {
// 定义名称属性
String name = "Jack's son";
}
public class ClazzTest {
public static void main(String[] args) {
// 实例化子类对象
Son s1 = new Son();
System.out.println(" s1.name : " + s1.name);
}
}

执行结果:

 
  1. s1.name : Jack's son

在上述代码中,我们获取到的 name 属性的值为“Jack's son”,而父类的 name 值却获取不到,那是因为在一个类中,子类中的成员变量如果和父类中的成员变量同名,那么即使他们类型不一样,只要名字一样,父类中的成员变量都会被隐藏。在子类中,父类的成员变量不能被简单的用引用来访问。我们在用到时,必须从父类的引用获得父类被隐藏的成员变量。 如何引用呢?

 
  1. Son s1 = new Son();

  2. System.out.println(" s1.name : " + ((Father)s1).name);

执行结果:

 
  1. s1name : Jack

我们将子类对象强转为父类对象,这样就可以拿到父类定义的 name 属性的值了。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,按照提示编写程序代码。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。


开始你的任务吧,祝你成功!

参考答案

解题思路

/**
 * 任务:根据商品的折扣和总价计算商品打折后的价格。
 */
class Total {
    double totalMoney = 50.00;
    public double getTotalMoney(){
        return totalMoney;
    }
}
// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
// 定义一个Seal的公开类,并继承Total类
public class Seal extends Total{
    // 定义两个变量,分别代表折扣和总价格,类型为double
    double discount; // 折扣
    double totalMoney; // 总价
    // 定义一个有参构造方法,带两个参数,依次为折扣和总价格
    public Seal(double discount, double totalMoney) {
        this.discount = discount;
        this.totalMoney = totalMoney;
    }
    // 定义一个方法名为sealX的方法,返回类型为double,计算打折后的商品价格并返回
    public double sealX(){
        return totalMoney*discount;
    }
}
/********** End **********/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java中的继承多态对于成员变量来说,会发生隐藏现象。隐藏现象即子类中定义了与父类中同名的成员变量,此时父类中的成员变量会被隐藏。使用子类对象访问该变量时会访问子类中的变量,而不是父类中的变量。 通过使用关键字super访问父类中被隐藏的变量。 ```java class Parent { int x = 100; } class Child extends Parent { int x = 200; } public class Main { public static void main(String[] args) { Child obj = new Child(); System.out.println(obj.x); // Outputs 200 System.out.println(((Parent) obj).x); // Outputs 100 } } ``` 在上面的代码中,父类Parent中的成员变量x被子类Child中的同名变量x隐藏了,通过子类对象访问x时会访问到子类中的x。如果希望访问父类中的x, 需要使用类型转换和super关键字来访问父类中的变量. ### 回答2: Java继承多态是面向对象编程中的两个重要概念。其中,成员变量隐藏是指子类在继承父类时,如果子类成员变量和父类成员变量名称相同,则子类成员变量隐藏父类成员变量,并且子类无法访问父类中被隐藏成员变量。 在Java中,成员变量隐藏主要有以下几种情况: 1.同名且同类型的成员变量 如果子类和父类都有同名的成员变量,并且类型相同,那么子类的成员变量会覆盖父类的成员变量。这时,子类无法直接访问父类被隐藏成员变量。 2.同名且不同类型的成员变量 如果子类和父类都有同名的成员变量,但是类型不同,那么子类会定义一个全新的成员变量,而不会隐藏父类的成员变量。这两个成员变量在子类中是完全独立的。 3.父类成员变量被显式地引用 如果子类要使用父类被隐藏成员变量,可以通过使用super关键字来显式地引用调用父类成员变量。 在实际应用中,成员变量隐藏需要注意以下几点: 1.成员变量隐藏不影响方法的继承和重载。 2.在继承链中,如果有多个父类都定义了同名的成员变量,那么子类将会隐藏最近的父类成员变量。 3.为了避免成员变量的误隐藏,在定义子类成员变量时应该选择不同的名称。 总之,成员变量隐藏Java继承多态特性的重要组成部分。了解和掌握成员变量隐藏规则可以帮助我们更好地理解Java中的编程模型,提高代码的可读性和可维护性,从而更好地完成软件开发任务。 ### 回答3: Java语言中支持继承多态的特性,这使得程序员可以编写更加灵活和可复用的代码。在Java中,当子类继承父类时,子类会自动继承父类的成员变量和方法。但是,在某些情况下,子类可能会声明与父类同名的成员变量,导致子类的成员变量隐藏了父类的成员变量成员变量隐藏可能会带来一些问题。当子类隐藏了父类的成员变量时,子类的方法能够访问到的成员变量是子类的成员变量,而父类的成员变量则无法被访问到。如果父类和子类的成员变量具有相同名称,但是在子类中改变了成员变量的值,将会导致父类成员变量的值不会改变,而子类成员变量的值会改变。 为了避免成员变量隐藏带来的问题,程序员可以使用super关键字来显式地访问父类的成员变量,即使它被子类的成员变量隐藏。使用super关键字可以让子类直接访问父类的成员变量,而不必先将父类成员变量复制到子类中。这样做可以减少代码的冗余,提高程序的效率。 总之,了解成员变量隐藏Java继承多态的重要知识点,程序员应当注意使用super关键字来避免成员变量隐藏带来的问题。只有灵活使用继承多态特性,才能编写出更加高效可复用的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值