类与对象
面向对象的想法是模拟现实世界。
把某样东西的状态数据和它的行为封装起来,从而达到易用、重用、隐藏内部状态的目的。
一般的变量,如: int a, double b 等,
我们定义它之后,它就是一个被动的数据,等特着其它代码来操作它。
而对象,不仅含有数据,还有在数据上操作的方法,这样,数据本身就可能隐藏起来了。
外界只需要调用对象的方法来达到操控对象的目的。
这对外界而言,增加了易用性,因为这些专门针对该对象的方法,进行了精心设计,可以避免复杂度,避免一些误用。
对对象而言,因为不直接操作它的数据,就达到了保护内部数据的目的,增加了安全性。
这样看来,相比于普通的变量,对象就好比是更智能化的数据。
对象是一种复合类型,或说复杂类型。
因为对象中,可能会包含多个数据,以刻画对象当前所处的状态,又包含多个方法,描述对象可以做出的行为。
定义一个普通的数据, int a = 100; 就好了,这个类型很简单。
如果还需要第 2 个, int b = ... 也就搞定。
但如果直接定义一个对象,无论怎么设计语法,要给出多个数据,多个方法,都肯定会冗长。
刚写好,然后老板又要再定义 10 个这样的对象,那就要悲剧了。
为避免重复与冗长,一个很自然的想法,是先定义一自己的新“类型”,地位相当于 int,
在这个类型中,把对象应该包含的数据、方法一次性描述清楚。
然后用这个新的类型再去定义对象,不就很清晰自然了吗?
这个新类型,就是我们所说的----类
如下代码定义了平面上的"点",它包含 x, y 坐标,还有方法,比如:到原点的距离, distance。
1 class MyPoint 2 { 3 private double x; 4 private double y; 5 6 public double distance(){ 7 return Math.sqrt(x * x + y * y); 8 } 9 public void set(double x1, double y1){ 10 x = x1; 11 y = y1; 12 } 13 public double getx(){ 14 return x; 15 } 16 public double gety(){ 17 return y; 18 } 19 }
这段代码中对 MyPoint 的描述比较简陋,只有 2 个数据,3 个方法。
数据前边以 private修饰,表示外界不能直接存取这些数据,达到保护的目的。
但这样一来,总得给外界提供某种能够访问 x, y 的方式,否则这些数据就没什么价值了。
所以才有下面的 set, getx, gety 方法,它们负责对 x y 设定新值,以及读取 x y 的值。
下面看看怎样使用 MyPoint 这个新类型。
1 public class A0411 2 { 3 public static void main(String[] args){ 4 MyPoint p1 = new MyPoint(); 5 p1.set(10,20); 6 System.out.println(p1.distance()); 7 System.out.println(p1.getx()); 8 System.out.println(p1.gety()); 9 } 10 }
你可能会觉得,这么绕着弯去操作 x, y 到底有什么好处呢,看起来还不如直接定义 x, y 更舒服呢。
的确,面向对象在效率上确实有些陨失,但换来了安全性。当软件变大,变复杂后,安全性、隔离性就很重要了。
对这么个简单情况,当然看不出什么优势来。
如果一定要看优势,这样想吧,比如我们需要对 x y 的值进行限幅操作,x y 的值被限定在 -1000 到 1000 之间,
超出的,取范围内与设定最接近的值。
此时,我们只需要对 set 方法进行修改就可以了,不需要更动其它代码,尤其是不需要惊动使用 MyPoint 的代码,这是个很大的优势,
因为在大型项目中,MyPoint 和使用 MyPoint 的代码很可能是两个不同的人,甚至是两个不同的团队写出来的。
public void set(double x1, double y1){ if(x1 < -1000) x1 = -1000; if(x1 > 1000) x1 = 1000; if(y1 < -1000) y1 = -1000; if(y1 > 1000) y1 = 1000; x = x1; y = y1; }
这也正是“封装”的含义。
外界只能调用方法,提供必要的参数,而无权干涉对象内部如何处理。
更理论化地说,外界只能向对象发出请求,至于对象如何响应这个请求,外界无法左右。
外界: 求求你,快把你的坐标改为 1200,900 吧。
对象: 才不呢! 1200超范围了,我就设为 1000,900 吧,爱咋地咋地。
原文地址:https://www.cnblogs.com/gyhang/p/8794343.html