javaseDay12 对象实例化过程
项目模块结构
com.Person类
1 package com; 2 3 //类修饰符 4 //外部类 5 //public 缺省 6 //abstract final 7 //定义类的完整语法 8 //[public] [abstract|final] class A [extends B] [implements C,D] 9 10 import javax.xml.transform.Source; 11 12 public class Person { 13 //入口 14 15 int id=1;//在这里初始化,那么程序段1输出就是1 16 { 17 System.out.println("Person的程序段1"); 18 System.out.println("输出类属性name为"+Person.name);//始终是Person 19 System.out.println("输出成员属性id为"+this.id);//可能是1或0,取决于相对位置 20 System.out.println("Person的程序段1结束\n-------------"); 21 } 22 23 24 Person(){ 25 System.out.println("Person的构造方法"); 26 System.out.println("我是"+Person.name+"类"); 27 System.out.println("Person的构造方法结束\n-------------"); 28 } 29 30 // int id=1;//在这里初始化,那么程序段1输出就是1 31 // static String name = "Person";//在这里初始化,那么静态程序段输出就是Person 32 Dog pet = new Dog(); 33 34 35 { 36 System.out.println("Person的程序段2"); 37 System.out.println("Person的程序段2结束\n--------------"); 38 } 39 static { 40 System.out.println("Person的静态程序段开始,也就是“实例化”Person类的开始"); 41 // System.out.println(id);//不能调用,因为1,太早了,没有分配内存 2,找不到是那个具体实例 42 System.out.println("输出类属性name为"+Person.name);//可能输出为null或者Person 43 Person.show(); 44 System.out.println("Person的静态程序段结束\n--------------"); 45 } 46 public static void show(){ 47 System.out.println("Person类的show方法"); 48 } 49 static String name = "Person"; 50 } 51 52 //抽象类 53 abstract class Animal{ 54 55 Animal(){ 56 System.out.println("Animal的构造方法"); 57 System.out.println("Animal的构造方法结束"); 58 } 59 void show(){ 60 System.out.println("Animal的show方法"); 61 } 62 } 63 64 65 //最终类,不能被继承的 66 //java.lang.String、 java.lang.Math 67 final class Dog extends Animal{ 68 static String name = "dog"; 69 Dog(){ 70 System.out.println("Dog的构造方法"); 71 System.out.println("Dog的构造方法结束"); 72 } 73 74 @Override 75 void show() { 76 System.out.println("Dog的show方法"); 77 } 78 } 79 80 //final用在属性上,常量,不能被修改。 81 //1.必须手动初始化 82 //2.标识符名字最好大写
com.Student 类
1 package com; 2 3 public class Student extends Person{ 4 5 Student(){ 6 7 System.out.println("Student的构造方法开始"); 8 printInfo();//里面可以使用对象方法,验证了实例对象的所有成员先于构造方法分配内存 9 System.out.println("Student的构造方法结束\n-----------"); 10 } 11 int age = 18; 12 String name = "李四"; 13 14 //想要展示一下自己 15 void printInfo(){ 16 System.out.printf("姓名:%s,年龄:%d岁",this.name,this.age); 17 } 18 19 //类的静态方法 20 //@Override // 这里就不是重写了, override不行--算是一个小bug 21 22 public static void show(){ 23 System.out.println("Student类的show方法"); 24 } 25 26 //类的静态属性 27 static String class_name = "Student"; 28 { 29 System.out.println("Student代码块开始"); 30 System.out.println("Student代码块结束\n--------------"); 31 } 32 static { 33 System.out.println("Student静态代码块"); 34 System.out.println("Student静态代码块结束\n--------------"); 35 } 36 }
com.Test 类
1 package com; 2 3 4 public class Test { 5 public static void main(String[] args) { 6 System.out.println("实例化张三对象"); 7 //标识符可以是汉字,可能会有乱码,所以尽量按规范来 8 Student student_张三 = new Student(); 9 System.out.println("\n_______________________"); 10 System.out.println("实例化李四对象"); 11 Student student_liSi = new Student(); 12 /* 13 输出结果 14 * 实例化张三对象 15 Person的静态程序段开始 16 输出类属性name为null 17 Person的静态程序段结束 18 -------------- 19 Student静态代码块 20 Student静态代码块结束 21 -------------- 22 Person的程序段1 23 输出类属性name为Person 24 输出成员属性id为1 25 Person的程序段1结束 26 ------------- 27 Animal的构造方法 28 Animal的构造方法结束 29 Dog的构造方法 30 Dog的构造方法结束 31 Person的程序段2 32 Person的程序段2结束 33 -------------- 34 Person的构造方法 35 我是Person类 36 Person的构造方法结束 37 ------------- 38 Student代码块开始 39 Student代码块结束 40 -------------- 41 Student的构造方法开始 42 姓名:李四,年龄:18岁Student的构造方法结束 43 ----------- 44 45 _______________________ 46 实例化李四对象 47 Person的程序段1 48 输出类属性name为Person 49 输出成员属性id为1 50 Person的程序段1结束 51 ------------- 52 Animal的构造方法 53 Animal的构造方法结束 54 Dog的构造方法 55 Dog的构造方法结束 56 Person的程序段2 57 Person的程序段2结束 58 -------------- 59 Person的构造方法 60 我是Person类 61 Person的构造方法结束 62 ------------- 63 Student代码块开始 64 Student代码块结束 65 -------------- 66 Student的构造方法开始 67 姓名:李四,年龄:18岁Student的构造方法结束 68 ----------- 69 70 * 71 * */ 72 //实例化过程总结 73 // 大的来说是就是为类和实例对象分配内存和执行代码。 74 //需要分配内存的有,类的成员属性和成员方法,实例对象的成员属性和成员方法。 75 //第一次执行对象的实例化,需要先执行类的实例化 76 // 1.为类成员属性和方法分配内存 77 // --- 注:虽然看不到,内存分配是无形的 78 // 但是可以推测到,通过静态代码块输出,发现是默认值,或者是初始化值。也就是说分配内存早于执行,这也是常识问题。 79 // 这是常用的测试方法 80 //2.执行类的代码。1、按顺序执行,2、包括变量初始化和执行代码块,构造方法 81 //3、实例成员分配内存 82 //4、实例成员执行代码。1、按顺序执行,2、包括变量初始化和执行代码块,构造方法 83 //第二次执行就不会需要为类分配内存和执行代码了 84 //也就是少了1,2两部,就理解为跳过这两部。 85 86 //关键点总结 87 //类的“实例化”。对象的“实例化”过程 88 //拓展复习 89 //成员变量需要初始化后使用。只声明应该不会分配内存。 90 91 } 92 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)