9.3. 构造方法

Java构造方法的特点:

01. 构造方法名必须与类名相同。
02. 构造方法没有任何返回值,包括void。
03. 构造方法只能与new运算符结合使用。

代码示例

package Null_class;

// 矩形类
public class HelloWord {
// 矩形宽度
 int width;
// 矩形高度
 int height;
// 矩形面积
 int area;

//  构造方法
 public HelloWord(int w, int h) {
  // TODO 自动生成的构造函数存根
  width = w;
  height = h;
  area = getArea(w,h);
 }

}

9.3.1. 01.被修饰的构造方法

代码示例

package com.a51work.cn;

public class apple {
    // 声明一个私有的成员变量
    private String s;

    // 被修饰为private的构造方法
    private apple() {
        System.out.println("构造方法运行了");
    }

    // 通过一个static方法来返回apple的对象实例
    public static apple getTest() {
        return new apple();
    }

    // 给私有成员变量赋值
    public void setS(String s) {
        this.s = s;
    }

    //获取私有成员变量的值
    public String getS() {
        return s;
    }

    public static void main(String[] args) {
        // 创建apple类的对象实例
        apple a = apple.getTest();

        // 调用方法并赋值
        a.setS("给私有成员变量赋值");
        // 取得私有成员变量值
        String s = a.getS();
        //打印并显示结果
        System.out.println(s);
    }
}

9.3.2. 02.默认构造方法

Java虚拟机为没有构造方法的类,提供一个无参数的默认构造方法,默认构造方法其方法体内无任何语句

9.3.3. 03.构造方法重载

代码示例1

package Null_class;

import java.util.Date;

public class Person {
 // 名字
 private String name;
 // 年龄
 private int age;
 // 出生日期
 private Date birthDate;

 public Person(String n, int a, Date d) {
  name = n;
  age = a;
  birthDate = d;
 }

 public Person(String n, int a) {
  // TODO 自动生成的构造函数存根
  name = n;
  age = a;
 }

 public Person(String n , Date d) {
  // TODO 自动生成的构造函数存根
  name = n;
  age = 18;
  birthDate = d;
 }

 public Person(String n) {
  // TODO 自动生成的构造函数存根
  name = n;
  age = 10;
 }
 public String getInfo() {
  StringBuilder sb = new StringBuilder();
  sb.append("名字: ").append(name).append('\n');
  sb.append("年龄: ").append(age).append('\n');
  sb.append("出生日期: ").append(birthDate).append('\n');
  return sb.toString();
  }

 public static void main(String[] args) {
//  Person类代码提供了4个重载的构造方法
//  传入1个参数时使用的构造方法
  Person p = new Person("hujianli");
  System.out.println(p.getInfo());

  System.out.println("\n");

//  传入2个参数时使用的构造方法
  Person p2 = new Person("huxiaojian",19);
  System.out.println(p2.getInfo());

  Person p3 = new Person("huxiaojian");
  System.out.println(p3.getInfo());



 }

}

代码示例2

package hujianli2.com.cn;

class Myclass{
    int age;
    String name;

    public Myclass() {
        age = 18;
        name = "hujianli";
    }

    public Myclass(int age) {
        this.age = age;
    }

    public Myclass(String name) {
        this.name = name;
    }

    public Myclass(int age, String name) {
        this.age = age;
        this.name = name;
    }

    void printinfo(){
        System.out.println(name);
        System.out.println(age);
    }
}

public class chonggou {
    public static void main(String[] args) {
        Myclass a = new Myclass();
        a.printinfo();

        Myclass b = new Myclass(19);
        b.printinfo();

        Myclass c = new Myclass("huxiaojian");
        c.printinfo();

        Myclass d = new Myclass(20,"hu");
        d.printinfo();
    }

}

9.3.4. 04.构造方法封装

代码示例

package Null_class;

import java.util.Date;

public class Person {
 // 名字
 private String name;
 // 年龄
 private int age;
 // 出生日期
 private Date birthDate;

// 公有级别
 public Person(String n, int a, Date d) {
  name = n;
  age = a;
  birthDate = d;
 }

// 默认级别
 Person(String n, int a) {
  // TODO 自动生成的构造函数存根
  name = n;
  age = a;
 }

// 保护级别
 protected Person(String n , Date d) {
  // TODO 自动生成的构造函数存根
  name = n;
  age = 18;
  birthDate = d;
 }

// 私有级别
 private Person(String n) {
  // TODO 自动生成的构造函数存根
  name = n;
  age = 10;
 }

 public String getInfo() {
  StringBuilder sb = new StringBuilder();
  sb.append("名字: ").append(name).append('\n');
  sb.append("年龄: ").append(age).append('\n');
  sb.append("出生日期: ").append(birthDate).append('\n');
  return sb.toString();
  }

 public static void main(String[] args) {
//  Person类代码提供了4个重载的构造方法
//  传入1个参数时使用的构造方法
  Person p = new Person("hujianli");
  System.out.println(p.getInfo());

  System.out.println("\n");

//  传入2个参数时使用的构造方法
  Person p2 = new Person("huxiaojian",19);
  System.out.println(p2.getInfo());

  Person p3 = new Person("huxiaojian");
  System.out.println(p3.getInfo());



 }

}

9.3.5. 构造方法和普通方法的区别

* 构造器是为了创建一个类的对象实例, 也可以在创建对象的时候使用。
* 方法是为了执行相应的方法体, 即Java 代码。
* 构造器可以被修饰为public、protected、default 、private 类型, 但不能修饰为abstract 、final、native、static、synchronized
* 方法可以有零个或多个参数。
* 创建一个类的时候可以不定义构造器, 编译器会自动为这个类添加一个没有参数的构造器。
* 方法可以修饰为除了protected、native 外的修饰符。
* 构造器没有返回值, 也没有void 型。
* 方法没有返回值或有任何类型的返回值。
* 构造器的名称要和类的名称相同。
* 方法的名称可以任意起, 但要注意标识符的命名规则, 使其更具有意义。

9.3.6. 什么是单子模式

单子模式是Java模式工厂的一种,就是某个类在同一时刻只允许有一个对象,

单子模式就是把构造函数修饰为一个provate类型的,用一个public类型的方法返回类型的引用

代码示例

package com.a51work.cn;

public class aceing {
    // 定义一个私有,静态类型的成员ace变量
    private static aceing ace;

    // 创建一个无参数的构造方法,注意这个构造函数修饰符是provate
    private aceing() {
        System.out.println("aceing类中的无参数构造方法调用了");
    }

    public static aceing getAceing() {
        // 判断ace是否没null,没有指向任何对象
        if (ace == null) {
            // 创建aceing类的对象实例,并把引用赋值给ace
            ace = new aceing();
        }
        return ace;
    }

    public void showMes() {
        System.out.println("执行aceing类的方法");
    }

    public static void main(String[] args) {
        // 通过getAceing方法返回aceing类的对象实例,命名为a1
        aceing a1 = aceing.getAceing();
        // 通过getAceing方法返回aceing类的对象实例,命名为a2
        aceing a2 = aceing.getAceing();
        if (a1 == a2) {
            System.out.println("创建两个对象引用指向的是一个对象");
        }else {
            System.out.println("创建两个对象引用指向的不是一个对象");
        }

    }
}


/*
aceing类中的无参数构造方法调用了
创建两个对象引用指向的是一个对象
*/