我们都知道Java是面向对象的编程语言,面向对象的编程有3大基本特征:封装、继承和多态。本期就来聊聊类的封装。

著名作家钱钟书说过,“假如你吃了个鸡蛋觉得不错,何必要认识那个下蛋的母鸡呢?”

这就是封装的思想,将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体就是类,类通常对客户隐藏实现细节。

--------------封装的优点:

*良好的封装能够减少耦合
*类内部的结构可以自由修改
*可以对成员变量进行更精确的控制
*隐藏信息,实现细节

其实,我刚开始比较疑惑的是,大多数网上看到的资料和我在书上看到的不太一样!那大家也和我一起看下吧

首先网上的资料大多数都是get()set()方法来封装类的属性,步骤如下:

1.修改属性的可见性来限制对属性的访问(一般限制为private)
2.为每个属性创建一对赋值和取值方法(常见为get、set),用于对这些属性的访问
3.在赋值和取值方法中,加入对属性的存取限制。
下面截图给出菜鸟教程上的例子

java自动封装dto java实现封装的机制_System

 

 

 

java自动封装dto java实现封装的机制_java自动封装dto_02

说白了,这只是一个对类的属性进行了封装,接下来,我们聊聊我在书上看到的例子,如下:

package demo;
public class Restaurant {

	private Cook cook = new Cook();

	public void takeorder(String dish) {
		cook.cooking(dish);
		System.out.println("您的菜好了,请慢用");	
	}

	public String saySorry() {
		return "抱歉,餐厅不提供此项服务。";

	}

	public static void main(String[] args) {
		Restaurant waiter = new Restaurant();

		System.out.println("**请让厨师为我做一份香辣肉丝。**");

		waiter.takeorder("香辣肉丝");
		System.out.println("**你们的厨师叫什么名字?***");
		System.out.println(waiter.saySorry());
		System.out.println("**请让厨师给我切一点葱花**");
		System.out.println(waiter.saySorry());

	}

	class Cook{
		private String name;				
		 public Cook() { this.name = "Tom Cruise"; }		 	
		private void cutOnion() {
			System.out.println(name + "切葱花");
		}		
		private void washVegetavles() {

			System.out.println(name + "洗蔬菜");
		}
		void cooking(String dish) {

			washVegetavles();
			cutOnion();
			System.out.println(name + "开始烹饪" + dish);
		}

	}


}

运行结果如下:

java自动封装dto java实现封装的机制_封装_03

上面的这个例子,之前就看过,但并没有get到精髓,其实这里面有很多封装。

首先这段程序涉及到服务员,顾客和厨师,顾客点了一份香辣肉丝,下单的是服务员,上菜的也是服务员,厨师(class Cook)被封装在餐馆中,顾客无法正面接触厨师。Cook类其实属于Restaurant类的内部类,而在Resturant类中封装的Cook类的内部是什么样子的?不仅厨师名字用Private修饰(也就是属性的封装),而且cutOnion和washVegetavles 两个方法也被private修饰(方法的封装),当然后面有Cooking方法相当于把这两个封装的方法调用出来了。

然后我们再来看下怎样跑的,首先在主方法处,顾客要香辣肉丝,然后,对象服务员调用takeOrder方法,接着takeOrder方法里是调用了封装了的厨师类的cooking方法,接着cooking方法里面调用了封装的厨师name属性和cutOnion和washVegetavles方法,最后这段香辣肉丝的代码跑完。从中,我们看到了这种“一环套一环”式的封装,我们也看到了Java的这种封装思想的优雅、面向对象的对象思维,不经意间为我们提供了一种新的思考方式和快乐。