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()吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值