在阅读不同来源的封装和抽象的定义时,我越来越困惑。真正难以确定哪个是正确的定义。OOP抽象vs封装多个定义
封装定义1
封装:封装是在 使场的技术领域经由公共方法
封装定义2
类私有和提供封装是将数据和功能 掩盖起来的过程le单位(称为班级)。
抽象定义1
抽象造型是用最少的 信息的现实世界对象的一种方式。
抽象定义2
只露出所必需的方法。
请帮助我理解这些词的正确定义与OOP有关的意思。解释正确定义的书的来源也是优选的。
在阅读不同来源的封装和抽象的定义时,我越来越困惑。真正难以确定哪个是正确的定义。OOP抽象vs封装多个定义
封装定义1
封装:封装是在 使场的技术领域经由公共方法
封装定义2
类私有和提供封装是将数据和功能 掩盖起来的过程le单位(称为班级)。
抽象定义1
抽象造型是用最少的 信息的现实世界对象的一种方式。
抽象定义2
只露出所必需的方法。
请帮助我理解这些词的正确定义与OOP有关的意思。解释正确定义的书的来源也是优选的。
谈论代码,抽象只是一段描述真实世界“事物”的代码。大多数时候你无法描述整个“事物”,但是你可以描述它的主要特征,在你的代码中,它将被称为属性。
抽象的一个例子是餐厅:你去,你要求的菜单,并选择你想吃什么......但你不吃纸:你选择你想要看什么它的抽象(菜单)......抽象可能只是说“鸡蛋&培根”,但是当服务员拿到你的订单时,它有一对鸡蛋(炒蛋),两片脆皮培根和其他东西。菜单只是真实的简单抽象事物。
采取Bicycle example in the Java Tutorials:这辆自行车属性:
你在的任何其他特性不感兴趣(在这个例子中)自行车......所以这是一个抽象。
现在,关于封装:在编写代码时,你希望你的对象的属性只在“propper”的方式修改:如果你改变的速度(同样的自行车例子),你可能也必须改变节奏和/或换档。所以,你声明的属性private
只有通过public
方法进行更新,并且,在这些方法中,可以确保所有的属性具有连贯值:
public class Bicycle {
private int speed, gear, cadence;
/**
* Default constructor
*/
public Bicycle() {
speed = 0;
gear = 1;
cadence = 0;
}
/**
* An example
*/
public void setSpeed(int speed) {
this.speed = speed;
/*
You can set the value of the other attributes here if you want to
*/
}
/**
* Another example
*/
public void gearUp() {
if(gear < 5)
gear++;
/*
Here you are preventing other methods to set the gear to
a value higher than 5.
*/
}
/**
* Another one
*/
public void gearDown() {
if(gear > 1)
gear--;
/*
Here you are preventing other methods to set the gear to
a value lower than 1.
*/
}
}
就拿下面的两段代码:
// Snippet #1
public static void Main(){
int sum = 0;
for (int i = 0; i <= 1000; i++) {
sum += i;
}
System.out.println(sum);
}
在上面的代码片段,你的程序计算从0所有整数多达1000你可以看到计算是如何做的总和,你有超过存储和的值的变量控制。
// Snippet #2
public class Adder {
private int sum;
public Counter(){
this.sum = 0;
}
public void add(int value){
this.sum += value;
}
public int getSum(){
this.sum;
}
}
public static void Main(){
Adder adder = new Adder();
for (int i = 0; int <= 1000; i++) {
adder.add(i);
}
System.out.println(adder.getSum());
}
上面的代码片段执行相同的任务,但不同。有一堂课提供了你所质疑的两个特点。它提供是一个抽象到系统添加数字,也封装的的计算是如何做的详细信息。换句话说,它将添加数字的问题以及它从迭代0到1000的数字(在Main函数中)的工作方式分开。
在这个例子中:
的抽象是将数字的概念,所以你将有一个不同的抽象针对每个不同类型的想法
encaptulation是实施细节与主要计划的分离。也就是说,你可以创建同一类型的抽象类新的,但使用不同的实现(一长而不是联合国INT,例如)。
抽象
抽象没有与制作方式的私人或公共的事情。它与识别哪种类型的功能对于某种类型是常见的有关。
在java中的抽象类需要一个步骤进一步比的接口。在接口中,类型X的类必须做X,Y,Z。无论如何,X,Y,Z都可以实现。
一个抽象类说,X型的类必须做X,Y,Z,但一个方法标记为抽象必须做一个特定的方式,也就是它在抽象类(抽象)实现的真实。
封装
它只是将一件或多件事包装在另一件事情中。简化或隐藏代码。为什么你想要这样做的一个例子是简化流程。如果你希望用户能够关闭计算机,例如,你可以既可以有一堆方法的人来显式调用:
Util.shutdownApps();
Util.shutdownServices();
Util.shutdownScreenAndKeyboard();
Util.poweroff();
如果你想关闭以特定方式或只是让有人更容易关闭你可以封装它:
Util
public void shutdown(){
Util.shutdownApps();
Util.shutdownServices();
Util.shutdownScreenAndKeyboard();
Util.poweroff();
}
private shutdownApps(){...}
private shutdownServices(){...}
private shutdownScreenAndKeyboard(){...}
private poweroff(){...}
关于Barranka的回答,任何一段代码都可以描述真实世界的事物。有一个抽象类没有意义,如果你只有一个*类型。有人肯定会说哦,但有一个接口会更好的可测试性。但是如果你有一个为什么要做额外的代码?当你发现你需要不同类似的类型时,你可以重构。 – Savan 2015-03-02 18:59:43
没有一个正确的定义。你给出的每个版本都讲述了*封装/抽象,但是并没有权威地定义*它。 – 2015-03-02 18:28:13
[在java中如何封装与抽象不同作为面向对象的概念?](http://stackoverflow.com/questions/8960918/how-encapsulation-is-different-from-abstraction-as-a-object面向概念的) – Tachyon 2015-03-02 18:30:06
由于这些都是概念,所以没有全球接受的具体定义。例如,大多数人会在上面的问题中查看封装的两个定义等同于...学习使用Google和维基百科...他们是你的朋友。 – RudolphEst 2015-03-02 18:32:00