网站建设案例模板下载wordpress下载的主题怎么安装
网站建设案例模板下载,wordpress下载的主题怎么安装,酒店旅游团购网站建设,wordpress中英文建站引言
在Java面向对象编程中#xff0c;构造方法、this和super是三个至关重要的概念。它们不仅关系到对象的创建和初始化#xff0c;还涉及到继承体系下的代码复用与调用逻辑。本文将通过详细的讲解、内存图解和实际案例#xff0c;帮助你彻底掌握这些核心知识点。 一、构造…引言在Java面向对象编程中构造方法、this和super是三个至关重要的概念。它们不仅关系到对象的创建和初始化还涉及到继承体系下的代码复用与调用逻辑。本文将通过详细的讲解、内存图解和实际案例帮助你彻底掌握这些核心知识点。一、构造方法对象的诞生仪式1.1 为什么需要构造方法当我们把类的属性用private修饰后外界无法直接访问必须通过set和get方法。但是如果希望对象一创建就必须明确其属性值如姓名、年龄该如何实现这就是构造方法的价值所在——在创建对象的同时完成属性初始化。1.2 构造方法的定义规则构造方法是一种特殊的方法它遵循以下严格规则javaclass Person { private int age; private String name; // 构造方法方法名与类名相同无返回值类型 Person(int a, String nm) { age a; name nm; } }核心特征方法名必须与类名完全相同没有返回值类型连void都不能写在new对象时自动执行且仅执行一次1.3 构造方法调用与内存图解javaclass Person { private int age; private String name; Person(int a, String nm) { age a; name nm; } public void speak() { System.out.println(name name ,age age); } } class PersonDemo { public static void main(String[] args) { Person p2 new Person(23, 张三); p2.speak(); } }内存执行流程main方法压入栈中执行new Person(23, 张三)在堆内存分配空间地址如0x88成员变量默认初始化namenull,age0调用构造方法参数值赋给成员变量age23,name张三构造方法弹栈对象创建完成地址0x88赋值给引用变量p21.4 默认构造方法的秘密重要结论如果类中未定义任何构造方法编译器会自动添加一个空参构造方法如果手动定义了构造方法无论是否有参数编译器不再提供默认构造方法javaclass Person { // 编译时自动添加Person() {} }使用建议需要强制初始化属性时 → 提供带参构造方法不需要强制初始化时 → 可省略构造方法使用默认1.5 构造方法的进阶特性① 构造方法重载一个类可以有多个构造方法通过参数列表区分javaclass Person { private Person() {} // 私有构造方法禁止外部创建 Person(int a) { age a; } Person(String nm, int a) { name nm; age a; } }② 构造方法 vs 普通方法特性构造方法普通方法调用时机创建对象时自动调用仅一次对象创建后手动调用可多次返回值无返回值类型必须有返回值类型方法名必须与类名相同可自定义③ 为什么还需要set/get方法因为对象创建后可能需要修改或访问属性值此时只能通过set/get方法操作。二、this关键字本类对象的引用2.1 构造方法间的调用当多个构造方法存在重复代码时可通过this实现复用javaclass Person { private int age; private String name; Person() {} Person(String nm) { name nm; } Person(String nm, int a) { this(nm); // 调用本类其他构造方法 age a; } }调用规则this(参数列表)必须放在构造方法的第一行只能在构造方法中调用其他构造方法2.2 this的内存原理图解javaPerson p new Person(张三, 23);main方法压栈执行new Person(张三, 23)堆内存分配空间地址0x33成员变量默认初始化双参构造方法压栈隐含this指向当前对象0x33执行this(张三)调用单参构造方法单参构造方法压栈同样隐含this指向0x33执行name nm完成赋值后弹栈回到双参构造继续执行age a完成后弹栈对象创建完成地址赋值给p核心理解this代表当前调用该方法的对象引用。2.3 解决成员变量与局部变量同名问题javaclass Person { private int age; private String name; Person(String name, int age) { this.name name; // this.name指成员变量 this.age age; // this.age指成员变量 } }规则当局部变量与成员变量同名时使用this.变量名明确指向成员变量。2.4 this应用实例判断同龄人javaclass Person { private int age; private String name; Person(String name, int age) { this.name name; this.age age; } // 判断是否为同龄人 public boolean equalsAge(Person p) { return this.age p.age; // this指当前调用者 } }三、super关键字父类存储空间的引用3.1 子父类构造方法的调用机制核心规则创建子类对象时父类构造方法优先执行。因为子类继承了父类内容必须先查看父类如何初始化。javaclass Fu { int num; Fu() { System.out.println(Fu构造方法 num); num 4; } } class Zi extends Fu { Zi() { // super(); // 默认调用父类空参构造 System.out.println(Zi构造方法 num); } } // 执行结果 // Fu构造方法0 // Zi构造方法4隐含机制子类所有构造方法的第一行默认有super();语句调用父类空参构造。3.2 显式调用父类构造方法当父类没有空参构造时子类必须显式调用javaclass Fu { Fu(int num) { // 无空参构造 // 初始化代码 } } class Zi extends Fu { Zi() { super(100); // 必须显式调用父类有参构造 } }调用格式this(参数)调用本类其他构造方法super(参数)调用父类构造方法二者不能同时出现因为都必须位于第一行3.3 对象创建过程深度解析重要细节如果子类构造第一行写了this()则不会默认添加super()父类构造方法中同样隐含super()一直追溯到Object类Java中所有类都直接或间接继承自Object类3.4 super应用员工体系案例java// 父类Person class Person { private String name; private int age; public Person(String name, int age) { // super(); this.name name; this.age age; } // getter/setter略 } // 子类Student class Student extends Person { Student(String name, int age) { super(name, age); // 调用父类构造完成初始化 } public void study() { System.out.println(this.getName() 同学在学习); } } // 子类Worker class Worker extends Person { Worker(String name, int age) { super(name, age); } public void work() { System.out.println(this.getName() 工人在工作); } }四、综合案例完整的员工类体系4.1 需求描述某IT公司有多名员工按工作分为研发部和维护部。研发部包含JavaEE工程师、Android工程师维护部包含网络维护工程师、硬件维护工程师。所有员工都有编号、姓名并执行特定工作。4.2 类体系设计员工体系图 Employee (抽象类) ├── Developer (研发部员工) │ ├── JavaEE │ └── Android └── Maintainer (维护部员工) ├── Network └── Hardware4.3 完整代码实现java// 1. 抽象员工类 public abstract class Employee { private String id; private String name; public Employee() { super(); } public Employee(String id, String name) { super(); this.id id; this.name name; } public String getId() { return id; } public void setId(String id) { this.id id; } public String getName() { return name; } public void setName(String name) { this.name name; } // 抽象工作方法 public abstract void work(); } // 2. 研发部员工类 public abstract class Developer extends Employee { public Developer() { super(); } public Developer(String id, String name) { super(id, name); } } // 3. 维护部员工类 public abstract class Maintainer extends Employee { public Maintainer() { super(); } public Maintainer(String id, String name) { super(id, name); } } // 4. JavaEE工程师 public class JavaEE extends Developer { public JavaEE() { super(); } public JavaEE(String id, String name) { super(id, name); } Override public void work() { System.out.println(员工号为 getId() 的 getName() 员工正在研发淘宝网站); } } // 5. Android工程师 public class Android extends Developer { public Android() { super(); } public Android(String id, String name) { super(id, name); } Override public void work() { System.out.println(员工号为 getId() 的 getName() 员工正在研发淘宝手机客户端软件); } } // 6. 网络维护工程师 public class Network extends Maintainer { public Network() { super(); } public Network(String id, String name) { super(id, name); } Override public void work() { System.out.println(员工号为 getId() 的 getName() 员工正在检查网络是否畅通); } } // 7. 硬件维护工程师 public class Hardware extends Maintainer { public Hardware() { super(); } public Hardware(String id, String name) { super(id, name); } Override public void work() { System.out.println(员工号为 getId() 的 getName() 员工正在修复打印机); } } // 8. 测试类 public class Test { public static void main(String[] args) { // 创建JavaEE工程师对象 JavaEE ee new JavaEE(000015, 小明); ee.work(); // 创建Worker对象 Worker w new Worker(000023, 小李); w.work(); } }五、知识点总结5.1 this关键字本质本类对象的引用存在时机创建对象时this指向当前对象核心作用区分同名成员变量与局部变量this.成员变量在构造方法中调用本类其他构造方法this(参数)5.2 构造方法格式修饰符 类名(参数列表) { ... }特点方法名与类名相同无返回值类型连void都没有仅在创建对象时被调用一次注意事项手动定义构造方法后编译器不再提供默认空参构造5.3 super关键字本质父类存储空间的引用理解为父类对象的引用用法调用父类成员变量super.成员变量调用父类构造方法super(参数)调用父类成员方法super.成员方法()继承中的构造规则子类构造方法默认第一行有super();父类无空参构造时子类必须显式调用super(参数)super()和this()不能共存于同一构造方法都需第一行结语掌握构造方法、this和super是理解Java面向对象编程的关键。通过本文的讲解和案例希望你不仅明白了它们的语法规则更深入理解了对象创建过程中的内存机制。在实际开发中合理使用这些特性可以写出更健壮、可维护的代码。