java语言中成员方法可以初始化成员变量吗?

2024-11-27 18:49:36
推荐回答(3个)
回答1:

不能

一、类的初始化
对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。
类的编译决定了类的初始化过程。
编译器生成的class文件主要对定义在源文件中的类进行了如下的更改:
1) 先按照静态成员变量的定义顺序在类内部声明成员变量。
2) 再按照原java类中对成员变量的初始化顺序进行初始化。
一个java类和编译后的class对应的转换如下:
源文件:

public class Person{
  public static String name="张三";
  public static int age;
  static{
age=20;
    System.out.println("初始化age");
  }
  public static String address;
  static{
    address="北京市";
    age=34;
  }
  public static void main(String[] args) {
System.out.println(name);
System.out.println(age);
System.out.println(address);
}
}

当java源代码转换成一个class文件后,其转换成类似下面的代码:

public class Person{
  public static String name;
  public static int age;
  public static String address;
  static{
    芦皮name="张三";
    age=20;
   陪行差 System.out.println("初始化age");
    address="北京市";
    age=34;
  }
  public static void main(String[] args) {
System.out.println(name);
System.out.println(age);
System.out.println(address);
}
}

初始化顺序依据转换后对应的class类成员变量的初始化顺序依次执行,所以所有的静态成员变量都是先声明,后执行赋值的,而且赋值的顺序也是依照源代码对静态成员变量初始化的顺序进行的,注意:定义一个成员变带燃量并直接初始化与在静态代码块中进行初始化是等价的,都是依据它们在源代码中定义的顺序进行的。

二、对象的生成
对于对象的生成其初始化过程与类的初始化过程类似,但会增加构造函数阶段,源代码如下:

1 public class Person{
2   {
3     name="李四";
4     age=56;
5     System.out.println("初始化age");
6     address="上海";
7   }
8   public String name="张三";
9   public int age=29;
10   public String address="北京市";
11   public Person(){
12     name="赵六";
13     age=23;
14     address="上海市";
15   }
16 }

编译器转换成class文件后,会转换成类似下面的代码:

1 public class Person{
2   public String name;
3   public int age;
4   public String address;
5   public Person(){
6     name="李四";
7     age=56;
8     System.out.println("初始化age");
9     address="上海";
10     name="张三";
11     age=29;
12     address="北京市";
13     name="赵六";
14     age=23;
15     address="上海市";
16   }
17 }

可以看到,对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。

回答2:

不是,那是赋值,初始化工作应该在构造函数里完成,为了程序安全都应该进行初始化,但我个人不是很理解程序安全是啥,我的理解是初始化是用来防止成员变量还简液侍没有赋值就被拦吵拿来运算等错误埋睁调用

回答3:

错误
java里面成员斗游念变量,凡是基本数据类型,int float, double之类的只要你定义了,默认都为0;
boolean类型默认为false,对象类型默认为null,

这个是在构造方法里面完成的初始化。初始化只有在虚拟机load这个class的时候完成,也就是只要你完成了new xxxx这个操作就完成了,后面的都是改变值

main里面空困调用setCredit(paramter)是重新赋值了已经。磨慧