为什么Java对象在Java继承中产生不同的输出?

为什么Java对象在Java继承中产生不同的输出?,java,object,inheritance,Java,Object,Inheritance,我的输出: 名称:爪哇 作者:罗伯特 牛津价格:0 Mc价格:0 预期输出: 名称:爪哇 作者:罗伯特 牛津价格:300 mc价格:400 为什么这两个类的对象 (牛津,Mc,按图书类别扩展) 无法为book的类变量赋值。 打印预期输出的解决方案是什么。这是因为您正在打印对象b中的字段,该对象的类型为Book。其他对象只是坐在那里初始化它们的字段,等待您对它们做些什么 您要拨打: class Book { int op,mp; String name,auther;

我的输出:

  • 名称:爪哇
  • 作者:罗伯特
  • 牛津价格:0
  • Mc价格:0
预期输出:

  • 名称:爪哇
  • 作者:罗伯特
  • 牛津价格:300
  • mc价格:400
为什么这两个类的对象 (牛津,Mc,按图书类别扩展) 无法为book的类变量赋值。
打印预期输出的解决方案是什么。

这是因为您正在打印对象
b
中的字段,该对象的类型为
Book
。其他对象只是坐在那里初始化它们的字段,等待您对它们做些什么

您要拨打:

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();
    }
}

super.op
不会做您期望它做的事情。您的字段不是静态的,因此更改一个实例中的值对其他实例没有影响。三个对象中的每一个都有一个独立的值
op

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

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

静态变量:-

它是类级变量,可访问相同或 继承类

非静态变量:-

它的作用域是对象级的。意味着每个对象都有自己的 变量比如有一个变量int a=10;然后每一个物体 有一份a。如果更改“in 1”对象的值,它将不会 更改另一个对象的值

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

o.Display();
m.Display();
它将为您提供所需的输出。

牛津o=新牛津()//隐式创建一个book对象 Mc m=新的Mc()//隐式创建另一个book对象 书b=新书()//显式创建图书对象

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

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();
    }
}
不会影响已创建的显式对象

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

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

为了使答案完美,a)告诉OP使用这样的字段是非常糟糕的做法,b)他应该遵循Java命名约定,比如在camelCase中使用方法名。@Ghost我不想与OP对立。你总是为所有未来的读者编写答案。告诉一个新手他代码中的所有问题,这怎么可能是一件坏事?回答错了。我想你没有明白这个问题。检查我最后一部分的答案。如果我错了,请说明。任务是在两个类扩展同一图书类的情况下使用层次继承。任务是在两个类扩展同一图书类的情况下使用层次继承。请说明问题陈述?是否可以只使用一个类别的价格,而不使用不同的价格类别。
    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();
    }
   }