Java子类,使用来自同一超类的另一个子类的数据

时间:2018-10-22 23:13:01

标签: java superclass

我创建了3个类,一个超类“ a”,以及两个子类“ b”和“ c”。我正在创建c的实例,给它一个整数“ n”,然后使用子类b进行一些计算。我遇到的问题是,当我创建实例c来调用b时,数据在技术上属于超类a / c吗?所以当我用

创建b的实例时

b b_instance = new b();

在c实例内部, 我调用的b calc()函数将返回0。我猜是因为b有它自己的数据生态圈了?

我该怎么做?

2)

另外,我如何调用同名的超类函数?

谢谢!

public class prog
{
   public static void main(String args[])
   {  
       c c1 = new c();
       c1.run();

   }
}

class a
{
   private int number;

   void set_number(int n)
   {
      number = n;
   }

   int get_number()
   {
      return number;
   }

   int calc()
   {
      return number*2;
   }

}

class b extends a
{
   int calc()
   {
      // calling the superclass function calc, then subtract
      return super.calc() - get_number();
   }
}

class c extends a
{


   void run()
   {
      set_number(1);
      b b1 = new b();
      System.out.println(b1.calc());
   }

}

无限循环问题

public class prog
{
   public static void main(String args[])
   {  
      c c1 = new c();
      c1.run();

   }
}

class a
{   
   void calc_a()
   {
      System.out.println("")  ;
   }

   void calc_b()
   {
      calc_a(); // meaning the calc_a() in the superclass
   }
}

class b extends a
{
   void calc_a()
   {
      super.calc_b();
   }
}

class c extends a
{
   void run()
   {
      b b1 = new b();
      b1.calc_b();
   }
}

1 个答案:

答案 0 :(得分:1)

  

b b_instance = new b();

     

在c实例内部,我调用的b calc()函数将返回0。   我猜是因为b有它自己的数据生态圈?

     

我该怎么做?

可能的方式“一对”。我会考虑从c扩展b,这样c获得ab的所有功能,就像...

class c extends b {

    void run() {
        set_number(1);
        System.out.println(calc());
    }

}

但是,如果这不可行(出于某种原因或其他原因),则需要将c必须具有的值传递给b,类似...

class c extends a {

    void run() {
        set_number(1);
        b b1 = new b();
        b1.set_number(get_number());
        System.out.println(b1.calc());
    }

}

现在,话虽如此,这让我“闻起来”。从a扩展以使c可以执行b有什么意义?这会给我敲响警钟。

问题是,如果您调用c#calc,则仅使用a的{​​{1}}方法...基于calc的方法似乎没有成为您想要实现的目标,所以这一切都是一团糟

  

2)

     

还,我如何调用同名的超类函数?

因为直接调用run会导致calc,因为您经常不断地自称自己。

在这种情况下,您要进行StackOverflowError正在进行的操作并对其进行修改。这是OO语言中的常见做法。

旁注...

Java(和Java社区)已经有一套定义明确的编码实践。您应该花一些时间来学习它们,这将使您的代码更易于阅读,并使您更容易阅读其他人的代码。

Code Conventions for the Java TM Programming Language

开头

类名应以大写字母开头,方法在a中,例如...

camelCase

已更新...

class A {

    private int number;

    void setNumber(int n) {
        number = n;
    }

    int getNumber() {
        return number;
    }

    int calc() {
        return number * 2;
    }

}

您需要问自己的问题是,class a { void calc_a() { System.out.println(""); } void calc_b() { calc_a(); // meaning the calc_a() in the superclass } } class b extends a { void calc_a() { super.calc_b(); } } class c extends a { void run() { b b1 = new b(); b1.calc_b(); } } 为什么需要覆盖b?为什么不覆盖calc_a?可以解决问题

  

我如何覆盖它?

calc_b
相关问题