JAVA面向对象之代码块与继承
代码块分类
局部代码块
作用:限制变量生命周期
书写位置:在方法中
构造代码块
开发中很少使用
书写位置:类中 方法外
调用时机:如果你有构造代码块 系统会帮你调用 帮你在创建对象时调用
静态代码块(一定是被static修饰)
依赖类 随着类的加载而加载
注意:只加载一次(系统只创建一次 不管你调用多少对象)
应用场景:U盘装载驱动程序(第二次插入U盘,不会再加载驱动程序)
加载驱动(数据库驱动 JDBC)
同步代码块(多线程)
这里暂时不做介绍 后续给予说明
代码示例
public class Demo24 {
{
int a = 10;
System.out.println(a);
System.out.println("我是Demo24构造代码块");
}
public static void main(String[] args){
Person2 person = new Person2();
person.name = "张三";
person.age = 15;
person.sayHi();
System.out.println("我是main函数中得普通方法");
{
System.out.println("我是局部代码块");
}
Person2 person1 = new Person2("李四",22);
}
}
class Person2{
String name;
int age;
static {
System.out.println("我是person类的静态代码块");
}
{
sleep();
System.out.println("我是构造代码块");
}
public Person2(){
System.out.println("我是无参数的构造方法");
}
public Person2(String name, int age){
this.name = name;
this.age = age;
System.out.println("我是有参数的构造方法");
}
public String getName(){
return name;
}
public void setName(){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public void sayHi(){
System.out.println("姓名:" + name + "年龄:" + age);
}
public void sleep(){
System.out.println("睡觉");
}
}
运行结果
我是person类的静态代码块
睡觉
我是构造代码块
我是无参数的构造方法
姓名:张三年龄:15
我是main函数中得普通方法
我是局部代码块
睡觉
我是构造代码块
我是有参数的构造方法
姓名:李四年龄:22
解释
当程序运行时 会先加载Demo01.class文件,进入.class文件后,会寻找静态代码块,如果没有,会继续寻找构造代码块,由于没有
Demo24类的实例对象,所有构造代码块与构造方法均不会执行,如果另外新建一个类,Demo25,在Demo25类中建立Demo24类的实例
对象,Demo24类中的构造代码块与构造方法便会执行,之后会首先寻找main函数,找到main函数后,(局部代码块定义在方法中,在该
方法中并没有优先级)会首先遇到Person2类,遇到Person2 person = new Person2();这时会加载Person2类,
加载Person2.class文件,静态代码块与静态方法和静态属性一样,会随着类的加载而加载,存放在方法区的静态区,与对象无关,所
以在加载Person2.class文件时,会将static代码块一同加载,所有会输出'我是Person类的静态代码块',之后需要new一个对象,
继续执行Person2类中的代码,执行时,会先寻找有没有构造代码块(构造代码块存放在类中方法外,优先级高于构造方法);发现有构
造代码块,即先执行构造代码块,构造代码块中有sleep方法,故先执行sleep方法,打印'睡觉',之后执行下一句,打印'我是构造代码
块',构造代码块执行之后,会执行相应的构造方法(有参或者无参),构造代码块优先于构造方法执行,与构造代码块的位置无关,new
对象的时候没有传递参数,所有这里调用无参构造方法,打印'我是无参数的构造方法',之后回到Demo01函数,对对象中的变量进行赋
值,赋完值后,调用对象的sayHi方法,打印