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 }
复制代码

 

posted @   liu/564  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示