构造函数特性:
- 函数名与类名相同。
- 无返回值。
- 编译器自动调用对应的构造函数。
- 构造函数可以重载。
构造函数的作用:针对性初始化
语法格式:权限修饰符 类名(参数列表) {
函数体
return;
}
任何一个类 在没有明确定义构造函数的时候 它会有一个默认无参的构造函数
(一旦定义任何一个构造函数 那么默认无参构造函数就会消失 建议写出无参构造函数)
构造函数在创建对象的时候执行的,并不会在创建对象之后由对象调用
构造函数没有返回值类型的,但是不代表没有return
return仅仅表示函数弹栈/结束 如果有返回值则捎带
构造函数中可以调用成员函数
但是成员函数不能调用构造函数
构造函数中可以调用构造函数的(不能进行回调)
语法格式:this(参数列表) 这句代码必须在第一行
含义:尽量避免一些重复性的代码 去复用更多参数的构造函数
*/
static关键字-静态
静态变量:
代码:成员变量被static关键字修饰
含义:是对象之间的共享属性/共享数据
内存:如果每一个对象种某一个属性是共享的,但是作为成员变量它又是占空间的
所以把该属性从对象内存中抽取出来,所有对象只需要共用一份即可,静态变量
抽取出来的属性放到哪里呢?————静态方法区
方法区:非静态方法区,静态方法区 输入JVM内存中的一部分(堆,栈)
主要用于存放编译好的字节码文件
静态函数
代码:成员函数被static关键字修饰
含义:并没有共享的意思,唯一含义就是只要这个成员函数内部不【直接】调用成员变量/函数,就可以定义为静态函数
内存:在静态方法区中存储的
静态函数内 是没有this关键字,它不需要区分对象
静态的内容是优先于对象存在的,也就意味着静态的生命周期是大于对象的
静态——类成员,可以直接通过类去调用,也可以后续被对象调用
至此,分析一下Chinese这个类的执行流程
(1)javac Chinese.java 对源代码进行编译,生成对应的字节码文件 Chinese.class
(2)java Chinese 执行Chinese.class字节码文件
(3)先将字节码文件加载进方法区,然后根据静态和非静态进行区分
(4)根据 java Chinese JVM在静态方法区中 Chinese类中 找主函数 找不到报错 找到则运行
注意:这个时候并没有Chinese对象的存在(name age也都不存在)
但是country这个静态变量已经存在了!
(5)主函数进栈开始执行
System.out.println(Chinese.country);
去静态方法区中 找Chinese的字节码 在该字节码中找country静态变量
Chinese.show();
去静态方法区中 找Chinese的字节码 在该字节码中找show静态函数
show()函数进栈 开始执行
静态变量和成员变量区别:
(1)生命周期
成员变量:随着对象的创建而诞生,随着对象的消亡而消失
静态变量:随着类的加载而诞生,随着类的卸载而消失(程序执行完毕)
(2)存储位置
成员变量:存储在堆内存中,对象的空间里
静态变量:存储在静态方法去中,某一个类的字节码空间里
(3)调用方式
成员变量:在类的内部成员函数直接调用,在类的外部创建对象之后调用
静态变量:在类的内部静态/成员函数直接调用,在类的外部创建对象之后调用或直接通过类名调用
(4)初始化
成员变量:默认-显示-针对性
静态变量:默认-显示-针对性
代码块CodeBlock
静态代码块:主要在类内部的一对static{} 主要是对类进行一些初始化
随着类的加载,只执行一次
构造代码块:主要在类内部的一对{} 主要是对对象进行一些初始化 类似构造函数 优先于构造函数执行 在显式初始化自后执行
随着对象的创建,而执行
顺序:默认-显示-构造代码块-针对性初始化构造函数
局部代码块:主要在函数内部的一对{} 应用在循环语句 判断语句
局部代码块可以访问外界的内容,但是外界访问不了内部的内容