我是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.myInt
与super.myInt
之间会有所不同,因为每个类都有自己的myInt
(B可以访问这两个类)。
所以,我的问题是:如果我不覆盖myInt
,哪种格式更可取,this.myInt
或super.myInt
?
答案 0 :(得分:2)
当需要指定您使用/引用的范围时,您只需要使用this
或super
。在您的情况下,我宁愿省略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
}
}
方法。要回答你的问题,只能覆盖方法,成员变量不能。