一、代码块
类中可以声明的结构:属性、方法、构造器、代码块(或初始化块)、内部类。
1、代码块的作用:
用来初始化类或对象的的信息(即初始化类或对象的成员变量)
2、代码块的修饰:
只能使用static进行修饰
3、代码块的分类:
静态代码块:使用static修饰
非静态代码块:没有使用static进行修饰
1、具体使用:
静态代码块:
随着类的加载而执行;
由于类的加载只会执行一次,进而静态代码块也会执行一次;
作用:用来初始化类的信息;
内部可以声明变量、调用属性或方法、编写输出语句等操作;
静态代码块的执行要先于非静态;
如果声明多个静态代码块,则按照声明的先后顺序执行;
静态代码块内部只能调用静态的结构(即静态的属性和方法),不能调用非静态的结构(即非静态的属性和方法);
非静态代码块:
随着对象的创建而执行;
每创建当前类的一个实例,就会执行一次非静态代码块;
用来初始化对象的信息;
内部类可以声明变量、调用属性或者方法、编写输出语句等操作;
如果声明多个非静态代码块,则按照声明的先后顺序执行;
非静态代码块内部能调用静态的结构(即静态的属性和方法),也能调用非静态的结构(即非静态的属性和方法);
2、代码演练:
package com.block.exec;
public class User {
private String username;
private String password;
private long registrationTime;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public long getRegistrationTime() {
return registrationTime;
}
public User() {
System.out.println("新用户注册");
this.registrationTime = System.currentTimeMillis(); //获取系统当前时机
this.username = System.currentTimeMillis() + "";
this.password = "123456";
}
public User(String userName, String password) {
System.out.println("新用户注册");
this.registrationTime = System.currentTimeMillis(); //获取系统当前时机
this.username = userName;
this.password = password;
}
public String getInfo(){
return "用户名:"+this.username+","+"密码"+this.password;
}
}
package com.block.exec;
/**
* package:com.block.exec
*
* @Author jimmy-yan
* @Create 2024/10/27 21:54
*/
public class UserTest {
public static void main(String[] args) {
User u = new User();
System.out.println(u.getInfo());
User u1 = new User("kobe","123123");
System.out.println(u1.getInfo());
}
}
新用户注册
用户名:1730038197479,密码123456
新用户注册
用户名:kobe,密码123123
采用代码块实现
package com.block.exec;
/**
* package:com.block.exec
*
* @Author jimmy-yan
* @Create 2024/10/27 21:43
*/
public class User1 {
private String username;
private String password;
private long registrationTime;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public long getRegistrationTime() {
return registrationTime;
}
//todo 使用场景
{
System.out.println("新用户注册");
this.registrationTime = System.currentTimeMillis(); //获取系统当前时机
}
public User1() {
this.username = System.currentTimeMillis() + "";
this.password = "123456";
}
public User1(String userName, String password) {
this.username = userName;
this.password = password;
}
public String getInfo() {
return "用户名:" + this.username + "," + "密码" + this.password;
}
}
package com.block.exec;
/**
* package:com.block.exec
*
* @Author jimmy-yan
* @Create 2024/10/27 21:54
*/
public class User1Test {
public static void main(String[] args) {
User1 u = new User1();
System.out.println(u.getInfo());
User1 u1 = new User1("kobe","123123");
System.out.println(u1.getInfo());
}
}
二、属性的赋值过程
1、可以给类的非静态的属性(即实例变量)赋值的位置有:
a、默认初始化
b、显示初始化 或 d、代码块中初始化
c、构造器中初始化
e、有了对象以后,通过对象.属性或对象.方法进行赋值
2、执行的先后顺序:
a、b/d、c、e
3、给实例变量赋值的位置很多,开发中如何选择?
显示赋值:比较适合于每个对象的属性值都相同的场景
构造器中赋值:比较适合于每个对象的属性值都不同的场景
1、案例
最先加载object
由父及子,静态先行。
package com.block.exec;
/**
* package:com.block.exec
*
* @Author jimmy-yan
* @Create 2024/10/28 12:35
*/
//todo 最先加载object
// 由父及子,静态先行。
class Root {
static {
System.out.println("Root的静态初始化块");
}
{
System.out.println("Root的普通初始化块");
}
public Root() {
super();
System.out.println("Root的无参数构造器");
}
}
class Mid extends Root {
static {
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid() {
System.out.println("Mid的无参数构造器");
}
public Mid(String msg) {
//todo 通过this调用同一类中重载的构造器
this();
System.out.println("Mid的带参数构造器,其参数值:" + msg);
}
}
class Leaf extends Mid {
static {
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf() {
//todo 通过super调用父类中有一个字符串参数的构造器
super("sgg");
System.out.println("Leaf的构造器");
}
}
public class LeafTest {
public static void main(String[] args) {
new Leaf();
}
}
执行结果
Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数构造器
Mid的普通初始化块
Mid的无参数构造器
Mid的带参数构造器,其参数值:sgg
Leaf的普通初始化块
Leaf的构造器
Process finished with exit code 0