【问题标题】:Why Java Objects producing different outputs in Java Inheritance?为什么 Java 对象在 Java 继承中产生不同的输出?
【发布时间】:2019-09-28 18:34:17
【问题描述】:
class Book {
    int op,mp;
    String name,auther;
    void Setdata(String n,String au)
    {
        name=n;
        auther=au;

    }
    void Display()
    {
        System.out.println("Name:"+name);
        System.out.println("Auther:"+auther);
        System.out.println("Ocford price: "+op);
        System.out.println("MC price: "+mp);
    }

}
class Oxford extends Book
{
    void price(int p)
    {
        super.op=p;
    }
}
class Mc extends Book
{
    void price(int p)
    {
        super.mp=p;
    }
}
public class Sai
{
    public static void main(String args[])
    {
        Oxford o=new Oxford();
        Mc m=new Mc();
        Book b=new Book();
        b.Setdata("Java","Robert");
        o.price(300);
        m.price(400);
        b.Display();
    }
}

我的输出:

  • 名称:Java
  • 作者:罗伯特
  • 牛津价格:0
  • Mc 价格:0

预期输出:

  • 名称:Java
  • 作者:罗伯特
  • 牛津价格:300
  • mc价格:400

为什么两个类的对象 (Oxford,Mc 按书类扩展) 不能为书的类变量赋值。 打印预期输出的解决方案是什么。

【问题讨论】:

    标签: java object inheritance


    【解决方案1】:

    这是因为您打印出对象b 中的字段,该对象的类型为Book。其他对象只是坐在那里,它们的字段已初始化,等待您对它们进行操作。

    你想打电话:

    o.Display();
    m.Display();
    

    super.op 没有按照您的预期执行。您的字段不是static,因此更改一个实例中的值不会影响其他实例。您的三个对象中的每一个都有一个独立op

    【讨论】:

    • 为了使答案完美 a) 告诉 OP 使用这样的字段是非常糟糕的做法,并且 b) 他应该遵循 Java 命名约定,例如在 camelCase 中使用方法名称。
    • @Ghost 我不想对抗 OP。
    • 你总是为所有未来的读者写答案。并且告诉一个新手他的代码中的所有问题,这怎么可能是一件坏事?
    • 错误答案。我认为您没有得到这个问题。请检查我的最后一部分答案。如果我错了,请指出。
    【解决方案2】:

    这不是对象和继承的工作方式。

    你需要学习静态变量和非静态变量。

    静态变量:-

    它是类级别的变量,可以访问所有相同或的对象 继承类。

    非静态变量:-

    它的范围是对象级别。意味着每个对象都有自己的副本 多变的。就像如果有一个变量 int a = 10;然后每个对象 有 1 个副本。如果您更改 1 个对象的值,它不会 更改另一个对象的值。

    现在来看看你的代码你犯了一些错误。将您的代码与以下代码进行比较。我也会评论每一行,我会改变。

    class Book {
        int op,mp;
        String name,auther;
        void Setdata(String n,String au)
        {
            name=n;
            auther=au;
    
        }
        void Display()
        {
            System.out.println("Name:"+name);
            System.out.println("Auther:"+auther);
            System.out.println("Ocford price: "+op);
            System.out.println("MC price: "+mp);
        }
    
    }
    class Oxford extends Book
    {
        void price(int p)
        {
            super.op=p;
        }
    }
    class Mc extends Oxford  // If you want to set all price for same book and aurthor
    {
        void price(int p)
        {
            super.mp=p;
        }
    }
    public class Sai
    {
        public static void main(String args[])
        {
    
    
            Book b=new Mc(); // also you can define it as Mc b=new Mc(); but its advised to define object as generalize as possible.(another whole topic )
    
            b.Setdata("Java","Robert");
            b.price(300);
            b.price(400);
            b.Display();
        }
    }
    

    它会给你想要的输出。

    【讨论】:

    • 任务是使用层次继承,其中两个类扩展同一个Book类。
    【解决方案3】:

    Oxford o=new Oxford(); //implicitly create one book object Mc m=new Mc(); //implicitly create anoter book object Book b=new Book(); //explicitly creating book object

    如果您仔细观察,您会看到内存中存在 3 个 Book 对象(1 个是您显式创建的,其余 2 个是根据继承自动创建的) 所以设置

    o.price(300); //setting the property of first implicit book object 
    m.price(400); // setting the property of second implicit book object
    

    不会影响您创建的显式对象。

    因此,为了获得所需的结果,您最好使用组合而不是继承。 坦率地说,在这里使用继承来获得所需的输出并不是一个理想的问题,您可以简单地使用单个类

        class Book {
        int op,mp;
        String name,auther;
        void Setdata(String n,String au)
        {
            name=n;
            auther=au;
    
        }
        void Display()
        {
            System.out.println("Name:"+name);
            System.out.println("Auther:"+auther);
            System.out.println("Ocford price: "+op);
            System.out.println("MC price: "+mp);
        }
    
        void setMp(int p)
        {
            mp=p;
        }
    
        void setOp(int p)
        {
            op=p;
        }
    
       }
    
       public class Sai
       {
         public static void main(String args[])
         {
            Book b=new Book();
    
            b.Setdata("Java","Robert");
            b.setOp(300);
            b.setMp(400);
            b.Display();
        }
       }
    

    【讨论】:

    • 任务是使用层次继承,其中两个类扩展同一个Book类
    • 那么你能说明问题吗?是否可以只使用一个等级的价格而不是不同的价格等级。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2018-11-06
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    相关资源
    最近更新 更多