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类中的无参数构造方法调用了
创建两个对象引用指向的是一个对象
*/