执行顺序
构造代码块->构造方法->对象创建成功->调用方法(局部代码块)

构造方法

概念

构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法
构造方法的主要功能就是完成对象创建或者初始化
当类创建对象(实例化)时,就会自动调用构造方法
构造方法与普通方法一样也可以重载.

形式

  1. 方法格式:修饰符 返回值类型 方法名(参数列表){方法体;}
  2. 构造方法格式:修饰符 类名(参数列表){方法体;}
  1. 每个类中默认存在无参构造方法

普通方法格式:修饰符 返回值类型 方法名(参数列表){方法体;}
构造方法格式:修饰符 类名(参数列表){方法体;}

  1. 每次创建对象时,都会自动触发对象的构造方法来创建对象

方法重载:在同一个类中,存在多个方法名相同但参数列表不同的方法

  1. 构造方法也存在重载的现象:无参构造、含参构造、全参构造
  2. 如果提供了含参构造,默认的无参构造会被覆盖

如果想继续使用无参构造创建对象,就必须手动提供无参构造

  1. 执行时机:每次创建对象,都会出发对应的构造方法,创建几次就会触发几次

    示例

    ```java package cn.tedu.oop;

public class TestConstructor { public static void main(String[] args) { //4.创建对象进行测试 People p = new People(100); People p1 = new People(); System.out.println(“姓名:” + p.name + “,性别:” + p.gender + “,年龄:” + p.age);//查看p对象属性值 p.eat();//通过p对象调用eat()方法 } }

//1.创建一个People类,把人的相关特征与行为封装为一个类组件 class People{ //2.属性/字段—成员变量 String name; int age; String gender; / 1.每个类中默认存在无参构造方法 方法格式:修饰符 返回值类型 方法名(参数列表){方法体;} 构造方法格式:修饰符 类名(参数列表){方法体;} 2.每次创建对象时,都会自动触发对象的构造方法来创建对象 方法重载:在同一个类中,存在多个方法名相同但参数列表不同的方法 3.构造方法也存在重载的现象:无参构造、含参构造、全参构造 4如果提供了含参构造,默认的无参构造会被覆盖 如果想继续使用无参构造创建对象,就必须手动提供无参构造 /

  1. public People(){
  2. System.out.println("我是People类的无参构造方法!");
  3. }
  4. //3.功能--方法
  5. public void eat(){
  6. System.out.println("干饭人,干饭魂");
  7. }
  8. //创建一个含参构造方法
  9. public People(int a){
  10. System.out.println("我是People类的含参构造方法" + a);
  11. }

}

  1. <a name="FjNpz"></a>
  2. # 代码块
  3. <a name="vP4RI"></a>
  4. ## 构造代码块
  5. <a name="XkiKg"></a>
  6. ### 语法结构

{代码}

  1. <a name="vI2G4"></a>
  2. ### 特点
  3. _位置:类里方法外<br />执行时机:创建对象时执行,并且优先于构造方法执行<br />作用:用于提取所有构造方法的共性功能_
  4. <a name="lh85X"></a>
  5. ## 局部代码块
  6. <a name="lVcVi"></a>
  7. ### 语法结构

{代码}

  1. <a name="D9Yix"></a>
  2. ### 特点
  3. _位置:方法里<br />执行时机:调用该代码块所在的方法时执行<br />功能:控制变量的适用范围,变量只能在局部使用,在局部代码块之外会失效_
  4. <a name="Qqlzs"></a>
  5. ## 示例
  6. ```java
  7. package cn.tedu.oop;
  8. /**
  9. * 用于测试代码块
  10. */
  11. public class TestBlock {
  12. public static void main(String[] args) {
  13. Teacher t = new Teacher();
  14. Teacher t1 = new Teacher("计算机组成原理");
  15. t.sleep();
  16. }
  17. }
  18. //创建一个老师类用于测试数据
  19. class Teacher{
  20. String subject;
  21. String country;
  22. /*
  23. 创建一个构造代码块
  24. 位置:类里方法外
  25. 执行时机:创建对象时执行,并且优先于构造方法执行
  26. 作用:用于提取所有构造方法的共性功能
  27. */
  28. {
  29. country = "华夏";
  30. System.out.println("构造代码块");
  31. }
  32. public Teacher(){
  33. System.out.println("我是一个没有感情的无参构造方法。" + country);
  34. }
  35. public Teacher(String subject) {
  36. this.subject = subject;
  37. System.out.println("我是一个感情丰富的全参构造方法。" + country);
  38. }
  39. public void sleep(){
  40. /*
  41. 创建一个局部代码块
  42. 位置:方法里
  43. 执行时机:调用该代码块所在的方法时执行
  44. 功能:控制变量的适用范围,变量只能在局部使用,在局部代码块之外会失效
  45. */
  46. {
  47. System.out.println("局部代码块");
  48. }
  49. }
  50. }

this

概念

this代表本类对象的一个引用对象
this代表的是本类,指定的也是本类的资源,例如成员变量

  1. 当成员变量与局部变量重名时,用于指定成员变量
  2. 可以实现构造方法间的调用
    (1)格式
    无参构造调用—this();
    含参构造—this(参数);
  3. 注意事项:构造方法的调用不能互相调用,是单向的,不然会报错
  4. 构造方法的调用必须出现在第一行

    形式

    1. this.name = name;

    示例

    this在变量名相同时使用

    ```java package cn.tedu.oop;

/**

  • 用于测试成员变量与局部变量同名是,this的使用情况 */

public class TestThis1 { public static void main(String[] args) { Cat c = new Cat(); c.jump(); } }

// class Cat{ int sum = 100; String s = “书读千遍,其意自见”;

  1. public void jump(){
  2. int sum = 10;
  3. System.out.println(sum);
  4. System.out.println(this.sum);
  5. System.out.println(this.s);
  6. }

}

  1. <a name="YaDni"></a>
  2. ### this在构造方法间的调用·
  3. _**构造方法的调用只能是单项调用,不能互相调用**_<br />_**this调用构造方法的语句必须在第一行**_
  4. ```java
  5. package cn.tedu.oop;
  6. /**
  7. * 用于测试构造方法间的互相调用
  8. */
  9. public class TestThis2 {
  10. public static void main(String[] args) {
  11. Game g = new Game();
  12. Game g1 = new Game("马里奥制造");
  13. //不能按照调用普通方法的格式去调用构造方法
  14. }
  15. }
  16. class Game{
  17. public Game() {
  18. /*
  19. 在无参构造中调用含参构造的格式
  20. 构造方法的调用只能是单项调用,不能互相调用
  21. this调用构造方法的语句必须在第一行
  22. */
  23. this("任天堂明星大乱斗");
  24. System.out.println("无参构造");
  25. }
  26. public Game(String name){
  27. /*
  28. 在含参构造中调用无参构造的格式
  29. */
  30. //this();
  31. System.out.println(name);
  32. }
  33. }