目录
一、代码块
1.静态代码块
2.构造代码块/实例代码块
3.总结
代码块执行的顺序:
1.静态代码块
2.构造代码块(实例代码块)
3.执行对应的构造方法
其中:静态的只执行一次
二、 对象的打印
有一个快速打印的方法:重写toString
一、代码块
使用 {} 定义的一段代码称为代码块 。根据代码块定义的位置以及关键字,又可分为以下四种:1.普通代码块:就是定义在方法中的代码块2.构造代码块(实例代码块)3.静态代码块4.同步代码块(后续讲解多线程部分再谈)
class Student{
public String name ;
public int age ;
//静态成员变量:所有对象共有的
public static String classRoom = "110class";
//带参数的构造方法
public Student(String name,int age){
this.name = name;
this.age = age;
System.out.println("带参数的构造方法Student(String,int)");
}
/**
* 静态代码块:
* 一般用来初始化静态成员
* 类加载的时候就被调用
*/
static {
classRoom = "bit";
System.out.println("静态代码块!!");
}
/**
* 构造代码块/实例代码块
*/
{
System.out.println("构造代码块/实例代码块");
}
public void eat() {
System.out.println(this.name+"吃饭!");
}
public void show(){
//this.eat();//可以在成员方法里,调用另一个成员方法
System.out.println("姓名:"+this.name+" 年龄:"+this.age);
}
}
public class Test {
public static void main(String[] args) {
System.out.println(Student.classRoom);
}
}
1.静态代码块
static{
}
打印出来了,证明静态代码块被执行了
2.构造代码块/实例代码块
{
}
实例代码块需要实例化对象以后才会执行
没有打印出构造代码块,说明 构造代码块没有被执行
是因为,实例代码块需要实例化对象以后才会执行
此时我只运行了一条实例化对象的student1这个语句,可我们发现 静态代码块被执行了,构造代码块(实例代码块)被执行了,构造方法也被执行了。
尽管我换了这几个代码的顺序,依然得到如下结果。
3.总结
代码块执行的顺序:
1.静态代码块
2.构造代码块(实例代码块)
3.执行对应的构造方法
其中:静态的只执行一次
再实例化一个对象student2
发现第二次实例化对象的时候,没有 执行静态代码块了
当有多个静态块时,可以看作一个大的静态块,按从上到下的顺序依次执行
二、 对象的打印
以往打印对象的属性,要写一个show方法
有一个快速打印的方法:重写toString
sout (对象),原本打印的是对象student1的地址
打开源码发现,sout底层调用的是 toString这个方法
自己写一个toString方法,按照自己想要的格式输出返回
这样原本打印的student1对象的地址,就可以打印出对象的属性信息了
假如我就喜欢上面show方法的格式,我自定义toString修改之后,同样可以达到一样的效果
(这个其实就是重写)