java中对c 成员变量初始化的初始化一定要用构造函数吗

Java运行时静态变量、非静态变量、构造方法初始化的顺序问题
注意:同一个类中静态变量值初始化一次即首次使用时初始化,之后每次创建对象不再初始化,而非静态变量的话每次创建都会开辟新的内存空间,在不同空间下再次初始化,首先是静态块先执行,静态方法,最后是构造函数
一:没有继承的情况
在我们用Java定义一个类时,如果没有显示的继承其他的类(默认的继承Object类这里不考虑),那么在类中定义的变量的初始化顺序是:静态变量、非静态变量、构造方法。
注意:这里初始化构造方法并不意味着执行方法,只有在创建子类时,使用构造方法,记住方法只有调用才会执行
class Car{
&&& Car(){
System.out.println("Constructor of Car!");
public class Initialization1 {
&&& private
static Car car = new Car();
&&& private int
i =demo();
&&& public
static int demo(){
&&&&&&&&&&&
System.out.println("Initialization of Integer i ");
&&&&&&&&&&&
Initialization1(){
System.out.println("Constructor of Initialization1 ");
&&& public
static void main(String[] args){
Initialization1 ini = new Initialization1();
Constructor of Car!&Initialization of Integer i
&Constructor of Initialization1
说明:在系统加载Initialization1.class 之后就会首先初始化static变量car,之后便会初始化非静态成员变量i,最后执行main()函数里面第一行对象初始化的语句即调用构造函数。
二有继承的情况下如何初始化
//注意:子类的构造方法第一句默认调用super(),即父类的无参数构造方法,也可以进行传参数调用父有
//参构造法方法super(参数);所以有继承的情况下创建对象后先初始化父类构造函数,在执行子类构造函数
定义一个类,它继承自别的类,那么相关成员的初始化顺序为:父类(基类)的静态方法/静态变量、子类的静态方法/静态变量、父类的非静态变量和构造方法、子类的非静态变量和构造方法。
(静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同)
!!!(注意这里静态方法虽然会初始化,可是并不意味着执行方法里面的代码)
class Car{
&&& Car(){
System.out.println("Constructor of Car!");
class Audi{
&&& private
static int j =genNum() ;
&&& public
static int genNum(){
System.out.println("Initialization of static Integer j ");
return 10;
&&& private Car
car = new Car();
&& Audi(){
System.out.println("Constructor of Audi!");
public class Initialization1 extends Audi {
&&& private char
c = demo2();
&&& private
static int i =demo1();
&&& public
static int demo1(){
&&&&&&&&&&&
System.out.println("Initialization of Integer i ");
&&&&&&&&&&&
&&& public
static char demo2(){
System.out.println("Initialization of Char c ");
return 'a';
Initialization1(){
System.out.println("Constructor of Initialization1 ");
&&& public
static void main(String[] args){
Initialization1 ini = new Initialization1();
Initialization of static Integer j
Initialization of static Integer i
Constructor of Car!
Constructor of Audi!
Initialization of Char c
Constructor of Initialization1
说明:如果存在多重继承关系的话,这时会依次递归一直找到最终的父类为止。
原文链接:/xiangang/p/5374155.html
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Java(23)
======= 子类 实例化的时候 默认调用父类为空的构造方法 即super();
&&&&&&&&&&&&&& 可以不写 但是当父类没有为空的构造方法的时候,就必须在子类中调用那个不为空的构造方法先实例父类 才能实例子类。为空的构造方法 默认存在 在子类中默认自动调用。
========父类引用指向子类对象的时候& 根据引用变量中 实例所属的类调用不同的类的方法,这种多态只适用于方法不适用与成员变量。
简单的理解为Java不支持属性字段覆盖(override),只支持方法覆盖 。
======实例化子类的时候,初始化了父类的构造函数,但未产生对象,因为父类有可能是接口,若父类有为空的构造方法则默认调用。因为子类必须持有父类的成员变量值,所以要初始化一下,且对于成员变量不能重写,重写也无多态效果。
&&&&&&&&&& Ctrl n new class的时候& 记得勾选 Constructors from& superclass& 最好默认都选上省事 这样就会默认都加上为空的构造方法。
&&&&&&&&&& 没有为空的构造方无法隐身初始化bean 反射需要为空的构造方法。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7998次
排名:千里之外
原创:38篇
(1)(2)(1)(2)(3)(3)(2)(2)(3)(6)(12)(6)Java类的成员变量,在声明的时候直接赋值与在构造函数中再赋值,这个是无所谓的,还是有什么最佳实践?
如:class A{
private int a=3;
....}或class A{
public A(){
该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
在声明的时候直接 private int a=3; 是初始化,即使这里没有自己初始化,系统也会自动给它一个初始值。而在构造函数中 a=3; 是赋值,在执行这条语句之前已经有过一次初始化了,就是在声明a的地方。所以如果只是想要初始化成员,那么最好在声明的时候就初始化,而不需要在构造函数中。
这得分情况了,如果成员变量的值需要其他结果或者方法返回值给它传递值的话,在声明时就不用赋值,如果一开始就需要个值的话,就在初始化时赋值。
如果只有一个构造函数, 那么问题不大, 但是有很多时候 类不止有一个构造函数的, 如果直接初始化值的话会每次构造的时候都要初始化一遍, 在构造函数中改了 又得赋值一遍哈, 所以如果确定只有一个构造函数就可以初始化, 否则就在构造函数中赋值吧,
建议复杂一点的初始化也放在构造函数中
一般来说,最好是在构造函数里面赋初值。原因如下:
1.如果你直接在变量声明的时候赋初值,而不在构造函数中初始化,那么该类的所有对象对于这个成员变量的值都是一样的,这样不符合面向对象的性质。如果确实所有的对象对于这个成员变量都是一样的话,就声明为static类型的吧。
2.如果你不仅在变量声明的时候赋初值,还在构造函数中初始化,那么你在声明的时候的初始化纯属多余了。而且这样代码也不容易维护,声明时的初始化会给维护代码的人员一种错觉,认为这个变量可能就是这个值了,但是实际上你又在构造函数中初始化了一遍,这样不提倡。
综上:除非是static成员变量,否则为了保持面向对象的性质和程序的易读性,不要在声明成员变量的时候初始化。
推荐的成员变量初始化方式:1.对于static静态成员变量,声明的时候初始化。2.对于不同对象初始值不同的非static成员变量,通过构造函数传参进行初始化。3.对于不同对象初始值相同的非static成员变量,单独写一个init()函数,在这个函数里面对这些成员变量进行统一初始化,然后在构造函数的最后调用这个init()函数。
1.在初始变量的时候赋值,那么这个赋值会被写入编译后文件的ESD段里面去,占用了程序的空间,一个变量的话可能无所谓,但是如果是一个很大的对象,而且这个对象又嵌套了很多数据呢,如果单个程序的话可能也无所谓,但是如果涉及到的是一个庞大的系统,这个类会被用到N次,那么就有所谓了,所以这要看具体情况。2.从代码可读性和安全的角度来说,如果必须用到这个变量且不能为空,那么最好直接赋一个默认初始值,如果不赋值,要确保你有相关的说明让别人知道使用这个类必须给这个变量赋值,又异或,你可以保证如果这个变量为空的时候程序可以捕获抛出这个异常,保证程序安全和良好的可读性
在构造函数中赋值是一种好习惯!其实变量在声明的时候就可以初始化,也就是赋一个初值,但是在定义的时候赋值针对的是类,如果特定的对象需要赋特定的值得话赋值语句就只能写到方法里面去,这显然有点不合适!所以在构造函数里进行全局变量的初始化,而且构造函数最好能够接受传入参数如果需要的话。
楼上的, 除了回答的编程风格的 答案外, 一律是不靠谱的.
问题里, 对jvm来说, 在哪里赋值都是一样的. 最终都是在初始化函数里赋值. 上字节码:
class Demo1{private int a=1;}class Demo2{
Demo2(){a=1;}}
字节码完全没有区别:
class Demo1 {
// Field descriptor #6 I
// Method descriptor #8 ()V
// Stack: 2, Locals: 1
aload_0 [this]
invokespecial java.lang.Object() [10]
aload_0 [this]
putfield Demo1.a : int [12]
returnclass Demo2 {
// Field descriptor #6 I
// Method descriptor #8 ()V
// Stack: 2, Locals: 1
aload_0 [this]
invokespecial java.lang.Object() [10]
aload_0 [this]
putfield Demo2.a : int [12]
不是您所需,查看更多相关问题与答案
德问是一个专业的编程问答社区,请
后再提交答案
关注该问题的人
共被浏览 (5455) 次}

我要回帖

更多关于 c类成员变量初始化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信