Java-面向对象(基础篇)--构造方法私有化及对象数组

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

构造方法私有化及对象数组

一.构造方法私有化

1.问题的引出

类的封装性不只体现在对属性的封装上,实际上方法也是可以进行封装的,当然,

在方法封装中也包括了对构造方法的封装。

例:

class Singleton{

private Singleton(){

}

public void print(){

System.out.println("Hello World!");

}

}

从之前的讲解中可以清楚的知道,一个类想使用,则必须要有实例化的对象,现在

要想调用Singleton类中的print()方法则一定要首先产生Singleton的实例化对象,

但是由于此时构造方法被私有化了,所以如果按照如下的程序编写,则肯定会出现

错误。

【错误代码,直接实例化Singleton类对象】

public class SingletonDemo02

{

public static void main(String[] args){

Singleton s1=null;

s1=new Singleton();

s1.print();

}

}

程序运行的结果为:

SingletonDemo02.java:13: 错误: Singleton()可以在Singleton中访问private

s1=new Singleton();

^

1 个错误

从上述错误提示中可以发现,程序是在使用new关键字实例化对象时出现了错误,

而对于声明对象则没有任何的错误,那么该如何解释那?

封装是指一切外部不可见性,那么就意味着在外部根本无法调用被封装的构造方法,既然外部不能调用,那么在内部码?

【在内部产生Singleton的对象】

class Singleton{

staticSingleton instance=new Singleton();

private Singleton(){

}

public void print(){

System.out.println("Hello World!");

}

}

以上的程序编译后,不会出现任何错误,可以正常的完成instance对象的实例化,即此时的问题在于如何将内部的instance对象传递到类的外部,这样外部就可以通过instance来实例化其他的Singleton的对象。那么对象到底该如何取?

2.问题的解决

在前面讲解static关键字时曾经讲过,static类型的属性可以由类名称直接调用,所以此时可以将instance属性声明为static类型,这样就可以通过类名称直接调用。

【将instance声明为static类型】

class Singleton{

static Singleton instance=new Singleton();

private Singleton(){

}

public void print(){

System.out.println("Hello World!");

}

}

public class SingletonDemo04

{

public static void main(String[] args){

Singleton s1=null;

s1=Singleton.instance;

s1.print();

}

}

运行结果为:

Hello World!

由运行结果可以发现,程序成功地取得了Singleton的实例化对象并调用了print()方法。但是这样做本身也存在着问题,因为类中的属性必须封装,所以此处应该将instance属性进行封装,而封装后必须通过方法取得,但是因为instance属性属于静态属性,所以此处必须声明一个静态方法,这样就可以被类名称直接调用。

【使用静态方法,取得Singleton类的实例】

class Singleton{

private static Singleton instance=new Singleton();

private Singleton(){

}

public static Singleton getInstance(){

return instance;

}

public void print(){

System.out.println("Hello World!");

}

}

public class SingletonDemo05

{

public static void main(String[] args){

Singleton s1=Singleton.getInstance();

Singleton s2=Singleton.getInstance();

Singleton s3=Singleton.getInstance();

s1.print();

s2.print();

s3.print();

}

}

运行结果为:

Hello World!

Hello World!

Hello World!

3.程序的意义

在以上的程序中可以发现虽然声明了3个对象,但是实际上所有的对象都只使用一

个instance引用,也就是说,此时不管外面如何使用,最终结果程序中也只有一个

Singleton类的实例化对象存在,在设计模式中称为单例模式,即无论程序怎么运行,Singleton类永远只有一个实例化对象存在。

只要将构造方法私有化,就可以控制实例化对象的产生。

二.对象数组

对象数组的概念其实并不复杂,所谓的对象数组,就是指包含了一组相关对象的集合,但是在对象数组的使用中读者一定要清楚一点:数组一定要先开辟空间,但是因为其是引用数据类型,所以数组中的每一个对象默认值都是null值,则在使用数组对象中的每一个对象都必须分别进行实例化操作。

【对象数组的声明】

类对象数组名称[]=new 类[数组长度];

【声明一个对象数组】

class Person

{

private String name;

public Person(String name ){

=name;

}

public String getName(){

return ;

}

}

public class ObjectArrayDemo01

{

相关文档
最新文档