访问继承成员时“this”和“super”之间的差异

时间:2016-09-16 21:58:02

标签: java inheritance

我是java的新手。最近我看到了一些与此类似的代码:

class A {
    protected int myInt;

    public static void main(String[] args) {
        B b = new B();
        b.myFunction();
    }
}

class B extends A {
    public void myFunction() {
        this.myInt = 10;
    }
}

据我所知,在创建子类实例时,也会创建其父实例。可以从子类访问基类的所有受保护和公共成员。 如果我覆盖myInt,则this.myIntsuper.myInt之间会有所不同,因为每个类都有自己的myInt(B可以访问这两个类)。

所以,我的问题是:如果我不覆盖myInt,哪种格式更可取,this.myIntsuper.myInt

3 个答案:

答案 0 :(得分:2)

当需要指定您使用/引用的范围时,您只需要使用thissuper。在您的情况下,我宁愿省略this以简化可读性。

super用于表示父类的当前实例,而this用于表示当前类。如果某个变量或方法与宽范围内的变量或方法重叠(只有相同的名称),则只需要使用this或super。

例如。如果已定义与class属性同名的方法参数,则需要使用此参数指示您正在使用class属性而不是method参数。

public class A {

    public int myInt = 1;

    public static void main(String[] args) {
        B b = new B();
        b.myFunction(3);
    }
}

class B extends A {

    public int myInt = 2;

    public void myFunction(int myInt){

        System.out.println(myInt); // The parameter
        System.out.println(this.myInt); // myInt from the current class (B)
        System.out.println(super.myInt); // myInt from the parent class (A)
    }
}

此示例将打印:

3
2
1

如果你没有这种类型的碰撞,使用它是可选的:

public void myFunction2(){
    System.out.println(myInt);       // Both refers to the same 
    System.out.println(this.myInt);  // variable myInt from class B
}

答案 1 :(得分:1)

这是一个品味和项目的标准/指南比什么都重要。

就个人而言,我也不会使用它们,只会写public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }

答案 2 :(得分:0)

仅创建一个实例。如果实例化派生对象,则调用父构造函数,但只创建一个对象。此外,当在类中引用具有相同名称的不同变量时,更多地使用术语Activity.runOnUiThread(Runnable)。 例如一个简单的构造函数:

this

如果要显式使用超类中的值,请仅使用class SupClass{ public int a = 1; int incA(){ return ++a; } } class MyClass extends SupClass { public int a = 10; public int b = 20; MyClass() {}; MyClass(int a, int b){ this.a = a; this.b = b; } int incA(){ return ++a; } public static void main(String args[]) { SupClass d = new MyClass(); System.out.println(d.a); //1, members known of type SupClass at compile-time, System.out.println(d.incA()); //11, methods are virtual, decided at run-time } } 方法。要回答你的问题,只能覆盖方法,成员变量不能。