Почему Java Objects выдает разные выходные данные в наследовании Java? - PullRequest
0 голосов
/ 28 сентября 2019
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

Почему объекты двух классов (Оксфорд, Мак, который расширяется по классу книги) не могут присваивать значения переменным класса книги.Какое решение распечатать ожидаемый результат.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2019

Это не то, как работают объект и наследование.

Вам необходимо изучить статическую переменную и нестатическую переменную.

Статическая переменная: -

Это переменная уровня класса, доступная для всех объектов того же или унаследованного класса.

Нестатическая переменная: -

Это область действияэто уровень объекта.Означает, что каждый объект имеет свою собственную копию переменной.Например, если есть переменная int a = 10;тогда у каждого объекта есть 1 копия.Если вы измените значение объекта a in 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();
    }
}

Это даст вам желаемый результат.

0 голосов
/ 28 сентября 2019

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 объекта Книги (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();
    }
   }
0 голосов
/ 28 сентября 2019

Это потому, что вы печатаете поля в объекте b, который имеет тип Book.Другие объекты просто сидят там с инициализированными полями, ожидая, что вы что-то с ними сделаете.

Вы хотите позвонить:

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

super.op не выполняет то, что вы ожидаетеэто делать.Ваши поля не static, поэтому изменение значения в одном экземпляре не влияет на другие экземпляры.Каждый из ваших трех объектов имеет независимое значение op.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...