为什么“int”不会在java中继承?

时间:2017-09-27 17:02:52

标签: java inheritance

class Number {
    int mark;
}

class One extends Number {
    mark = 1; //error: variable mark not initiated.
}

这是因为我必须在方法中使用它:

int getMark( Number n) {
return n.Mark; 
//returns 1 if Object passed is of "One" class
}

那么为什么第一个代码的第5行显示错误。

编辑:错字,只是“数字”。

1 个答案:

答案 0 :(得分:3)

子类中的初始化代码需要在构造函数,方法或初始化程序块中发生。像这样的东西(使用构造函数):

class One extends Number {
    public One() {
        mark = 1;
    }
}

或像这样(使用初始化程序块):

class One extends Number {
    {
        mark = 1;
    }
}

有关详细信息,请参阅Java教程主题Initializing Fields。 (顺便说一下,Number是一个可怕的类名,因为它与java.lang中的每个Java程序隐式导入的类名冲突。)

然而,将mark的初始化放在Number的代码中会更好,因为将字段的管理保持在与其相同的类中是一种很好的编程习惯。被宣布。这可以通过为Number

定义适当的构造函数来完成
class Number {
    int mark;

    /** Explicit initialization constructor */
    Number(int mark) {
        this.mark = mark;
    }

    /** Default constructor (perhaps not needed?) */
    Number() {
        // assign default value to mark (if 0 is not a good default)
    }
}

class One extends Number {
    One() {
        super(1); // calls the explicit initialization constructor
    }
}

最后,您还应该考虑哪些访问说明符(publicprotectedprivate)是合适的。

至于引用方法getMark中的变量,问题是markMark不同。在变量名称方面,Java区分大小写。重写方法以正确引用变量:

int getMark( Number n) {
    return n.mark; 
    //returns 1 if Object passed is of "One" class
}

我还建议将getMark()作为Number类的方法,而不是外部方法。然后,您可以使用n.getMark()代替getMark(n)来获取mark的当前值。然后,您可以将mark声明为private(也可能是final),因为encapsulationimmutability在OOP中始终是好事。