如果创建子类对象时所调用的构造函数并没有用到父尖里的字段或属性,还会先调用父类的构造函数吗?
------解决思路----------------------
会调用父类的构造
------解决思路----------------------
不显示指定的话会调用父类空构造函数,除非父类没有空的构造函数,这时候编译会失败
------解决思路----------------------
会调用父类的
------解决思路----------------------
构造函数它与面向对象技术无关。构造函数的调用序列是一种“规矩、规则”,你应该在面向对象的机制“之外”去理解它,它属于底层实现。而既然是底层实现,那么其实不同编程语言、不同支持系统,对面向对象的原则的实现方法都可以是不同的。
------解决思路----------------------
正解
在内存中 要构造一个子类必须先构造出父类来
------解决思路----------------------
默认就是先执行父类构造函数,再执行子类构造函数,不管子类构造函数是否用到父类的字段和属性。
------解决思路----------------------
2 楼 正解
会的
------解决思路----------------------
在创建一个子类对象时,是不会去创建什么父类对象实例的。因此如果你调试,就会发现,在这个“父类”构造函数中打印出来的this其实是子类实例。例如代码
public class A
{
public A()
{
Console.WriteLine("hashcode={0}, type={1}", this.GetHashCode(), this.GetType().FullName);
}
}
public class B : A
{
}
和
var x = new B();
Console.WriteLine("hashcode={0}, type={1}", x.GetHashCode(), x.GetType().FullName);
所打印出来的。
你所谓的“并没有用到父尖里的字段或属性”的说法,可能就是没有搞明白这个 this 到底是什么?!父类中的字段或属性,以及父类的构造函数,都是子类对象实例(此时的 this)自身的一部分,不是什么父类对象实例中的。并不是因为什么“子类对象内部住着一个单独的父类对象,需要调用这个对象的字段和属性,所以才调用了父类的构造函数”,并不是的!一个完全错误的假设有时候也可能得到一个貌似“像的”结果,但是危害早晚会显露出来的。
父类中定一个字段和属性被直接继承到子类中,那么子类也需要调用父类的构造函数为这些字段和属性进行初始化。为了在子类对象中实现这种“父类里的字段和属性”的一致性,那么底层的机制就必须保证调用父类的构造方法。因此在构造函数调用方面,不是重写概念,它不遵守面向对象的方法重写规则。否则,.net 也就不能实现面向对象的结果了。