【MMBBi的Java之路】类和对象的理解(四)——代码块和对象的打印。

文章介绍了Java编程中不同类型的代码块,包括普通代码块、构造代码块和静态代码块的使用和区别,以及如何通过重写toString方法自定义对象的打印内容。同时强调了静态代码块只执行一次的特性,并通过示例代码进行了详细解释。
摘要由CSDN通过智能技术生成

前言

本篇博客是我在学习Java中关于类和对象知识点的最后一篇,主要的知识点为代码块相关内容,此外会拓展一下关于打印对象的另外一种实现方法。
另外正常来说还有一个内部类的知识点,但这方面的知识点需要到抽象类和接口的章节才能理解,笔者目前还未到那个阶段。所以本篇只写代码块相关内容。

代码块

代码块概念以及分类

使用 {} 定义的一段代码称为代码块。
根据代码块定义的位置以及关键字,又可分为以下四种:
1.普通代码块
2.构造代码块
3.静态代码块
4.同步代码块(这里涉及到了多线程部分,本篇只了解前三种)

普通代码块

普通代码块就是定义在方法中的代码块

public class Main {
    public static void main(String[] args) {
        {
            //这里直接使用{}在main方法内部创建一个代码块
            int a = 10;
            System.out.println("a = "+a);
        }

        int a = 20;
        System.out.println("a = "+a);
    }
}

在这里插入图片描述
在这里插入图片描述
可以看到,代码块中的a,生命周期随着代码块执行完毕就结束了。
这种方法我们用的一般比较少。

构造代码块

构造代码块,也叫实例代码块,一般是用于初始化成员变量使用的

public class Student {

    private String name;
    private String sex;
    private int age;

    public Student() {
        System.out.println("不带参数的构造方法");
    }

    {
        this.name = "张三";
        this.sex = "男";
        this.age = 21;
        System.out.println("构造代码块被调用了");
    }

    public void show() {
        System.out.println("name: "+name+" age: "+age+" sex: "+sex);
    }
    
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.show();
    }   
}

在这里插入图片描述

通过上述代码可以看到,构造代码块可以用来初始化成员变量,而且会比构造方法先运行。
实例代码块只有在创建对象时才会执行

静态代码块

使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。

public class Student {

    private String name;
    private String sex;
    private int age;

    private static String classRoom;

    public Student() {
        System.out.println("不带参数的构造方法");
    }
    
    //构造代码块
    {
        this.name = "张三";
        this.sex = "男";
        this.age = 21;
        System.out.println("构造代码块被调用了");
    }

    //静态代码块
    static {
        classRoom = "404教室";
        System.out.println("静态代码块被调用了");
    }

    public void show() {
        System.out.println("name: "+name+" age: "+age+" sex: "+sex);
    }
    
    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println("=============================");
        Student s2 = new Student();
    }    
}

在这里插入图片描述
我们可以看到,这里创建了2个对象,但是静态代码只执行了一次。

静态代码块的特性:
1.静态代码块不管生成多少个对象,其只会执行一次
2.静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
3.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)

public class Test{
    static int cnt = 6;
    static{
        cnt += 9;
    }
    public static void main(String[] args){
        System.out.println("cnt = " + cnt);
    }
    static{
        cnt /=3;
    }
}

这里输出结果是5,就是先执行了第一个静态代码块,cnt的变成了15,再执行了第二个静态代码块,cnt变成了5.

【拓展】对象的打印

如果我们想要默认打印对象的属性该怎么做?

如果是按照如下方法打印

    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println(s1);
    }

在这里插入图片描述

这里可以看到输出结果是类名加一串字符。我们点进去一步一步看看System.out.println的原码

在这里插入图片描述
可以看到这里是调用了valueOf,再点进valueOf
在这里插入图片描述
如果是null返回null,如果不是,则返回toString,我们再点进toString
在这里插入图片描述
可以看到,toString的返回值。@前面是类名,后面是一串哈希值,我们暂且可以理解为是地址。
知道了这个实际上是调用了toSting进行打印的,所以我们就可以自己写一个toString,当然也可以用IDEA进行生成。
在这里插入图片描述

在这里插入图片描述

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }

这个时候的的输出结果就是

在这里插入图片描述
可以看到,在我们不写toString的时候,直接打印对象名,打印的是类名+地址。 写了toSting,会根据你写的toString打印内容。

总结

到这里关于java的类和对象的部分就暂时结束了。还挖了几个坑没填(笑

就像我在第一篇说的那样,我还是一个java的初学者,甚至是编程的初学者,到今天为止java也就学了好像也就半个月。写这几篇博客本来的目的也就是为了加深我对java一些知识点的内容。

类和对象这个部分是我感觉我在学习过程中比较吃力的部分,其实在写第一篇博客的时候我已经在学习继承和多态了,但是在学习过程中感觉非常的吃力。主要原因就是因为类和对象的很多东西没有搞明白,于是我暂时停下了学习新的内容。回过头来巩固关于类和对象的知识点。

这是我第一次写那么多博客,四篇下来应该有一个2W字左右。虽然没有什么人看,但我目前写博客也不是为了给什么人看的。主要是对已经学习过的知识进行复习和总结归纳,写博客是一个很好的方法。 以后可能会越来越频繁。 如果有能看到这里的大佬,希望可以在评论区或者私信我进行交流。非常感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值