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