(请教)java实例化的时候为什么一定要调用父类的构造方法

时间:2021-07-27 19:52:08
java在new实例化的时候,为什么“一定”会要调用父类的构造方法,对父类实例化?
请高手注意:不是怎么调用,是为什么要调用。

21 个解决方案

#1


理解错了吧?new的时候是调用自己的构造方法啊 A a = new A();

#2


补充:在使用继承的时候

#3


你想吧,如果你定义了一个有参的构造函数 这时候就不会调用父类构造方法了,因为你有自己的特性了啊。如果你实例化的时候调用的是无参的构造方法当然会走父类的了,因为你没申明自己的特性

#4


引用 1 楼 jiaweime 的回复:
理解错了吧?new的时候是调用自己的构造方法啊 A a = new A();

同意

#5


楼主 在创建对象的时候如果父类中的数据需要初始化,那么就必须调用,如果父类中的数据不用初始化,也就不用显示的调用了
这个就相当于 你在子类中可以使用父类的变量 但是你在子类中初始化 你不感觉多此一举吗

#6


有父类就会有父类构造方法,这个是必然的。不然可能会出现空指针。
没父类继承时的就只要当前类的构造方法了。

#7


这个是和继承有关系。子类继承父类后。在内部的存储中。子类是没有父类已经定义的那部分。所以在进行new的时候子类只是new了自己的那部分。

#8


引用 3 楼 jiaweime 的回复:
你想吧,如果你定义了一个有参的构造函数 这时候就不会调用父类构造方法了,因为你有自己的特性了啊。如果你实例化的时候调用的是无参的构造方法当然会走父类的了,因为你没申明自己的特性

任何时候都会调用父类构造函数的吧?
分两种情况:
1.不显示调用父类构造函数,则默认调用父类的无参构造函数。如果父类声明了有参数的构造函数,而没写无参的构造函数,那么编译出错,提示父类没有默认构造函数
2.显示调用父类构造函数,这个简单,你知道父类的哪个构造函数就用这个构造函数初始化父类。

#9


儿子有了东西吃,要先给老子吃,这位老子有了东西,得先给这位老子的老子吃……

直到最初的上帝Object,他得到他儿子的东西,就自己吃了吧……

你要理解成“Java教育我们要讲孝心”也可以;但要理解成交税也行;甚至理解成小弟向大哥交保护费也可以……

呵呵~说笑了!

真实的原因是:实例化的本质,是调用构造函数分配实例标识, 申请内存存放实例中各成员变量的初始值。如果该类继承了某个父类,也就继承(相当于复制)了父类的所有非私有成员变量,而如果没有给继承过来的成员变量赋初值,那后续施加在该成员变量的操作如何进行?

#10


为什么要先调用父类的构造方法?
因为父类的定义的public和protected函数和变量都会自动被继承到子类中,如果父类不初始化,这些定义在父类的函数和变量怎么能在子类中使用?

其实,不仅先调用父类的构造方法,在调用父类的构造方法之前,还先初始化了父类的静态变量和静态块
完整的初始化顺序是:

父类静态变量
父类静态块

子类静态变量
子类静态块

父类非静态变量
父类非静态块

父类构造函数

子类非静态变量
子类非静态块

子类构造函数

#11


这是java对构造方法语法的规范

#12


引用楼主 daijuna00 的回复:
java在new实例化的时候,为什么“一定”会要调用父类的构造方法,对父类实例化?
请高手注意:不是怎么调用,是为什么要调用。

LZ,如果要你来实现继承,你会怎么考虑?
首先实例化就是给对象分配内存,构造方法就是分配内存的实现,那么,子类如何才能更方便的分配内存呢?很显然,就是调用父类构造方法来分配父类部分的内存,然后再调用自己的构造方法来分配子类扩展的内存。否则,如果子类完全从头开始自己分配内存,那么继承父类又有什么优点呢?因为子类的父类部分是完全和父类一样的,你觉得有必要再自己从头开始分配内存吗?既然父类的内存分配已经有现成的方法,为什么不直接调用来分配父类部分的内存呢?

#13


该回复于2011-11-30 13:03:57被版主删除

#14


呃。跟我刚才发的帖子一样。早看到这帖子就不发拉

#15


子类实例化的时候 ,如果不调用父类的构造方法,那么在父类中定义的属性 如何分配内存空间 ?

#16


假如父类在构造方法里初始化了一个数据库连接池,父类的一个public方法m1使用了这个连接池访问数据库

子类继承父类后,子类也有了m1这个方法,如果子类不覆盖m1,那么调用m1的时候就是调用父类的m1,如果new 子类的时候不调用父类的构造方法,调用m1岂不是出错了?!

#17


引用 9 楼 vincent_3951 的回复:
儿子有了东西吃,要先给老子吃,这位老子有了东西,得先给这位老子的老子吃……

直到最初的上帝Object,他得到他儿子的东西,就自己吃了吧……

你要理解成“Java教育我们要讲孝心”也可以;但要理解成交税也行;甚至理解成小弟向大哥交保护费也可以……

呵呵~说笑了!

真实的原因是:实例化的本质,是调用构造函数分配实例标识,申请内存存放实例中各成员变量的初始值。如果该类继承了某……


我和引用的观点相同。

#18


无论如何都会执行父类的构造方法,就算子类有一个带参数的构造方法也会默认执行父类的午餐构造方法。

#19


引用 12 楼 qybao 的回复:
引用楼主 daijuna00 的回复:
java在new实例化的时候,为什么“一定”会要调用父类的构造方法,对父类实例化?
请高手注意:不是怎么调用,是为什么要调用。

LZ,如果要你来实现继承,你会怎么考虑?
首先实例化就是给对象分配内存,构造方法就是分配内存的实现,那么,子类如何才能更方便的分配内存呢?很显然,就是调用父类构造方法来分配父类部分的内存,然后再调用自己的构造方法来分配……


这个说的很透彻啊。继承为了重用代码和数据结构;不调用的话,谈何重用呢?

#20


该回复于2011-12-01 10:20:53被版主删除

#21


引用 19 楼 jingluo 的回复:
引用 12 楼 qybao 的回复:

引用楼主 daijuna00 的回复:
java在new实例化的时候,为什么“一定”会要调用父类的构造方法,对父类实例化?
请高手注意:不是怎么调用,是为什么要调用。

LZ,如果要你来实现继承,你会怎么考虑?
首先实例化就是给对象分配内存,构造方法就是分配内存的实现,那么,子类如何才能更方便的分配内存呢?很显然,就是调用父类构造方法来分配父……


+1

子类实例隐含的包含一个父类实例,拥有一个指向父类实例的引用,当子类实例调用父类中的方法or变量,这个父类必须有一个实例,so在子类实例生成的时候,父类的实例也就生成了啊。

#1


理解错了吧?new的时候是调用自己的构造方法啊 A a = new A();

#2


补充:在使用继承的时候

#3


你想吧,如果你定义了一个有参的构造函数 这时候就不会调用父类构造方法了,因为你有自己的特性了啊。如果你实例化的时候调用的是无参的构造方法当然会走父类的了,因为你没申明自己的特性

#4


引用 1 楼 jiaweime 的回复:
理解错了吧?new的时候是调用自己的构造方法啊 A a = new A();

同意

#5


楼主 在创建对象的时候如果父类中的数据需要初始化,那么就必须调用,如果父类中的数据不用初始化,也就不用显示的调用了
这个就相当于 你在子类中可以使用父类的变量 但是你在子类中初始化 你不感觉多此一举吗

#6


有父类就会有父类构造方法,这个是必然的。不然可能会出现空指针。
没父类继承时的就只要当前类的构造方法了。

#7


这个是和继承有关系。子类继承父类后。在内部的存储中。子类是没有父类已经定义的那部分。所以在进行new的时候子类只是new了自己的那部分。

#8


引用 3 楼 jiaweime 的回复:
你想吧,如果你定义了一个有参的构造函数 这时候就不会调用父类构造方法了,因为你有自己的特性了啊。如果你实例化的时候调用的是无参的构造方法当然会走父类的了,因为你没申明自己的特性

任何时候都会调用父类构造函数的吧?
分两种情况:
1.不显示调用父类构造函数,则默认调用父类的无参构造函数。如果父类声明了有参数的构造函数,而没写无参的构造函数,那么编译出错,提示父类没有默认构造函数
2.显示调用父类构造函数,这个简单,你知道父类的哪个构造函数就用这个构造函数初始化父类。

#9


儿子有了东西吃,要先给老子吃,这位老子有了东西,得先给这位老子的老子吃……

直到最初的上帝Object,他得到他儿子的东西,就自己吃了吧……

你要理解成“Java教育我们要讲孝心”也可以;但要理解成交税也行;甚至理解成小弟向大哥交保护费也可以……

呵呵~说笑了!

真实的原因是:实例化的本质,是调用构造函数分配实例标识, 申请内存存放实例中各成员变量的初始值。如果该类继承了某个父类,也就继承(相当于复制)了父类的所有非私有成员变量,而如果没有给继承过来的成员变量赋初值,那后续施加在该成员变量的操作如何进行?

#10


为什么要先调用父类的构造方法?
因为父类的定义的public和protected函数和变量都会自动被继承到子类中,如果父类不初始化,这些定义在父类的函数和变量怎么能在子类中使用?

其实,不仅先调用父类的构造方法,在调用父类的构造方法之前,还先初始化了父类的静态变量和静态块
完整的初始化顺序是:

父类静态变量
父类静态块

子类静态变量
子类静态块

父类非静态变量
父类非静态块

父类构造函数

子类非静态变量
子类非静态块

子类构造函数

#11


这是java对构造方法语法的规范

#12


引用楼主 daijuna00 的回复:
java在new实例化的时候,为什么“一定”会要调用父类的构造方法,对父类实例化?
请高手注意:不是怎么调用,是为什么要调用。

LZ,如果要你来实现继承,你会怎么考虑?
首先实例化就是给对象分配内存,构造方法就是分配内存的实现,那么,子类如何才能更方便的分配内存呢?很显然,就是调用父类构造方法来分配父类部分的内存,然后再调用自己的构造方法来分配子类扩展的内存。否则,如果子类完全从头开始自己分配内存,那么继承父类又有什么优点呢?因为子类的父类部分是完全和父类一样的,你觉得有必要再自己从头开始分配内存吗?既然父类的内存分配已经有现成的方法,为什么不直接调用来分配父类部分的内存呢?

#13


该回复于2011-11-30 13:03:57被版主删除

#14


呃。跟我刚才发的帖子一样。早看到这帖子就不发拉

#15


子类实例化的时候 ,如果不调用父类的构造方法,那么在父类中定义的属性 如何分配内存空间 ?

#16


假如父类在构造方法里初始化了一个数据库连接池,父类的一个public方法m1使用了这个连接池访问数据库

子类继承父类后,子类也有了m1这个方法,如果子类不覆盖m1,那么调用m1的时候就是调用父类的m1,如果new 子类的时候不调用父类的构造方法,调用m1岂不是出错了?!

#17


引用 9 楼 vincent_3951 的回复:
儿子有了东西吃,要先给老子吃,这位老子有了东西,得先给这位老子的老子吃……

直到最初的上帝Object,他得到他儿子的东西,就自己吃了吧……

你要理解成“Java教育我们要讲孝心”也可以;但要理解成交税也行;甚至理解成小弟向大哥交保护费也可以……

呵呵~说笑了!

真实的原因是:实例化的本质,是调用构造函数分配实例标识,申请内存存放实例中各成员变量的初始值。如果该类继承了某……


我和引用的观点相同。

#18


无论如何都会执行父类的构造方法,就算子类有一个带参数的构造方法也会默认执行父类的午餐构造方法。

#19


引用 12 楼 qybao 的回复:
引用楼主 daijuna00 的回复:
java在new实例化的时候,为什么“一定”会要调用父类的构造方法,对父类实例化?
请高手注意:不是怎么调用,是为什么要调用。

LZ,如果要你来实现继承,你会怎么考虑?
首先实例化就是给对象分配内存,构造方法就是分配内存的实现,那么,子类如何才能更方便的分配内存呢?很显然,就是调用父类构造方法来分配父类部分的内存,然后再调用自己的构造方法来分配……


这个说的很透彻啊。继承为了重用代码和数据结构;不调用的话,谈何重用呢?

#20


该回复于2011-12-01 10:20:53被版主删除

#21


引用 19 楼 jingluo 的回复:
引用 12 楼 qybao 的回复:

引用楼主 daijuna00 的回复:
java在new实例化的时候,为什么“一定”会要调用父类的构造方法,对父类实例化?
请高手注意:不是怎么调用,是为什么要调用。

LZ,如果要你来实现继承,你会怎么考虑?
首先实例化就是给对象分配内存,构造方法就是分配内存的实现,那么,子类如何才能更方便的分配内存呢?很显然,就是调用父类构造方法来分配父……


+1

子类实例隐含的包含一个父类实例,拥有一个指向父类实例的引用,当子类实例调用父类中的方法or变量,这个父类必须有一个实例,so在子类实例生成的时候,父类的实例也就生成了啊。