Java中单例类和不可变类的理解

1.如果一个类始终只能创建一个实例,则这个类被称为单例类。

思路:public static void main(String[] args)不创建实例,而是引用类中方法内创建的实例。

创建一个新对象,使用new,就要使用构造函数。既然是单例,就不能使用构造函数来创建(于是将类中构造函数权限设置为private),只能引用已有的,用getClassname去调用类中方法中创建的仅有只有的一个实例。没有new对象,而在public static void main(String[] args)静态上下文要引用静态方法,则类名.method,必须static。

class Animal
{
	private static Animal instance;
	private Animal(){};
	public static Animal getAnimal()
	{
		if(instance == null)
		{
			instance = new Animal();
		}
		return instance;
	}
}
public class PrivateFinalMethodTest 
{
	public static void main(String[] args)
	{
		Animal a = Animal.getAnimal();
		Animal b = Animal.getAnimal();
		System.out.println(a == b);
	}
}


2.不可变类

final修饰引用对象的变量,则变量指向的对象地址不变,但是对象的内容可以变化。final  int[] iArr = {1,3,2,4},可以赋值iArr[1] = 5,改变对象的内容。而在很多时候,需要类的内容也不可变。例如,创建一个人的类的实例,若名字作为主键,则名字必须不可变。

在Person、Name类中,主类为Person。在主类中,创建一个private final Name name来保存Name类的名字实例Name name,但两者不能指向同一个地址,也就是不能引用同一个对象,在赋值的时候,需要new一下,那么在改动Name  name中的量,无关private final Name name。同样在获取的时候,直接用private final Name name来代替Name name。

class Name
{
	private String firstName;
	private String lastName;
	public Name(){}
	public Name(String firstName,String lastName)
	{
		this.firstName = firstName;
		this.lastName = lastName;
	}
	public void setFirstName(String firstName)
	{
		this.firstName = firstName;
	}
	public void setlastName(String firstName)
	{
		this.lastName = lastName;
	}
	public String getFirstName()
	{
		return this.firstName;
	}
	public String getLastName()
	{
		return this.lastName;
	}	
}
public class Person
{
	private final Name name;
	/*
	public Person(Name name)
	{
		this.name = name;
	}
	public Name getName()
	{
		return name;
	}
	*/
	public Person(Name name)
	{
		this.name = new Name(name.getFirstName(),name.getLastName());  //两者引用不同的对象,地址不同,但是内容相同
	}
	public Name getName()
	{
		//return new Name(name.getFirstName(),name.getLastName());  
		//在获取时用private final Name name,而不是Name name。直接return this.name也一样,没必要new一下。
		return this.name;
	}
	public static void main(String[] args)
	{
		Name n = new Name("Genz","ZHANG");
		Person p =new Person(n);
		System.out.println(p.getName().getFirstName());
		n.setFirstName("bajie");      //改变Name n的内容,无关this.name的内容
		System.out.println(p.getName().getFirstName()); //private final Name name未变
		System.out.println(n.getFirstName());  //Name n的内容改变
	}		
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值