Java的构造方法

   看下面的例子,觉得应该输出什么?

  

public class A {
	public A() {
//先把下面这句去掉
//System.out.println(this.getClass());
		set();
	}
	
	void set() {
		System.out.println("A");
	}
	
	static class B extends A {
		 B() {
			set();	
		 }
		 
		void set() {
			get();
		 	 System.out.println("B");
		 }
		void get(){
		}
	}
	
	public static void main(String[] args) {
		B b = new B();
	}
	
}

    当时,看到这个题目,犯了两个错误:

       1. 不知道new B() 的时候,如果没有指定父类的构造方法,就会默认的调用A(), 也就是super();

           new B的时候,必须B这个类加载到内存,可是B是继承自A的,也可以理解为依赖

          所以,当然首先得把A加载到内存!

       2. 知道会默认的调用父类的构造方法后,不确定调用的到底是哪个set()方法!

    其实 ,上面代码打印的应该是两个B,不会调用A中的set

    通过在A中的构造方法打印在调用set方法的对象时,注意不是A , 而是A$B

    所以,调用的是B中的set方法!

    可是,为什么会这样了?

      是不是可以这样理解,把B() 中的super()调用看成是"this.super()(实际上子类是不能访问父类的构造方法的,除了使用super)"

      super()和它里面的set()都是同一个级别的,也就是都是通过同一个this访问的

      这就好比调用B自己类中实现了的set() , 然后set()中又有一个新的方法 get() , 这个get()不就等同于super()中的set()吗?

猜你喜欢

转载自kainever7.iteye.com/blog/2211808