天天看点

初识Java——面向对象(一)面向对象(Object Oriented)

面向对象(Object Oriented)

学习了半个月,终于结束了JavaSE的学习,之后的学习就进入了Java的第二阶段——面向对象。面向过程和面向对象作为Java语言中特别重要的思想,但是相对而言这两个知识比较偏向于抽象概念,重在理解,所以在总结过程中为了方便理解会尽量不用官方语言,注重自己的个人理解,但是即使这样,文章中的文字还是会非常多的。

首先,什么是面向过程和面向对象?

很简单,就从字面上理解,这两个都为动宾结构,面向过程旨在过程。举个简单的例子,买车。如果我们要买车的话,首先需要我们挑选自己心仪的品牌,然后确定自己买车的用途,其次锁定几款车型,最后根据自己的预算选定最后要购买的车。不难看出面向对象的弊端就是麻烦、耗费较多的时间、最后的结果也不是最优的。优点就是我们亲身经历,印象深刻,学到的东西更多。

面向对象旨在对象(结果)。还是上面的例子,买车。如果说面向过程是自己亲自挑选车辆,那么面向对象就是告诉销售人员,让他们代替自己挑选,也是我们经常说的指挥。这样的好处就是简单、易上手。但是也有弊端,在初学编程中这样会使我们对底层代码的结构、内容以及运行原理理解不够透彻,不便于我们之后的学习。

面向过程和面向对象一定是互斥的么?答案肯定是否定的。因为我们在处理问题的时候可以完全的面向过程,但是不能完全的面向对象。这句话又怎么理解呢?还是接着上面的例子,如果我们运用面向过程去买车,我们完全可以不用销售帮我们买,自己挑选直至付钱。但是如果运用面向对象的话就不行,看似我们将问题抛给了销售,但是我们之后站在销售的立场,他不能将接到好的问题跑给别人,他还是要经历一个买车的流程(根据顾客买车的用途,其次锁定几款车型,最后根据顾客的预算选定最后要购买的车),也就是面向过程。因此无论怎么面向对象,总有人要去面向过程,所以说不能完全的面向对象。

总结上面所有的话,面向过程才是最基本的思路,而面向对象是基于面向过程的。

现在回想之前写过的代码,从宏观角度来看,都是在面向过程,只是在某一行运用了面向对象。下面举几个例子:

System.out.println("来了老弟~");
//系统过来.输出.在控制台输出(来了老弟~)

Scanner scanner=new Scanner(System.in);
//把那个扫描控制台的人叫过来,这个人的名字是scanner
int a=scanner.nextInt();
//你让这个人从控制台读入一个整数并且给变量a

Random random=new Random();
//把那个生成随机数的人叫过来,这个人的名字是random
int a=random.nextInt();
//你让这个人从控制台随机生成一个属并且给变量a
           

面向对象有什么好处呢?

可以模拟现实生活中的事务,可以实现更加复杂的业务逻辑。举个例子,每个人都在淘宝买过东西,那你买东西的流程:查看商品 ——付款——生成订单——物流信息,以后就能运用面向对象解决这个问题。现阶段复杂的问题解决不了可以选择相对容易的问题:如何描述一个坐标?

在面向过程的思想里面(下图)我们可以发现数据和操作是分开的,这样的弊端就是不方便统一管理

int x,y;
int[] point={1,2};
//如果是一组坐标
int x1,y1,x2,y2,x3,y3;
int[][] points={{1,2},{4,7},{2,5}};
其次对于他们之间的操作
getDistence(p1,p2)  //求两点之间的距离
           

在面向对象的思想里面(下图)好处在于将数据和操作统一起来了

p1=创建一个Point对象并且指定x=1,y=2;
p2=创建一个Point对象并且指定x=3,y=4;
p1.x   p1.y  //访问p1和p2这两个点
p1.Distence(p2)  //让p1自己去计算他和p2之间的距离
           

上面说了面向过程和面向对象,那在编程里面什么是对象?但凡是真实存在的且具体的事物都称为对象。比如:年轻的女生、你家的哈士奇、我......那什么是类?具有相同行为和特征的一些具体事物的总称。类就相当于大楼设计图纸,对象就是由该图纸所建成的具体的大楼,类是用于描述事物的。

那具体描述事物的哪些方面呢?属性等一系列可以用数据表示的以及行为等可以用函数表示的,比如我们要描述一个坐标:

属性 x,y

行为 getDistence()  (两点之间的距离)

注意:建议一个类一个 .java 文件    方便类管理

一下一个图为一个 .java文件

class Test01{
    public static void main(String[] args){
        
    }
}
           
class Point{
    double x;
    double y;
   
    public double getDistence(Point other){
        return 0;
    }
}
           

对象就是由一个类所描述的内容从而产生的一个具体的事物,目前而言,但凡创建对象,用new关键字

格式:类名/数据类型 变量名=new 类名();

class Test01{
    public static void main(String[] args){
        Point p1=new point();
        Point p2=new point();
        p1.x=10;
        p1.y=20;
        p2.x=30;
        p2.y=40;
        System.out.println(p1.getDistence(p2));
    }
}
           
class Point{
    double x;
    double y;
   
    public double getDistence(Point other){
        return Math.hypot(x-otherx,y-other.y);
    }
}
           

对象的内存图解Ⅰ

初识Java——面向对象(一)面向对象(Object Oriented)
  1. 在堆内存中开辟一个空间并分配一个地址
  2. 按照类的描述,在该空间中定义成员变量,并且有默认初始化值
  3. 加载成员函数进入方法区(只加载一次)
  4. 对象创建完毕,将空间地址赋值给相应的变量
  5. 变量(p1/p2)调用成员变量,先通过该变量所存储的地址去堆空间中寻找,然后在该空间中寻找相应的成员变量
  6. 变量(p1/p2)调用成员函数,直接去方法区中寻找该成员函数,将该函数加载进栈内存中,开始运行。为了区分哪个对象调用的该成员函数,由 this 这个关键字来区分,this 主要存的是当前对象的地址。当成员函数在操作变量的时候,先在当前函数的空间里找局部变量,如果没有找到,再去 this 所指向的堆内存中对象所属的空间里去寻找