java语言中成员方法可以初始化成员变量吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java语言中成员方法可以初始化成员变量吗?相关的知识,希望对你有一定的参考价值。
如题,我在这个代码中产生 了困惑,
private float credit;
。
。
。
。(中间省略代码)
。
。
public void setCredit(float credit)
this.credit=credit;
我并没有在构造方法中对“credit”进行初始化,只是在main函数中直接调用了setCredit(参数)这个成员方法,请问这是成员方法对成员变量的初始化吗?
一、类的初始化
对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。
类的编译决定了类的初始化过程。
编译器生成的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源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。 参考技术A 不是,那是赋值,初始化工作应该在构造函数里完成,为了程序安全都应该进行初始化,但我个人不是很理解程序安全是啥,我的理解是初始化是用来防止成员变量还没有赋值就被拿来运算等错误调用 参考技术B 错误
java里面成员变量,凡是基本数据类型,int float, double之类的只要你定义了,默认都为0;
boolean类型默认为false,对象类型默认为null,
这个是在构造方法里面完成的初始化。初始化只有在虚拟机load这个class的时候完成,也就是只要你完成了new xxxx这个操作就完成了,后面的都是改变值
main里面调用setCredit(paramter)是重新赋值了已经。追问
public Student(String name,int id,String speciality)
this.name=name;
this.id=id;
this.speciality=speciality;
这是我的构造方法,并没有credit的初始化,为什么呢?
credit这里构造的时候已经自动赋值0了,这个是JVM完成的,
本回答被提问者采纳Java中成员变量局部变量全局变量静态变量成员变量
开头注意:static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
根据定义变量位置的不同,可以将变量分为成员变量和局部变量。
成员变量是 定义在一个类的变量:类中方法外
局部变量是定义在一个方法内的变量:方法中
成员变量分为:
静态属性:随类的存在而存在,是在类加载的初始化
非静态属性:随实例的属性存在而存在。
局部变量:
局部变量不能加static,包括protected, private, public这些也不能加。局部变量保存在栈中。
局部编程必须在声明时初始化。
成员变量和局部变量区别:
成员变量可以不显式初始化,它们可以由系统设定默认值;局部变量没有默认值,所以必须设定初始赋值。
成员变量存在于堆内存,局部变量存在于栈内存。
静态变量:类中方法外,用static修饰
生命周期:JVM第一次读到这个类并加载类时开始,类销毁不存在。
类加载过程:
加载父类(如果父类已经加载过,则不在加载)。
初始化静态属性 。
按顺序的初始化静态代码块 初始化的前提就是分配空间 。
静态变量存在于方法区即静态区(方法区包含整个程序中唯一存在的元素)
全局变量(在java中可以理解为用static final修饰):在java中全局变量也称成员变量,是创建对象的时候分配内存的。全局常量存于全局数据区。
创建对象过程为:
分配空间。
创建父类对象。
初始化成员变量。
调用构造方法创建一个对象。
方法(包括静态方法)中不能有静态变量,方法中存在的是局部变量,而不是静态变量。静态变量是定义在类中,方法体外面的。
实例变量:定义在类中但在任何方法之外。
当一个对象被实例化之后,每个实例变量的值就跟着确定;
以上是关于java语言中成员方法可以初始化成员变量吗?的主要内容,如果未能解决你的问题,请参考以下文章
Java反射机制可以动态修改实例中final修饰的成员变量吗
Java Review (八面向对象----成员变量和局部变量)