首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第一章:OOP:继承
第二章:关键字 super
第三章:关键字 static
第四章:成员变量初始化
第五章:OOP:多态
第六章:关键字 native
第七章:关键字 final
第八章:Object 类的使用
第九章:抽象类
第十章:接口
第十一章:经典接口介绍
第十二章:包装类
第十三章:内部类
当前位置:
首页>>
技术小册>>
Java语言基础6-面向对象高级
小册名称:Java语言基础6-面向对象高级
4.1 成员变量初始化方式 4.1.1 默认赋值 ![](/uploads/images/20230724/7536c123e2f1ee68c5ce4468e8ecb757.png) - 我们知道类中成员变量都有默认值,但是现在我们需要为成员变量赋默认值以外的值,那该怎么办? 4.1.2 显示赋值 ```bash public class Student{ public static final String COUNTRY = "中华人民共和国"; private static String school = "社会大学"; private String name; private char gender = '男'; } ``` - 显示赋值,一般都是赋常量值。 4.1.3 代码块 - 如果成员变量想要初始化值不是一个硬编码的变量值,而是需要通过复杂的计算或读取文件、读取环境信息等方式才可以获取的一些值,该怎么办? - 代码块:为Java类或对象进行初始化 。 - 静态代码块: - 写在类中方法外面的 static {} 。 - 为静态变量初始化。 - 由类加载器调用执行,每一个类的静态代码块只会执行一次,早于实例对象的创建。 ```bash 修饰符 class 类名 { // 静态代码块 static { // 静态变量初始化 } } ``` 构造代码块(实例代码块): 写在类中方法外面的 {} 。 为实例变量初始化。 创建对象的时候,new 一次,运行一次。 ```bash 修饰符 class 类名 { // 实例代码块 { // 实例变量初始化 } } ``` 局部代码块:写在方法内部{} 。 ```bash 修饰符 class 类名 { public void method(){ // 局部代码块 { } } } ``` 示例: ```bash package com.github.member.args.initialization.demo1; /** * @author maxiaoke.com * @version 1.0 */ public class Student { public static final String school; static { school = "社会大学"; System.out.println("静态代码块"); } private final char gender = '男'; private String name; { this.name = "maxiaoke.com"; System.out.println("构造代码块①"); } { this.name = "maxiaoke.com2"; System.out.println("构造代码块②"); } public char getGender() { return this.gender; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student{" + "gender=" + this.gender + ", name='" + this.name + '\'' + '}'; } } ``` ```bash package com.github.member.args.initialization.demo1; /** * @author maxiaoke.com * @version 1.0 */ public class StudentTest { public static void main(String[] args) { Student student = new Student(); System.out.println("school = " + Student.school); System.out.println("student = " + student); Student student2 = new Student(); System.out.println("school = " + Student.school); System.out.println("student2 = " + student2); } } ``` 4.1.4 构造器 - 我们发现,显示赋值和构造器代码块为每一个实例变量初始化的都是相同的值,那么如果我们需要不同的实例对象初始化不同的值,怎么办? - 需要使用构造器,在 new 对象的时候由对象的创建者决定为当前对象的实例变量赋什么值。 注意:构造器只为实例变量初始化,不为静态变量初始化。 4.2 类初始化 - 类初始化的目的:为类中的静态变量进行赋值。 - 实际上,类初始化的过程是在调用一个 <clinit>() 方法,这个方法是由编译器自动生成的。编译器会将如下的两部分的所有代码,按照顺序合并到类初始化 <clinit>() 方法中。 - ① 静态类成员变量的显式赋值语句。 - ② 静态代码块中的语句。 clinit are the static initialization blocks for the class, and static field initialization - 整个类初始化只会进行一次,如果子类初始化的时候,发现父类没有初始化,那么就会先初始化父类。 - 示例:类的初始化不含子类 ```bash package com.github.classinit1.demo1; /** * 类的初始化 * * @author maxiaoke.com * @version 1.0 */ public class Father { public static int age = getNum(); private static int getNum() { System.out.println("Father getNum"); return 10; } static { System.out.println("Father ①"); } public static int num = getNum(); static { System.out.println("Father ②"); } public static void show() { System.out.println("Father show"); } } ``` ```bash package com.github.classinit1.demo1; /** * @author maxiaoke.com * @version 1.0 */ public class Test { public static void main(String[] args) { Father.show(); System.out.println("----------"); Father.show(); } } ``` ```bash 运行结果 Father getNum Father ① Father getNum Father ② Father show ---------- Father show ``` 示例:类的初始化包含父类和子类 ```bash package com.github.classinit1.demo2; /** * @author maxiaoke.com * @version 1.0 */ public class Father { public static int age = getNum(); private static int getNum() { System.out.println("Father getNum"); return 10; } static { System.out.println("Father ①"); } public static int num = getNum(); static { System.out.println("Father ②"); } public static void show() { System.out.println("Father show"); } } ``` ```bash package com.github.classinit1.demo2; /** * @author maxiaoke.com * @version 1.0 */ public class Son extends Father { public static int n1 = getNum1(); private static int getNum1() { System.out.println("Son getNum1"); return 20; } static { System.out.println("Son ①"); } public static int n2 = getNum1(); static { System.out.println("Son ②"); } public static void show() { System.out.println("Son show"); } } ``` ```bash package com.github.classinit1.demo2; /** * @author maxiaoke.com * @version 1.0 */ public class Test { public static void main(String[] args) { Son.show(); System.out.println("-----------------"); Son.show(); } } ``` ```bash 运行结果 Father getNum Father ① Father getNum Father ② Son getNum1 Son ① Son getNum1 Son ② Son show ----------------- Son show ``` 4.3 实例初始化 - 实例初始化的目的:为类中非静态变量赋值。 - 实际上,实例初始化的过程是在调用一个或多个 <init>() 方法,这个方法是由编译器自动生成的。 init is the (or one of the) constructor(s) for the instance, and non-static field initialization。 - 实例初始化方法,即<init>()方法是由以下四部分组成: - ① super()或super(实参列表)。 - ② 静态变量显示赋值代码。 - ③ 非静态代码块。 - ④ 构造器代码。 注意:② 和 ③ 是按照顺序合并的,① 一定在最前面,④ 一定在最后面。 - 实例初始化的执行特点: - 创建对象的时候,才会执行。 - 每 new 一次对象,都会完成该对象的实例初始化。 - 调用哪个构造器,就是执行它对应的 <init>() 方法。 - 创建子类对象的时候,父类对应的实例初始化先执行,执行父类的那个实例初始化方法,看 super() 还是 super(实参列表) 。 - 示例:单个类 ```bash package com.github.instanceinit.demo1; /** * @author maxiaoke.com * @version 1.0 */ public class Father { int age = getAge(); // 显示赋值语句 private int getAge() { System.out.println("Father getAge"); return 10; } { // 非静态代码块 System.out.println("Father ①"); } int num = getAge(); // 显示赋值语句 public Father(){ // 构造器 System.out.println("Father 无参构造器"); } } ``` ```bash package com.github.instanceinit.demo1; /** * @author maxiaoke.com * @version 1.0 */ public class Test { public static void main(String[] args) { Father father = new Father(); System.out.println("------------------"); Father father1 = new Father(); } } ``` ```bash 运行结果: Father getAge Father ① Father getAge Father 无参构造器 ------------------ Father getAge Father ① Father getAge Father 无参构造器 ``` 示例:父子类 ```bash package com.github.instanceinit.demo2; /** * @author maxiaoke.com * @version 1.0 */ public class Father { int age = getAge(); // 显示赋值语句 private int getAge() { System.out.println("Father getAge"); return 10; } { // 非静态代码块 System.out.println("Father ①"); } int num = getAge(); // 显示赋值语句 public Father(){ // 构造器 System.out.println("Father 无参构造器"); } } ``` ```bash package com.github.instanceinit.demo2; /** * @author maxiaoke.com * @version 1.0 */ public class Son extends Father { { System.out.println("Son ①"); } double height = getHeight(); private double getHeight() { System.out.println("Son getHeight"); return 0; } public Son(){ System.out.println("Son 无参构造器"); } } ``` ```bash package com.github.instanceinit.demo2; /** * @author maxiaoke.com * @version 1.0 */ public class Test { public static void main(String[] args) { Son s1 = new Son(); System.out.println("----------"); Son s2 = new Son(); } } ``` ```bash 运行结果: Father getAge Father ① Father getAge Father 无参构造器 Son ① Son getHeight Son 无参构造器 ---------- Father getAge Father ① Father getAge Father 无参构造器 Son ① Son getHeight Son 无参构造器 ``` 4.4 类初始化和实例初始化 - 类的初始化优先于实例初始化。 - 类初始化只做一次。 - 实例初始化是每次创建对象的时候都要进行。 - 示例: ```bash package com.github.classandinstanceinit; /** * @author maxiaoke.com * @version 1.0 */ public class Father { static { System.out.println("Father static"); } { System.out.println("Father not static"); } public Father(){ System.out.println("Father 无参构造器"); } } ``` ```bash package com.github.classandinstanceinit; /** * @author maxiaoke.com * @version 1.0 */ public class Son extends Father { static { System.out.println("Son static"); } { System.out.println("Son not static"); } public Son() { System.out.println("Son 无参构造器"); } } ``` ```bash package com.github.classandinstanceinit; /** * @author maxiaoke.com * @version 1.0 */ public class Test { public static void main(String[] args) { Son s1 = new Son(); System.out.println("---------------"); Son s2 = new Son(); } } ``` ```bash 运行结果: Father static Son static Father not static Father 无参构造器 Son not static Son 无参构造器 --------------- Father not static Father 无参构造器 Son not static Son 无参构造器 ```
上一篇:
第三章:关键字 static
下一篇:
第五章:OOP:多态
该分类下的相关小册推荐:
Java语言基础15-单元测试和日志技术
Java语言基础5-面向对象初级
Java语言基础2-运算符
Java并发编程实战
Java语言基础14-枚举和注解
Mybatis合辑1-Mybatis基础入门
Java高并发秒杀入门与实战
Java必知必会-JDBC
Java语言基础9-常用API和常见算法
Java语言基础4-数组详解
Java语言基础8-Java多线程
Java语言基础10-Java中的集合