Java 继承,每一步之后会发生什么
我有一个练习要解决,我有正确的答案,但我不能得到它。。。有人能帮我看看每一步之后发生了什么吗。这是练习。我们有两个类:在这里输入代码Java 继承,每一步之后会发生什么,java,inheritance,Java,Inheritance,我有一个练习要解决,我有正确的答案,但我不能得到它。。。有人能帮我看看每一步之后发生了什么吗。这是练习。我们有两个类:在这里输入代码 public class CA { protected String descricao; private float valor; public CA(String descricao, float valor) { this .descricao = descricao; thi
public class CA
{
protected String descricao;
private float valor;
public CA(String descricao, float valor)
{
this
.descricao = descricao;
this.valor = valor;
}
public String getDescricao()
{
return descricao;
}
public float getValor()
{
return valor;
}
public float teste(float a)
{
return soma(a);
}
public float soma(float a)
{
return valor + a;
}
}
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
第二点:
public class CB extends CA
{
private final int maxStock = 15;
private int stock;
public CB(String descricao, float valor)
{
super(descricao,valor);
stock = 0;
}
public int getStock()
{
return stock;
}
public void setStock(int actual)
{
stock = actual;
}
public int emFaltaStock()
{
return (maxStock-stock);
}
public float soma(float a)
{
return getValor() + a * 2;
}
public boolean noLimite(int minStock)
{
return ((minStock-stock) <= 0);
}
}
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
我知道会是14岁,但为什么?有人能告诉我吗?请试着理解流程
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
CB cb1 = new CB("cb1",10); // Object of CB has been created
CA ca1 = cb1; // Referencing CA instance to CB instance
float v1= ca1.soma(2); // Calling *soma* Method
由于soma是一个被重写的方法。。。即使使用
ca1.soma(2),也会调用CB方法代码>因为ca1实际上是指CB实例。方法调用依赖于实例而不是引用。它展示了我们所称的(多态性)。
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
在第一条语句中设置CB值(子类值)时。
在第2条语句中调用具有超类ca1 reference的子类实例。
在第3条语句中,当您使用超类ca1引用调用方法时,由于java中的多态性,将调用子类CB方法。因此,结果是14
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
我知道会是14岁,但为什么?有人能告诉我吗
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
为什么,因为这就是多态性的美
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
步骤1:CB cb1=新的CB(“cb1”,10)代码>
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
这里的值valor=10
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
第二步:ca1=cb1代码>
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
这里CA的reference
是CB的reference
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
第三步:float v1=ca1.soma(2)代码>
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
因此,当您调用soma
时,将调用CB
方法,并将值返回为14.0
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
检查:这是因为您创建了一个子类的对象,并将其分配给一个超类,如下所示:
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
Father obj = new Child();
如果您的声明与此完全相同:
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
OR
CA ca1 = new CB("cb1",10);
float v1= ca1.soma(2);
在父亲和孩子中有一种签名类似的方法,总是使用child方法~
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
这种技术在面向对象编程中非常有用,因为您可能有许多子类正在扩展父类,而这些子类中的每个子类都可能有一个使用不同算法的覆盖方法
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);
这种方法在面向对象编程中调用多态性 你期望的答案是什么?我已经写下来了,答案是14。你的意思是你得到的答案是14?这就是你所期望的?你想知道为什么答案是14?基本上,你已经创建了一个CB
。将其称为CA
不会将其更改为CA
。它仍然是一个CB
,当您使用soma
时,它使用CB
中定义的一个。
CB cb1 = new CB("cb1",10);
CA ca1 = cb1;
float v1= ca1.soma(2);