有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

b_实例=新的b()

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

我该怎么做

(二)

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

谢谢

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) 个答案

  1. # 1 楼答案

    b b_instance = new b();

    inside the instance of c, the b calc() function I call would return 0. I guess it's because b has it's own eco-sphere of data?

    How do I do this?

    有几种可能的方法。我考虑从^ {< CD2> }中扩展^ {< CD1> },这样^ {< CD1> }获得^ { CD4}}和^ {CD2}}的所有功能,例如…

    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,它只会转到acalc方法。。。基于run,这似乎不是你想要实现的,所以这一切都是一团糟

    2)

    Also, how do i call the superclass function of the same name?

    因为直接调用calc会导致StackOverflowError,因为你一直在调用自己

    在本例中,您正在执行a正在执行的操作并对其进行修改。这是OO语言中的常见做法

    旁注

    Java(以及Java社区)已经有了一套定义良好的编码实践。你应该花时间去学习它们,这将使你的代码更容易阅读,也使你更容易阅读其他人的代码

    Code Conventions for the Java TM Programming Language开始

    类名应该以大写字母开头,方法在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?这将解决这个问题

    how do i override it?

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