提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
关于构造方法:
每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
构造方法
-
格式:
- 以类名为方法名,没有返回值结构,可以有参数
-
1: 每个类都有一个默认的隐式空参数构造方法
- 也就是 创建对象时 一般都可以用 new 类名(); 来创建对象
-
2: 可以自己显式的写构造方法
- 1: 显式的构造方法 不管有没有参数 都会覆盖 隐式空参数构造方法
- 2: 可以重载构造方法,可以根据参数的不同,写不同的构造方法
- 可以实现 创建对象时,可以传入不同的参数,来创建不同初始化的对象
Java允许两种类型的构造函数,即 -
- 没有参数构造函数
- 参数化构造函数
public class Person{
public String name;
public int age;
// 对所有属性初始化赋值构造方法
public Person(String name, int age){
this.name = name;
this.age = age;
}
//对部分属性初始化赋值构造方法
public Person(String name){
this.name = name;
}
// 不传参数的构造方法 部分属性默认赋值
public Person(){
this.name = "Robin";
this.age = 18;
}
}
构造方法也是方法,也可以进行重载
作用:可以有更多的方式去创建对象
在类中的一个构造函数可以使用this(实参)来调用自己其它的构造函数。
class Test{
// 写好构造方法的类 创建对象时 给属性赋值要更简单
public static void main(String[] args){
Person p1 = new Person();
System.out.println(p1.name);
Person p2 = new Person("Robin1");
System.out.println (p2.name);
Person p3 = new Person("Robin33", 18);
System.out.println (p3.name+" "+p3.age);
}
}
单例模式
我们由构造方法引入单例模式。
-
构造方法可以有访问修饰符
-
构造方法设置为私有的访问权限修饰 后:
- 在类的外部无法访问构造方法 也就不能在外部创建对象
- 在类的内部可以访问构造方法 也就可以在内部创建对象
-
限制一个类创建对象的权限:
- 不想让这个类之外的人创建对象,可以将构造方法设置为私有的
- 创建对象,有时候是一件很复杂的事情,交给第三方开发者自己创建就会很难配置成功
- 有时间 一个类可能不能创建多个对象 数量把控。一个国家的国王类 只能有一个国王对象
- 以上这两种都需要这个类自己来提供对象
- 在内部创建对象
- 外部通过 static 关键字来访问
- 不想让这个类之外的人创建对象,可以将构造方法设置为私有的
-
static:
- static 修饰 属性 以及方法 都是可以由类名直接调用的,且只有唯一一份
为什么需要单例模式
有时候我们需要使用一个实用类A,这个类A专门提供一些公共功能供别人调用,而本身并不会处理业务逻辑。由于类A会被许多类乃至线程调用,假设我们的程序非常庞大,在运行的过程中,会访问这个类A100次,为了调用类A的方法,需要先创建A的对象,A a = new A()。这种方法在对A的访问量较少的情况下没问题,但是像我们这种情况,就会创建100个类A的实例,这100个实例是要占用内存的,从这种角度来说,就造成了大量不必要的开销。而单例模式,在整个程序生命周期中,只有一个实例,这样就不会造成不必要的内存消耗
单例模式的特点
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式保证了全局对象的唯一性,比如系统启动读取配置文件就需要单例保证配置的一致性。
public class Person{
public String name;
public int age;
// 定义一个本类唯一的对象 必须是static 修饰的保证 唯一性 不然会报错
private static Person king = new Person ("King", 100);
// 通过 静态方法 返回 单例对象
public static Person getKing(){
return king;
}
// 每次调用都是一个新对象产生
public static Person getPerson(String name){
return new Person (name);
}
// 对所有属性初始化赋值构造方法
private Person(String name, int age){
this.name = name;
this.age = age;
}
// 对部分属性初始化赋值构造方法
private Person(String name){
this.name = name;
this.age= 18;
}
// 不传参数的构造方法 部分属性默认赋值
private Person(){
this.name = "Robin";
this.age = 18;
}
}
class Test{
// 写好构造方法的类 创建对象时 给属性赋值要更简单
public static void main(String[] args){
Person p1 = Person.getKing ();
System.out.println (p1.name);
System.out.println (Person.getKing ().name);
// 第二种 模式 每次调用 都可以拿到一个新对象
Person p4 = Person.getPerson ("gc");
System.out.println (p4.name+" "+p4.age);
}
}
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文介绍了有关构造方法引入了设计模式中的单例模式,而单例模式还有许多种实现方式可以被了解。