JAVA程序设计——对象、单例设计模式

这周只总结两个难点:对象的创建、赋值与单例设计模式:

目录

对象创建的方式

1.根据new关键字来创建一个新的类:

 2.使用newinstance方法:

3.两种方法创建的异同:

单例设计模式

对象的使用与垃圾回收机制

1.对象赋值

2.对象的垃圾回收



对象创建的方式

1.根据new关键字来创建一个新的类:

扫描二维码关注公众号,回复: 10749427 查看本文章

这种方式一般没有什么限制,对于之前讲过的构造方法的重载也同样适用。

 2.使用newinstance方法:

ClassName NewClass = ClassName.Class.newinstance();
ClassName NewClass = (ClassName)Class.forName("ClassName").newinstance()

以上两种对象创建的方法都使用了instance()这个方法。

3.两种方法创建的异同:

  • new关键字对于任何构造方法都可以进行构造,上一节中已经写过构造方法重载与构造方法
  • instance方法只适用于无参构造
  • instance方法的本质是对new关键字执行的操作分成了两部,首先实现类加载,之后将类进行实例化。
  • newInstance: 弱类型。低效率。只能调用无参构造 
  • new: 强类型。相对高效。能调用任何public构造

单例设计模式

在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。

首先注意几点:

每一个这个模式的类只有一个实例,也就是说,该类只能实例化一个对象,所以我们的构造思路如下:

(以下将Cat类用为单例构造模式)

  1. 因为需要单例构造,那么每次new生成新对象时,系统都会进行构造方法对新对象进行实例化。
  2. 此时不利于将对象单例化,因为每次调用根据构造方法都会生成一个新的对象,所以必须将构造方法私有化!确保外界构造的新对象时不可通过此构造方法来进行生成对象。
  3. 但是此时也不会保证对象单一化。所以考虑将构造新的对象封装起来,在本类中设立一个GetNewInstance方法并在类中设立一个私有类的静态Cat类的对象,在此静态的原因参考:因为无法进行new关键字生成一个新的对象(构造方法私有化!),所以只能通过类名.方法进行调用方法,通过方法返回值得到新的对象。因为要使用类名.方法调用,所以只能调用类中的静态方法,既然是静态方法,那么只能调用静态成员变量。
  4. 因为构造方法私有,所以可以在类中调用构造方法。首先将类中的cat对象地址赋值为NULL,然后在GetNewInstance方法中,判断一下是否cat对象已经存在如果存在就直接返回该对象地址,否则就调用类中方法。

以下代码给出测试与步骤:

class Cat{
	///1.私有构造方法(外界不可访问)
	private Cat() {
		System.out.println("A new instance created!");
	}
	///2.外界不可访问,所以只能本类中访问,所以需要一个私有对象!
	private static Cat Instance = null;
	///3.创建一个共有访问的获得实例的方法
	public static Cat GetNewinstance() {
		if(Instance==null)
			Instance = new Cat();///自己创建自己
		return Instance;
	}
}

那么在主类中进行测试:

输出结果发现:

A new instance created!
Test.Cat@52cc8049
Test.Cat@52cc8049

 Cat对象只被生成了一次,所以成为单例设计模式成功!

总结来说,单例设计模式的一般步骤在上述代码注释中:

  1. 设计私有构造方法
  2. 设计私有静态成员类变量
  3. 设计GetNewInstance()方法

对象的使用与垃圾回收机制

1.对象赋值

运行如下代码:

得到结果:

A New Instance Created
A New Instance Created
leglenth is 2
leglenth is 4

下面进行对象的赋值:

增加a=b的赋值操作,可以观察到此时的输出结果为:

A New Instance Created
A New Instance Created
leglenth is 4
leglenth is 4

由此可以得出a=b的赋值操作,实际是将b的地址赋值给了a,那么a的地址就被覆盖为b的地址,在C中学习可以知道地址如果改变一个变量的内容就会彻底改变。

对此做出思考:

如果地址为空,是否可以调用一些属性或者方法?——不可

a被覆盖后,a的地址去哪了?——垃圾回收

2.对象的垃圾回收

1.java系统中是自带垃圾回收的,不过该方法触发只在内存接近饱和的时候才会调用垃圾回收机制。

2.手动垃圾回收:

system.gc()函数

发布了157 篇原创文章 · 获赞 146 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43857314/article/details/105042964