在调用super方法时,我指的是什么?

时间:2015-12-30 01:44:36

标签: java superclass super

我正在努力学习var AccountMainMenu = React.createClass({ getInitialState: function() { return { focused: 0 }; }, clicked: function(index) { this.setState({ focused: index }); }, render: function() { var self = this; var accountMenuData = [ { name: "My Account", icon: "icon-account" }, { name: "Messages", icon: "icon-message" }, { name: "Settings", icon: "icon-settings" } /*{ name:"Help &amp; Support &nbsp; <span class='font-awesome icon-support'></span>(888) 664.6261", listClass:"no-mobile last help-support last" }*/ ]; return ( <div className="acc-header-wrapper clearfix"> <ul className="acc-btns-container"> {accountMenuData.map(function(data, index) { var activeClass = ""; if (self.state.focused == index) { activeClass = "active"; } return ( <li key={index} className={activeClass} onClick={self.clicked.bind(self, index)} > <a href="#" className={data.icon}> {data.name} </a> </li> ); })} </ul> </div> ); } }); ReactDOM.render(<AccountMainMenu />, document.getElementById("app-container")); 的概念。有人可以告诉我super中的i是指什么?

它是super(i)类中的私有int变量i吗?它是NaturalNumber中的参数吗?它是指其他东西吗?我对语法很困惑。

NaturalNumber?

6 个答案:

答案 0 :(得分:3)

在您的示例中,它是EvenNumber的构造函数参数。调用super(i)将构造函数参数传递给超类构造函数(按值,因为它是一个原语)。然后,超类构造函数将该值存储在私有字段中。

答案 1 :(得分:2)

super(arguemnts)调用您传递给arguments的超类构造函数 在class EvenNumber extends NaturalNumber的情况下,它是确保您的类的NaturalNumber ness 的机制。

在这种情况下,您要通过super传递给EvenNumber类构造函数传递给public EvenNumber(int i)类的相同值。因此,它会初始化private int i字段(由于它是私有的,您无法直接访问EvenNumber。)

如果我们稍微重命名变量,也许你会更好地看到它:

class NaturalNumber {

    private int value;

    public NaturalNumber(int naturalValue) {
        this.value = naturalValue;
    }
    // ...
}

class EvenNumber extends NaturalNumber {

    public EvenNumber(int oddValue) {
        super(oddValue);
    }
    // ...
}

因此,当您通过EvenNumber创建new EvenNumber(2)的实例时,EvenNumber(int oddValue)构造函数中发生的第一件事就是super(2),它将调用NaturalNumber(int naturalValue)构造函数并传递{{ 1}}到它,最后将2设置为int value

答案 2 :(得分:1)

当你调用super(i)时,它会调用超类的构造函数。 super关键字指的是超类(父类)。在这种情况下,EvenNumber的超类是NaturalNumber,因为偶数扩展 NaturalNumber。所以基本上,通过super(i)NaturalNumber(i)

答案 3 :(得分:1)

class NaturalNumber {

private int i;

public NaturalNumber(int x) { this.i = x; }
// ...
}

class EvenNumber extends NaturalNumber {

public EvenNumber(int y) { super(y); }
// ...
}

考虑上面的代码。此代码与您的代码完全相同。我更改了变量名称以使其清楚。所以,当你调用super(y)时,它所做的是调用它的父类的构造函数,即NaturalNumber(i),y的值传递给这个构造函数,并且在这个构造函数中你设置变量i的值等于传递给构造函数的值。

因此,当我们调用super(int)时,它所做的是将一个整数值传递给父类的构造函数。 另外,要设置父类的某个变量,我们可以super.i=10将父类中的变量“i”设置为10.

答案 4 :(得分:1)

i表达式中的super完全引用到i类内的局部变量NaturalNumber。除此之外,扩展其范围。

答案 5 :(得分:-1)

super()应该使用与超类的构造函数相同的参数进行调用,因为它完全相同。例如:

    class Person {
        private name;

        public Person(String name) {
            this.name = name;
        }

        public Person() { /* Empty constructors initialize with default values,
                              i.e in this case name is initialized with null*/
        }
    }

    class Employee extends Person {
        private double salary;

        public Employee(double salary) {
            super("Michael");
            this.salary = salary;
            /* That means that the emplyee which is created is a person
               who's name is "Michael"*/
        }

        public Employee(double salary) {
            super();
            this.salary = salary;
            /* That means that the emplyee which is created is a person
               who's name is null as the empty constructor initialized it*/
        }
    }

希望这会有所帮助。