【问题标题】:get no return value when the child class extends to the parent class java inheritancejava继承子类扩展到父类时没有返回值
【发布时间】:2020-11-14 09:57:27
【问题描述】:

我是初学者,想学习java中的继承概念,我做了一个程序来计算一个正方形的面积和一个立方体的体积,我把立方体类扩展到正方形类

方形(父)

public class Persegi {

double sisi;

public double getSisi() {
    return sisi;
}

public void setSisi(double sisi) {
    this.sisi = sisi;
}

public double getLuas(){
    return sisi * sisi;
}
}

立方体(儿童)

public class Kubus extends Persegi{

Persegi psg = new Persegi();

public double getVolume(){
 return psg.getLuas() * psg.getSisi();
}

但是当我在主类中打印值时,子类并没有从我在父类中创建的方法中获取值

主类

public class MainProgram {
public static void main(String[] args){
    
    Persegi persegi = new Persegi();
    Kubus kubus = new Kubus();
    
    Scanner nilai = new Scanner(System.in);
    
    System.out.print("Masukkan nilai sisi = ");
    persegi.setSisi(nilai.nextInt());
    
    System.out.println("Luas = "+persegi.getLuas());
    System.out.println("Volume = "+kubus.getVolume());
}

结果是这样的output

【问题讨论】:

  • 您没有在Kubus 实例上调用setSisi(),仅在Persegi 实例上调用。因此,kubus.getSisi() 返回零,零乘以任何值,不出所料,为零。

标签: java inheritance


【解决方案1】:

persegikubus 是两个不同的对象。您还没有设置kubus 的任何属性。所以Java中double类型的默认值0.0打印为kubus.getVolume()

您正在使用psg 对象的属性来计算getVolume() 方法的返回值。

如果您要为 psg 添加 getter 和 setter:

public class Kubus extends Persegi {

    Persegi psg = new Persegi();

    public double getVolume() {
        return psg.getLuas() * psg.getSisi();
    }

    public Persegi getPsg() {
        return psg;
    }

    public void setPsg(Persegi psg) {
        this.psg = psg;
    }
}

然后可以设置psg对象的属性:

Persegi persegi = new Persegi();
Kubus kubus = new Kubus();

Scanner nilai = new Scanner(System.in);

System.out.print("Masukkan nilai sisi = ");
persegi.setSisi(nilai.nextInt());

kubus.getPsg().setSisi(3.0); // assign 3.0 to sisi attribute of kubus object
    
System.out.println("Luas = "+persegi.getLuas());
System.out.println("Volume = "+kubus.getVolume());

然后你得到结果:

Masukkan nilai sisi = 4
Luas = 16.0
Volume = 27.0

Volume = 27.0 输出说明:

  • getLuas() 返回3*3 = 9
  • getSisi()=3
  • getVolume() 返回 psg.getLuas() * psg.getSisi() : 9*3=27

【讨论】:

    【解决方案2】:

    而不是

    public class Kubus extends Persegi{
    
        Persegi psg = new Persegi();
    
        public double getVolume(){
         return psg.getLuas() * psg.getSisi();
        }
    }
    

    使用

    public class Kubus extends Persegi{
        public double getVolume(){
         return getLuas() * getSisi();
        }
    }
    

    你不需要在你的子类中创建父类的实例,你的子对象已经是一个实例了。

    并且(正如其他人已经提到的),您必须在 Kubus 实例上调用 setSisi()

    在你的主要:

    public static void main(String[] args) {
    
        Persegi persegi = new Persegi();
        Kubus kubus = new Kubus();
    
        kubus.setSisi(42); // you have to set the 'sisi' of the kubus ... 42 = magic number
    
        Scanner nilai = new Scanner(System.in);
    
        System.out.print("Masukkan nilai sisi = ");
        persegi.setSisi(nilai.nextInt());
    
        System.out.println("Luas = " + persegi.getLuas());
        System.out.println("Volume = " + kubus.getVolume());
    }
    

    【讨论】:

    • 虽然这是真的,但这不是所描述行为背后的原因。如果多维数据集未初始化(即未在多维数据集实例上调用 setSisi()),您建议的代码仍将返回零。
    • 我已经尝试不将Persegi 类调用到Kubus 类。但是结果是一样的,音量值还是null
    • @bbqapps 同样,您需要在 Kubus 实例上调用 setSisi()。否则,您在方法中用于获取面积和体积的 getSisi() 将返回零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2019-02-28
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多