java 入门--面向对象初探

Posted 可雷曼土

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 入门--面向对象初探相关的知识,希望对你有一定的参考价值。

类与对象

面向对象的想法是模拟现实世界。

把某样东西的状态数据和它的行为封装起来,从而达到易用、重用、隐藏内部状态的目的。

一般的变量,如: 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 吧,爱咋地咋地。

 

以上是关于java 入门--面向对象初探的主要内容,如果未能解决你的问题,请参考以下文章

[Java初探07]__关于面向对象的简单认识

java入门12--面向对象(上)

java入门12--面向对象(上)

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

Java实例 Part5:面向对象入门