(一) 实例变量的初始化
Java语言能够保证所有的对象都被赋初值,实例变量的初始化方式有:
声明时初始化,使用初始化块,使用构造方法初始化
成员变量的默认值:
整型为 0 浮点型为 0.0 布尔类型为 false 字符型为 '\u000' 引用类型为 null
先看一个代码:
package demo;
public class Welcome{
public static void print() {
System.out.println("Hello world!");
}
//main方法
public static void main(String[] args)
{
Teacher tea = new Teacher();
System.out.println("age is " + tea.age);
System.out.println("salary is " + tea.salary);
System.out.println("reality is " + tea.reality);
System.out.println("str is " + tea.str);
System.out.println(tea);
}
}
class Teacher{
int age;
float salary;
boolean reality;
String str;
public static void print01() {
//当你没有给age01赋初值时,编译时会报错
//int age01;
//System.out.println("age01 is " + age01);
}
}
可以看看代码结果:
其中最后一个代表的是,对象的地址
现在我们来谈一谈上面的赋值方法:
就是通过一个默认的构造方法进行赋值,也就是说,当我们通过构造方法来创建一个对象时,构造方法会给类变量赋默认值,要注意的是,在类的方法里面的变量一定要赋初值,不然系统会报错。
当然,我们也可以在声明时赋初值
package demo;
public class Welcome{
public static void print() {
System.out.println("Hello world!");
}
//main方法
public static void main(String[] args)
{
Teacher tea = new Teacher();
System.out.println("age is " + tea.age);
System.out.println("salary is " + tea.salary);
System.out.println("reality is " + tea.reality);
System.out.println("name is " + tea.name);
}
}
class Teacher{
int age = 20;
float salary = 5000;
boolean reality = true;
String name = "huahua";
public static void print01() {
//当你没有给age01赋初值时,编译时会报错
//int age01;
//System.out.println("age01 is " + age01);
}
}
这样,我们在开始的时候就给变量赋初值,那么我们的输出就会按照我们的意愿进行输出
还介绍一种方法: 使用初始化块初始化
package demo;
public class Welcome{
public static void print() {
System.out.println("Hello world!");
}
//main方法
public static void main(String[] args)
{
Teacher tea = new Teacher();
System.out.println("age is " + tea.age);
System.out.println("salary is " + tea.salary);
System.out.println("reality is " + tea.reality);
System.out.println("name is " + tea.name);
}
}
class Teacher{
int age ;
float salary ;
boolean reality ;
String name ;
{
//这里是初始化块
age =20;
salary = 5000;
reality =true;
name = "lili";
}
}
注意,利用初始化块进行赋初值是在调用构造方法之前调用的
当然啦,除了以上几种方法,我们也可以通过构造方法进行赋值(区别于默认构造方法只能赋默认值),这时,我们就要用到this 关键字啦
package demo;
public class Welcome{
public static void print() {
System.out.println("Hello world!");
}
//main方法
public static void main(String[] args)
{
Teacher tea = new Teacher();
tea.detail(20, 5000, true, "LYLI");
System.out.println("age is " + tea.age);
System.out.println("salary is " + tea.salary);
System.out.println("reality is " + tea.reality);
System.out.println("name is " + tea.name);
}
}
class Teacher{
int age ;
float salary ;
boolean reality ;
String name ;
public void detail(int age ,float salary,boolean reality,String name) {
this.age = age;
this.name = name;
this.reality = reality ;
this.salary = salary;
}
}
应该注意的是:
初始化次序:如果类中既为实例变量指定了初值,又有初始化块,还在构造方法中初始化了变量,那么执行的前后顺序是上面捏?
先看代码:
package demo;
public class Welcome{
public static void print() {
System.out.println("Hello world!");
}
//main方法
public static void main(String[] args)
{
Teacher tea = new Teacher();
tea.detail();
}
}
class Teacher{
int age = 20;
//System.out.println("初始化中的 age is " + age );
{
age = 30;
System.out.println("初始化块的 age is " + age );
}
public void detail( ) {
age = 40;
System.out.println("构造方法中的 age is " + age);
}
}
有两个输出:
最后稍微总结一下:
1.首先使用默认值或者指定的初值进行初始化,这里先将age 赋值为20
2.接下来执行初始化块,重新将 age 赋值为 30
3.最后再进行构造方法的初始化,再将 age 赋值为 40
所以,在创建Teacher类的对象tea 后,age 就被赋值为 40
(二) 静态变量的初始化
静态变量的初始化与实例变量相似,静态变量如果在声明时没有指定初始值,那么系统就会赋默认值,其主要方法有声明时初始化,使用静态初始化块,使用构造方法初始化
注意:static 修饰的变量,不论创建多少对象( 甚至没有创建对象时)都只占用一份存储空间
class Teacher{
static int age = 20;
//静态初始化块中只能给静态变量赋值,不能使用实例变量
{
age = 30;
}
public void detail( ) {
age = 40;
}
}
当一个类有多种初始化方法时,
总的初始化顺序:
1.用默认值给静态变量赋值,然后执行静态初始化块为 static 变量赋值
2.用默认值给实例变量赋值,,然后执行初始化块为实例变量赋值
3.使用构造方法初始化静态变量或者实例变量赋值