Java面向对象编程高阶(二)

在这里插入图片描述


一、代码块

类中可以声明的结构:属性、方法、构造器、代码块(或初始化块)、内部类。

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

猜你喜欢

转载自blog.csdn.net/YZL40514131/article/details/143274869