this : 当前运行类的实例对象
super: 父类的运行对象
依据:
所以p所代表的是函数被复写后(多态的意义)的一个Parents类,
而Parents类原来有的成员变量(不是成员函数不可能被复写)没有任何变化--------获得结论:A:成员变量:编译和运行都看Parents。
但是p的Parents类函数被复写了。--------------获得结论:B:非静态方法:编译看Parents,运行看Son
对于静态方法:编译和运行都看Parents!!
例如:定义两个类,一个是父类(parents),一个子类(Son),子类继承父类
情况一:
父类:
package thiscase;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Parents {
public void init() {
// TODO Auto-generated method stub
System.out.print("1 init--parents");
}
public void demo(){
System.out.print("2 demo parents");
}
}
子类
package thiscase;
public class Son extends Parents {
public void init(){
System.out.print("3 init---son");
}
public void demo(){
System.out.print("4 demo son");
}
public static void main(String[] args){
Son son = new Son();
son.init();
}
}
当前运行结果: 3 init---son
解释:Son.init()-->直接调用子类函数, 输出结果。
情况二:
父类:不变
package thiscase;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Parents {
public void init() {
// TODO Auto-generated method stub
System.out.print("1 init--parents");
}
public void demo(){
System.out.print("2 demo parents");
}
}
子类 : 加上super. init();
package thiscase;
public class Son extends Parents {
public void init(){
super.init();
System.out.print("3 init---son");
}
public void demo(){
System.out.print("4 demo son");
}
public static void main(String[] args){
Son son = new Son();
son.init();
}
}
当前运行结果: 1 init ---parents 3 init---son
解释:Son.init()-->直接调用子类函数, super.init() + 3
super.init()----> 输出 1 ====>结果为1, 3
情况三:
父类:加上this.demo();
package thiscase;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Parents {
public void init() {
// TODO Auto-generated method stub
System.out.print("1 init--parents");
this.demo();
}
public void demo(){
System.out.print("2 demo parents");
}
}
子类 : 同情况2
package thiscase;
public class Son extends Parents {
public void init(){
super.init();
System.out.print("3 init---son");
}
public void demo(){
System.out.print("4 demo son");
}
public static void main(String[] args){
Son son = new Son();
son.init();
}
}
当前运行结果:1 init ---parents 4 demo son 3 init---son
解释:Son.init()-->直接调用子类函数,super.init() + 3
* super.init()----> 输出 1 + this.demo()
* * this. demo() :demo为成员函数,Son类继承了Parents的方法,并且复写了demo方法, 此时的this为Son, 结果为Son.demo()---->4
结果为 1 4 3
情况四:
父类:同情况三
package thiscase;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Parents {
public void init() {
// TODO Auto-generated method stub
System.out.print("1 init--parents");
this.demo();
}
public void demo(){
System.out.print("2 demo parents");
}
}
子类 :加上this. demo();
package thiscase;
public class Son extends Parents {
public void init(){
super.init();
System.out.print("3 init---son");
this.demo();
}
public void demo(){
System.out.print("4 demo son");
}
public static void main(String[] args){
Son son = new Son();
son.init();
}
}
当前运行结果: 1 init ---parents 4 demo son 3 init---son 4 demo son
解释:Son.init()-->直接调用子类函数,super.init() + 3+ this.demo
* super.init()----> 输出 1 + this.demo()
* * this. demo() :demo为成员函数,Son类继承了Parents的方法,并且复写了demo方法, 此时的this为Son, 结果为Son.demo()---->4
结果为 1 4 3 4
特殊情况:
父类:
public class Parents {
public String name="Tom";
public void init(){
System.out.print(this.name);
}
}
子类
package thiscase;
public class Son extends Parents {
public String name="Jack";
public void init(){
super.init();
System.out.print(this.name);
}
public static void main(String[] args){
Son son = new Son();
son.init();
}
}
解释:
son. init ()-->调用Son.Init()方法-->super. init() + this. name
* super.init ()---->调用parents的init方法---> this. name. 由于name为成员变量,所以直接得到父类成员变量的值, this=Patents ---->结果为Tom
* this. name: 此时的this为son ,输出结果为 Jack