super一般是super dd隐藏关的,什么情况下必须显现在第一行?

最近在看内部类, 但是被&为什么匿名内部类或者局部内部类使用方法的局部变量时, 局部变量一定得是final类型&困扰着, 在网上查找资料的时候, 发现我对类初始化完全不了解, 之前的认识都是错误! 所以回头又看了看基础的初始化, 在看初始化的时候, 就发现一点, 就是&为什么只能在构造器的第一行写this() 或者super()?& 我比较笨,又想了好久,上网查了下资料,看了看书才明白。
在说这个问题之前,首先得要明白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() 不能出现在除第一行以外的其他行!
当创建一个子类对象的时候, 该对象会包含一个父类的子对象, 不管你是否使用.
//thinking in java笔记,如果有不对的地方,还望指正^_^
阅读(...) 评论()看Head First Java 256页 ,书中提到“this()只能用在构造函数中,且它必须是第一行语句!”,不明白原因,查资料发现知乎已经有相关问题,搬运过来做个记录。
/question//
在构造函数中,如果你不指定构造器之间的调用关系,那么编译器会给你加上super();目的是在初始化当前对象时,先保证了父类对象先初始化。所以,你指定了构造函数间的调用,那么this()必须在第一行,以保证在执行任何动作前,对象已经完成了初始化。
构造函数只能被构造函数调用,因为对象只会初始化一次。
作者:吾名崔大帅
链接:/question//answer/
来源:知乎
解答这个问题,首先要明确一下构造方法和普通成员方法的区别。
类似this()和super()这样的方法被称为构造方法,顾名思义,他的作用就是在JVM堆中构建出一个指定类型的对象,如果你调用了两个这种形式的方法,岂不是代表着构建出了两个对象。
同理,为了避免构建出两个对象这种问题的出现,Java在编译时对这种情况做了强校验,用户不能再同一个方法内调用多次this()或super(),同时为了避免对对象本身进行操作时,对象本身还未构建成功(也就找不到对应对象),所以对this()或super()的调用只能在构造方法中的第一行实现,防止异常。
在普通的成员方法中,如果调用super()或者this(),你是想要重新创建一个对象吗?抱歉Java为了保证自身对象的合理性,不允许你做这样的操作。
作者:Kifile
链接:/question//answer/
来源:知乎
this()和super()为构造方法,作用是在JVM堆中构建出一个对象。因此避免多次创建对象,同一个方法内只能调用一次this()或super()。同时为了避免操作对象时对象还未构建成功,需要this()和super()的调用在第一行实现【以此来创建对象】,防止异常。
本文已收录于以下专栏:
相关文章推荐
java构造函数及this关键字、static用法
A(): b(this)
        通常this指针在对象构造完毕后才完全生成,而在构造函数执行过程中,对象还没有完全生成,所以this指针也是没有完全生成的,在构造函数中使用this指针会存...
1、容器的概念
在Java当中,如果有一个类专门用来存放其它类的对象,这个类就叫做容器,或者就叫做集合,集合就是将若干性质相同或相近的类对象组合在一起而形成的一个整体
2、容器与数组的关系
今天看书看到JAVA中This调用类的构造方法,书上写的不太明确,所以找了点资料补充了一下。
在一个Java类中,其方法可以分为成员方法和构造方法两种。构造方法是一个与类同名的方法, 在Java类...
黑马入学blog...
也算是学习笔记。
下面我们来看段代码:
“this属性” 这说法不知道对不对,这里也不用理它我们在一个java文件中,一般只用到了这个this.***来取得一个类属性;而对this()方法用的却很少用到,因为这个方法只能用在构造函数中。下面...
因为在构造的时候只需要调用父类的super()作为初始化父类一次,如果super(...)和this(...)同时出现的话,那么就会出现初始化父类两次的不安全操作,因为当super(...)和this...
JAVA中this的三种用法的详解
1.    
子类的构造函数如果要引用super的话,必须把super放在函数的首位.
   
     &#16...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)鍙?渶涓

我要回帖

更多关于 super retina显示技术 的文章

 

随机推荐