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);
}
不知道理解的对不对,欢迎交流指正。