Java中继承关系的理解

来源:百度知道 编辑:UC知道 时间:2024/09/24 06:19:47
因为Java基础很薄弱,想问一个关于继承的例子。
class P
{
private int val = 10;
public void output()
{
System.out.println("P.output(),val+"+val);
}
public P()
{
System.out.println("P constructor");
output();
}
}

public class A extends P
{
private int val = 1;
public void output()
{
System.out.println("A.output(),val="+val);
}
public A(int val)
{
this.val = val;
System.out.println("A constructor");
}
public static void main(String[] args)
{
A a = new A(5);
}
}

为什么运行结果如下:

P constructor
A.output(),val=0
A constructor
为什么A.output(),val=0中val的值不是1或5,而是0呢?我不明这个地方是怎么回事。

很简单 流程问题
创造子类对象时候 先调用父类无参构造方法
所以先运行
public P()
{
System.out.println("P constructor");
output();
}
然后调用output();
public void output()
{
System.out.println("P.output(),val+"+val);
}
这里是重点 因为子类存在private int val = 1; 覆盖了private int val = 10; 但是这个时候并没有读到private int val = 1所以是默认值0
最后调用
public A(int val)
{
this.val = val;
System.out.println("A constructor");
}
所以就是
P constructor
A.output(),val=0
A constructor

继承关系
1、超类和子类的基本概念
2、子类不能继承父类的构造方法。
关于构造方法
执行子类的构造方法的时候,第一步该构造方法要先调用一遍父类的无参数的构造方法。
但是如果子类里面没有任何构造方法,则调用父类的无参构造方法。
可以看相关演示程序1。

演示程序2 是一个App.java不能编译的程序。根据编译时候报的错误,我们可以证明构造方法不能继承。

演示程序3 说明如果子类里面没有任何构造方法,则调用父类的无参构造方法。
覆盖
如果子类中定义的方法跟超类相同,那么,子类的方法将覆盖父类的方法。
覆盖的原则
1、方法名和参数的次序应该同超类方法中的完全相同;
2、两个方法的返回类型必须相同;
3、覆盖方法不能比被其覆盖的超类中的方法访问性差。
例如超类中被