Java访问权限和单例设计模式

原创 2016年08月28日 23:55:22

这里简单说说我对Java访问权限控制和设计模式——单例设计模式的理解。

我们知道关于Java编程语言的特点中有一个叫做封装,我个人对封装的理解有两点:类和访问权限控制。

对于一个类的设计而言,可以分为两部分:属性和方法。好比一个人,他有生理心理上的各种特点(属性),也有着吃穿住行等 一系列行为(方法)。这个人有一个好朋友,但是不管关系多好,这个人都不会允许他的朋友知道他的生理心理上的一些特点,也就是这个人的隐私,也就是说这个人只会允许他的朋友知道他想让他知道的,不想让他知道的就不让他知道。

那么这些东西对应到程序设计里面应该怎么设计呢?

很显然,类的访问权限控制起到作用了。

Java中类的访问权限控制有四种:private,protected,default,public。

对于类的属性,我们应该尽可能的设置为private。类不想除自己之外的类还能获知这一属性,除非特殊情况,这个时候类就会提供相关接口供其他的类访问这个属性。

对于protected、default这两种权限控制,在同一个包中两者功能大致相同:在同一个包中的类都有权限访问这个属性或者方法。但是如果不在同一个包中,两者的区别就显示出来了,假设在包A中的类MyClass有方法fun1()和fun2(),两个方法的访问权限控制分别是protected和default,那么在包中的类如果继承了MyClass,这个类是可以访问fun1(),而不能访问fun2()的。简单的来说,就是在有继承发生的情况下,子类对于protected和default修饰的属性和方法的访问权限是不一样的。

对于public,这是访问权限最大的控制修饰符了,包内、包外都是可以访问public修饰的属性和方法。

那么这和单例设计模式模式有什么关系呢?

这里就涉及到了创建类的实例的过程了。在Java中,类中有一个很特殊的方法叫做构造器方法,它是在对类进行初始化的时候回调用的一个方法。一般情况下,每个类都会有一个默认的构造器方法,但是如果我们为一个类现实的声明了一个构造器方法,这是类在初始化的时候就会调用我们声明的构造器方法。

类中默认的构造器方法:

public class Constractor {
	
	public static void main(String [] args)
	{
		//这里创建一个类的实例创建过程中会调用器默认的构造器方法
		MyClass mc = new MyClass();
		//实例调用类中的方法。
		mc.show();
	}

}

class MyClass{
	//这里会有默认的构造器方法,如下:
	public MyClass()
	{
	}
	//这是类中一个普通的方法
	public void show()
	{
		System.out.println("this ia a common function().");
	}
}
我们显式的声明构造器方法,这个时候就会调用我们声明的构造器方法:

public class Constractor {
	
	public static void main(String [] args)
	{
		//这里会调用我们声明的构造器方法,我们会在控制台上看到输出信息。
		MyClass mc = new MyClass();
		//实例调用类中的方法。
		mc.show();
	}

}

class MyClass{
	//显式的声明自己构造器方法,如下:
	public MyClass()
	{
		System.out.println("this is my constractor.");
	}
	//这是类中一个普通的方法
	public void show()
	{
		System.out.println("this ia a common function().");
	}
}

在看到类的构造器方法之后,如果将构造器方法和访问权限控制结合到一起,这个时候就会发生特别的事情:

public class Constractor {
	
	public static void main(String [] args)
	{
		//在这里我们创建实例的时候,突然发现不能创建类的实例了。
		//下面这条语句会报错。
		MyClass mc = new MyClass();
		
	}

}

class MyClass{
	//显式的声明自己构造器方法,如下:
	private MyClass()
	{
		System.out.println("this is my constractor.");
	}
	//这是类中一个普通的方法
	public void show()
	{
		System.out.println("this ia a common function().");
	}
}

我们发现将类的构造器方法设置为private的之后我们不能创建类的实例了!当然这是合理的也是安全的,我们知道创建类的实例的时候会调用构造器方法,可是如果构造器方法是private,那么类外是不能访问的,除了类的自身。

那么,我们可不可以在类中实现一个方法,它可以访问private构造器方法,而且返回值类型是一种特殊类型——返回值类型是这个类!于是单例设计出现了:

public class Constractor {
	
	public static void main(String [] args)
	{
		//这里我们就可以调用类中提供给外部的接口,得到一个类的实例:
		MyClass mc = MyClass.getInstance();
		//调用其内部的方法:
		mc.show();
		
	}
}


class MyClass{
	//显式的声明一个private的构造器方法
	private MyClass()
	{
	}
	//一个特殊的私有属性,数据类型是MyClss的一个实例。
	private static MyClass instance;
	//这里提供一个特殊方法,返回值类型是MyClass:
	//也是对类外提供的方法。
	public static MyClass getInstance()
	{
		if(instance == null)
		{
			return new MyClass();
		}
		return instance;
	}
	//这里写一个简单的方法.
	public void show()
	{
		System.out.println("this is a common function().");
	}
}

在上面的实现中,可能有些人会感觉到奇怪,我相信这是因为对static的不理解,请读者阅读本人博客中的static介绍或者上网学习,理解了static之后相信必然会豁然开朗。

设计及设计模式:关于Java权限控制算法

 向大家介绍一种很不错,也是Linux中的权限管理算法。  定义a^b为:a的b次方  假如,我们为每一个操作设定一个唯一的整数值,比如:删除A---0修改A---1添加A---2删除B---3修改B...
  • kinglino520
  • kinglino520
  • 2009年07月23日 10:03
  • 223

java多态的实现主要体现在哪些方面

thinking in java3中的多态 People are often confused by other, non-object-oriented features of Java, like...
  • u012110719
  • u012110719
  • 2015年09月16日 17:35
  • 4934

java中多态的体现思想

我们都知道,面向对象有三大特征:封装,继承,多态; 多态:就是指相同的事物的不同状态,比如:水。水可以有三种状态。那么在JAVA中的多态也可以理解成这个意思,就是: 将父对象设置成为和一个或多个它...
  • xusheng_Mr
  • xusheng_Mr
  • 2016年07月21日 00:45
  • 402

Java 构造器与多态

纸上得来终觉浅 Think in Java第八章 多态 1.实现向上转型的原因是由于动态绑定的存在,就是在运行时根据对象的类型对其进行绑定,编译器不知道对象的类型,但是运行中,能根据对象类型调用正确的...
  • Jintao_Ma
  • Jintao_Ma
  • 2016年05月04日 09:58
  • 343

Java中实现类似于C语言的中函数指针的功能

1.什么是函数指针 如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配了一段存储空间,这段存储空间的起始地址(有称入口地址)称为这个函数的指针。可以定义一个指向函数的指针变量,用来存放某一...
  • chenkaibsw
  • chenkaibsw
  • 2018年01月05日 21:24
  • 18

JAVA中使用TCP协议编程模拟C/S模式

JAVA中使用TCP协议编程模拟C/S模式
  • SadOnMyOwn
  • SadOnMyOwn
  • 2016年02月29日 10:30
  • 1164

模板模式的java实现例子 大象放入冰箱

最近在看《Thinking In UML大象》。看到里面讲接口设计的时候,举了“把大象放入冰箱”的例子。自己顺手就写了一下,用到了模板模式 从main方法开始 public static void ...
  • edward9145
  • edward9145
  • 2014年02月03日 18:23
  • 2580

java语言中的多态概述

java语言中的多态概述
  • sun11462
  • sun11462
  • 2015年03月12日 15:00
  • 659

Java三大特性之多态

转载请标明出处:http://blog.csdn.net/wu_wxc/article/details/51463306 本文出自【吴孝城的CSDN博客】 一个行为具有多种表现形式称为多态 如...
  • wu_wxc
  • wu_wxc
  • 2016年05月20日 17:21
  • 487

JAVA经典面试题(二)--如何体现JavaScript的继承关系?

js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承)由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念。所以,要想实现继承,可以用j...
  • JacXuan
  • JacXuan
  • 2017年04月11日 15:28
  • 27922
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java访问权限和单例设计模式
举报原因:
原因补充:

(最多只允许输入30个字)