java super关键字理解

例子:

Person.java
------------------------------------------------------------------------------------------------
package com.android.xxx;

public abstract class Person {
protected String name;

public void setName(String na) {
name = na;
}

public abstract void display();
}

------------------------------------------------------------------------------------------------

Customer.java
------------------------------------------------------------------------------------------------
package com.android.xxx;

public class Customer extends Person {
private int testVar = 0;
public void display() {
System.out.println("Customer: " + super.name);
}
}
------------------------------------------------------------------------------------------------

VIP.java
------------------------------------------------------------------------------------------------
package com.android.xxx;

public class VIP extends Customer {
private String tel;

public VIP(String na, String t) {
super.setName(na);
tel = t;
}

public void display() {
super.display();
System.out.println("TEL: " + tel);
}
}
------------------------------------------------------------------------------------------------

JavaTest.java
------------------------------------------------------------------------------------------------
/**
 * 
 */
package com.android.xxx;

/**
 * @author xxxxxxxx
 *
 */
public class JavaTest {

/**
 * 
 */
public JavaTest() {
// TODO Auto-generated constructor stub
String name = "testname";
String tel = "1234567890";
VIP mVip = new VIP(name, tel);

mVip.display();
}

/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
JavaTest mJavaTest = new JavaTest();

System.out.print("+++++++++ 1");
System.out.println("+++++++++ 2");
System.out.println("+++++++++ 3");
System.out.print("=== END ===");
}
}

------------------------------------------------------------------------------------------------

输出结果:
Customer: testname
TEL: 1234567890
+++++++++ 1+++++++++ 2
+++++++++ 3
=== END ===



分析:
一切从内存的角度去考虑,上面的情况就非常好理解了。

从内存角度去考虑,当前只生成了两个对象mJavaTest 和mVip ,现在不考虑mJavaTest ,mVIP对应的内存引用处有:
protected String name;
private String tel;
public VIP(String na, String t)
public void setName(String na)  继承自父类
继承自父类的display()
和自已的display()

当生成JavaTest对象时,通过构造函数生成一个VIP对象,从而又调用VIP的构造函数。
前后就是先调用VIP的构造函数VIP(),再调用VIP的实例方法display()。
VIP()里面调用super.setName(na);,因为VIP子类没有重写父类的setName,所以这里用不用super都是调用继承自父类的setName,即将自已的name设为na(不是父类或父类的父类的name,因为此时内存只有VIP的对象实例),这里只是为了防止自已重写了父类的当前接口,造成自身的setName和父类的setName不同而加了super。其实用不用super效果一样,都是将对象mVip的保护成员name设为na.


display()调用super.display(),这里super必须要,因为本类重写了父类Customer的display(),父类的display里面打印super.name,相当于:
mVip自已的:
public void display() {
super.display();
System.out.println("TEL: " + tel);
}
变成下面的
public void display() {
System.out.println("Customer: " + super.name);    // ------>> 这里super.name即是mVip自身的name,继承自父类。VIP类并没有重定义name,故并没有隐藏掉继承自父类的name。这里用不用super效果一样都是指继承自父类的name。
System.out.println("TEL: " + tel);
}

不知道理解的对不对,欢迎交流指正。

posted on 2011-10-31 10:12  封起De日子  阅读(125)  评论(0编辑  收藏  举报

导航