关于JAVA的this和super

1 在生成子类对象的时候会生成一个隐式的父类对象(不管父类对象是抽象还是具体),这个对象是在虚拟机中生成的相当于不可见(如果不生成父类对象,不对父类进行初始化,之类就无法调用父类属性)。

2  this指代对当前对象的引用这个没有问题,但是super,很多人说不能把super当做父类对象的引用,但是本质上,this和super都是一样的,都是对象的引用。区别在于,super引用的父类对象是在java虚拟机中隐式生成的,所以又不能把super当做对象的引用。

3 生成子类对象,如果没有显式的使用super调用父类构造函数,虚拟机也会替你调用的,因为如果不调用,父类就无法初始化,子类就不能正常调用父类字段和方法。

4 生成子类对象,实际上进行了两次初始化,调用两次构造函数,第一次,调用父类构造函数初始化隐式的父类对象,第二次调用,调用父类构造函数初始化子类。

5 而在子类的普通方法中使用super,只是相当于把父类的方法调到子类中执行。

package Test3;

import org.omg.CORBA.PUBLIC_MEMBER;

class A{
	public A()
	{
		System.out.println(this.getClass().getName());
	}
	public String method(){
		return this.getClass().getName();
	}
}
public class B extends A{
	//生成B对象的时候,初始化B会调用A的构造函数来初始化B,同时也会生成隐式的A的对象,隐式的调用A的构造函数。
	
	public String method(){
		//把父类的方法调用到这里,不过是只在子类对象中执行,
		//而生成对象的时候构造函数会同时在父类和子类对象中执行,但是
		//父类中的构造函数的执行是不可见的
		System.out.println("我在这");
		return super.method();
		
	}
	public static void main(String args[]){
		B b=new B();//在生成子类对象的时候会生成隐式的父类对象,不可见。
		System.out.println(b.method());
		
		
	}
		
	}
执行结果:
Test3.B
我在这
Test3.B

以上理解如果有错误,请指出,谢谢了。

猜你喜欢

转载自icesnowwolf8.iteye.com/blog/2283265