为什么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
打印预期输出的解决方案是什么。这是因为您正在打印对象
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();
}
}