为什么java构造函数的构造器只能在第一行写this() super()
2017-10-13 10:07
169 查看
首先得要明白super()和this()的意义:
this() 之所以存在, 我个人认为原因很简单, 就是为了代码的复用(纯粹的个人观点, 不知道是否正确)
super()之所以存在, 是有很重要的原因的! 因为子类与父类之间是继承关系, 而继承就意味着得到父类中所有的成员变量和方法. 既然能够得到父类的这些成员, 也就意味着子类可以访问父类的方法和成员变量(当然, 得到不意味着就可以任意使用, 使用的前提是必须是有相应的访问权限) , 如果子类在使用父类成员的时候, 父类内的成员变量没有得到正确的初始化, 那么就会发生意想不到的错误, 所以问题就出现在了这里, 如何保证父类成员是安全的呢? 这就得保证父类得到了正确的初始化, 而父类对象正确的初始化就离不开父类的构造函数,
super存在的意义也正是如此. 在子类的构造函数中,如果没有显式使用super() , 并且第一行没有使用this()调用子类的构造函数, 那么编译器就会自动在第一行补齐super()来调用父类的默认构造函数, 如果父类没有默认的构造函数就会报错.
为什么一定要在第一行?
super()在第一行的原因就是: 子类有可能访问了父类对象, 比如在构造函数中使用父类对象的成员函数和变量, 在成员初始化使用了父类, 在代码块中使用了父类等, 所以为保证在子类可以访问父类对象之前要完成对父类对象的初始化
this()在第一行的原因就是: 为保证父类对象初始化的唯一性. 我们假设一种情况, 类B是类A的子类, 如果this()可以在构造函数的任意行使用, 那么会出现什么情况呢? 首先程序运行到构造函数B()的第一行, 发现没有调用this()和super(), 就自动在第一行补齐了super() , 完成了对父类对象的初始化, 然后返回子类的构造函数继续执行, 当运行到构造函数B()的"this(2) ;"时, 调用B类对象的B(int) 构造函数, 在B(int)中, 还会对父类对象再次初始化! 这就造成了对资源的浪费,
当然也有可能造成某些意想不到的结果, 不管怎样, 总之是不合理的, 所以this() 不能出现在除第一行以外的其他行!
转载:http://www.cnblogs.com/iamzhoug37/p/4372934.html
this() 之所以存在, 我个人认为原因很简单, 就是为了代码的复用(纯粹的个人观点, 不知道是否正确)
super()之所以存在, 是有很重要的原因的! 因为子类与父类之间是继承关系, 而继承就意味着得到父类中所有的成员变量和方法. 既然能够得到父类的这些成员, 也就意味着子类可以访问父类的方法和成员变量(当然, 得到不意味着就可以任意使用, 使用的前提是必须是有相应的访问权限) , 如果子类在使用父类成员的时候, 父类内的成员变量没有得到正确的初始化, 那么就会发生意想不到的错误, 所以问题就出现在了这里, 如何保证父类成员是安全的呢? 这就得保证父类得到了正确的初始化, 而父类对象正确的初始化就离不开父类的构造函数,
super存在的意义也正是如此. 在子类的构造函数中,如果没有显式使用super() , 并且第一行没有使用this()调用子类的构造函数, 那么编译器就会自动在第一行补齐super()来调用父类的默认构造函数, 如果父类没有默认的构造函数就会报错.
为什么一定要在第一行?
super()在第一行的原因就是: 子类有可能访问了父类对象, 比如在构造函数中使用父类对象的成员函数和变量, 在成员初始化使用了父类, 在代码块中使用了父类等, 所以为保证在子类可以访问父类对象之前要完成对父类对象的初始化
this()在第一行的原因就是: 为保证父类对象初始化的唯一性. 我们假设一种情况, 类B是类A的子类, 如果this()可以在构造函数的任意行使用, 那么会出现什么情况呢? 首先程序运行到构造函数B()的第一行, 发现没有调用this()和super(), 就自动在第一行补齐了super() , 完成了对父类对象的初始化, 然后返回子类的构造函数继续执行, 当运行到构造函数B()的"this(2) ;"时, 调用B类对象的B(int) 构造函数, 在B(int)中, 还会对父类对象再次初始化! 这就造成了对资源的浪费,
当然也有可能造成某些意想不到的结果, 不管怎样, 总之是不合理的, 所以this() 不能出现在除第一行以外的其他行!
转载:http://www.cnblogs.com/iamzhoug37/p/4372934.html
相关文章推荐
- 为什么java构造函数的构造器只能在第一行写this() 或者super() ?
- 构造器中this 或者 super 为什么要放到第一行?
- 在构造器中为什么this或super必须放在第一行?
- 在构造器中为什么this或super必须放在第一行?
- 在构造器中为什么this或super必须放在第一行?
- 在构造器中为什么this或super必须放在第一行?
- this和super为什么必须在构造方法第一行
- 为什么java的构造方法中this()或者super()要放在第一行
- 为什么super(...)和this(...)只能在构造函数中的第一句出现?
- 为什么java的构造方法中this()或者super()要放在第一行
- 为什么静态成员、静态方法中不能用this和super关键字
- 黑马程序员------静态方法中为什么不能写this和super?这两者之间的区别是什么呢? Day02
- 为什么super()和this()调用语句不能同时在一个构造函数中出现的解释
- 为什么静态成员、静态方法中不能用this和super关键字
- this & super 在构造器中如何使用 解析 推理
- 关于this和super关键字为什么不能再static方法中或者静态代码块中
- 为什么静态成员、静态方法中不能用this和super关键字
- 8、java高级面向对象-重载、构造器重载、初始化块、this、super、对象构造和初始化分析、覆盖、toString
- java,this不能和super同时使用 并且放在第一行
- java中静态方法中为什么不能使用this、super和直接调用非静态方法