为什么这段代码会出错?

时间:2016-02-26 06:17:10

标签: java

我在AP计算机科学课上学习了继承,并对这个问题感到困惑:

查找以下代码生成的输出:

public class A {
    private int xx;

    public A() { 
        xx = 1;
    }

    public A(int x) { 
        xx = x;
    }

    public void addX(int x) {
        xx += x;
    }

    public void multX(int x) {
        xx *= x;
    }

    public int getXX() {
        return xx;
    }

    public String toString() {
        return ""+xx;
    }
}

public class B extends A {
    private int yy;

    public B(int y) { 
        yy = y;
    }

    public void addY(int y){
        yy += y;
    }

    public void multY(int y) {
        yy *= y;
    }

    public int getYY() {
        return yy;
    }    

    public void addBtoA(){
        addX(yy);
    }

    public String toString() {
        return ""+yy;
    }
}

客户代码:

A a = new A(14);
B b = new B(33);
b.addBtoA();
System.out.println( a.getYY() );

我不明白为什么会导致错误。请帮忙!

3 个答案:

答案 0 :(得分:1)

班级A没有方法getYY

这应该是

 System.out.println( b.getYY() );

答案 1 :(得分:1)

B扩展了A,因此B继承了A的所有方法(除非被覆盖),因此B个对象可以访问A方法,但反之则不然。 getYY()是为B个对象定义的方法,因此在尝试使用A个对象访问时会出错。

答案 2 :(得分:0)

a.getYY()错误因为如何在类A的引用上调用类B的公共方法

  

因为我得到了它的单一继承。 Java允许子类知道超类的所有公共属性。因此,您可以在B中调用A的所有公共方法和属性(例如b.addX(10))。但是反之亦然,这里不允许你从A的引用中调用B中的方法,因为你的案例a中的A类引用对B类没有任何了解。

     

如果那时你也想调用它,那么请参考InstanceOf操作符   here