您的位置:首页 > 编程语言 > Java开发

java super关键字理解

2011-10-31 10:12 267 查看
例子:

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);

}

不知道理解的对不对,欢迎交流指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: