跳转至

Java 面向对象

1. 面向对象

1.1 简述

  面向过程与面向对象都是我们编程中,编写程序的一种思维方式。

  面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程。

例如:公司打扫卫生(擦玻璃、扫地、拖地、倒垃圾等),按照面向过程的程序设计方式会思考“打扫卫生我该怎么做,然后一件件的完成”,最后把公司卫生打扫干净了。

​ 面向对象的程序设计方式,是遇到一件事时,思考“我该让谁来做”,然后那个“谁”就是对象,他要怎么做这件事是他自己的事,反正最后一群对象合力能把事就好就行了。

例如,公司打扫卫生(擦玻璃、扫地、拖地、倒垃圾等),按照面向对象的程序设计方式会思考“我该让谁来做,如小明擦玻璃、让小丽扫地、让小郭拖地、让小强倒垃圾等”,这里的“小明、小丽、小郭、小强”就是对象,他们要打扫卫生,怎么打扫是他们自己的事,反正最后一群对象合力把公司卫生打扫干净了。

1.2 面向对象举例

  买电脑(组装机)

​ 先使用面向过程说明买电脑这件事:假如我们需要买组装电脑,这时首先会在网上查询具体每一个硬件的参数和报价。然后会去电脑城进行多家询价,接着询价结束后回家根据具体的结果分析出自己比较满意的哪家报价,接着会到这家店里进行组装,组装时还需要进行现场监督,组装完成安装相应的系统,然后电脑抱回家。

分析上述整个过程大体分一下几步:上网查询参数和报价、电脑城询价、现场安装和监督、抱电脑回家。在整个过程中我们参与了每一个细节,并且会感觉相当累。

​ 使用面向对象说明买电脑这件事:假如我们需要买组装机,这时应该找一个懂电脑硬件的人,让他帮我们查看参数和报价,并进行询价和杀价,以及现场组装监督。而我们自己并不需要亲历亲为具体怎么做,只要告诉这个人我们想要的具体需求即可。

分析上述整个过程,发现瞬间变的十分轻松,只要找到懂电脑硬件的这个人,我们的问题都可以解决。并且在这个过程中我们不用那么辛苦。

1.3 面向对象好处

  通过生活中的真实场景使用面向对象分析完之后,我们开始分析面向过程和面向对象的差异做出总结

  • 面向对象思维方式是一种更符合人们思考习惯的思想
  • 面向过程思维方式中更多的体现的是执行者(自己做事情),面向对象中更多的体现是指挥者(指挥对象做事情)。
  • 面向对象思维方式将复杂的问题简单化。

2. 类与对象

2.1 对象在需求中的使用

对面向对象有了了解之后,我们来说说在具体问题中如何使用面向对象去分析问题,和如何使用面向对象。

我们把做麦片粥为例进行分析。

在针对具体的需求,可以使用名词提炼的办法进行分析,寻找具体的对象。

需求:做麦片粥

对象:粥、麦片

分三步:

  • 打开麦片袋子
  • 将麦片放进粥内
  • 搅拌

用伪代码描述,上述需求中有两个具体的事物 麦片 和 粥

描述大象:

class 粥
{

}

描述粥

class冰箱
{
    void 打开(){}
    void 存储(大象){}
    void 关闭(){}
}

当把具体的事物描述清楚之后,需要使用这些具体的事物,Java使用具体的事物,需要通过new关键字来创建这个事物的具体实例

使用对象:

  • 创建粥的对象
zhou zh = new zhou();  
  • 调用粥的功能
对象.功能();
zh.打开();
zh.存储(new maipian());
zh.关闭();
  • 总结
1、先按照名词提炼问题领域中的对象
2、对对象进行描述,其实就是在明确对象中应该具备的属性和功能
3、通过new的方式就可以创建该事物的具体对象
4、通过该对象调用它以后的功能。

2.2 类和对象的区别

​ 面向对象的编程思想力图在程序中对事物的描述与该事物在现实中的形态保持一致。为了做到这一点,面向对象的思想中提出两个概念,即类和对象。其中,类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体。接下来通过一个图例来抽象描述类与对象的关系,如下图所示。

类与对象
​ 在上图中,可以将最上面的车模型看作是一个类,将一个个具体的车看作对象,从车模型和车之间的关系便可以看出类与对象之间的关系。类用于描述多个对象的共同特征,它是对象的模板。对象用于描述现实中的个体,它是类的实例。从上图中可以明显看出对象是根据类创建的,并且一个类可以对应多个对象,接下来分别讲解什么是类和对象。

​ 经过前面几个知识点的学习,基本上掌握了类是用于描述事物的,类中可以定义事物的属性和行为。而对象是通过描述的这个类,使用new关键字创建出来,通过对象就可以调用该对象具体的属性和功能了。

2.3 局部变量和成员变量区别

​ 在描述类的属性和前面学习定义变量差别不大,唯一区别就是位置发生了改变,那么类中定义的变量,和在方法定义的变量有啥差别呢?

回忆以前学习时变量的定义方式,和位置,以及现在定义类中属性的特点。总结下面几点异同

区别一:定义的位置不同

  • 定义在类中的变量是成员变量

定义在方法中或者{}语句里面的变量是局部变量

  • 区别二:在内存中的位置不同

成员变量存储在对内存的对象中

  • 局部变量存储在栈内存的方法中

区别三:声明周期不同

  • 成员变量随着对象的出现而出现在堆中,随着对象的消失而从堆中消失

  • 局部变量随着方法的运行而出现在栈中,随着方法的弹栈而消失

区别四:初始化不同

  • 成员变量因为在堆内存中,所有默认的初始化值

  • 局部变量没有默认的初始化值,必须手动的给其赋值才可以使用。

package edemo;

/**
 * @author summer
 * @create 2020-02-03 12:27
 */
public class test {
    private int age = 10;
    private String name = "张三";

    public void speak() {
        this.name = "小强";
        this.age = 18;
        System.out.println("name=" + this.name + ",age=" + this.age);
        System.out.println("name=" + name + ",age=" + age);
    }


}

class PersonDemo{
    public static void main(String[] args) {
        test t1 = new test();
        t1.speak();
    }
}

运行结果是
name=小强,age=18
name=小强,age=18

当在方法中出现了局部变量和成员变量同名的时候,那么在方法中怎么区别局部变量成员变量呢?可以在成员变量名前面加上this.来区别成员变量和局部变量

2.4 总结

类与对象

  • 类,用于描述多个对象的共同特征,它是对象的模板。

  • 对象,用于描述现实中的个体,它是类的实例。

类的定义:使用关键字class来定义java中的类

class 类名 {
  //属性
  数据类型 变量名;
  …
  //方法
  修饰符 返回值类型 方法名(参数){   }
  …
}

创建对象

类名 对象名 = new 类名();

封装(private关键字)

封装,把对象的属性与方法的实现细节隐藏,仅对外提供一些公共的访问方式,封装的体现

  • 变量:使用 private 修饰,这就是变量的封装
  • 方法:也是一种封装,封装了多条代码
  • 类: 也是一种封装,封装了多个方法

private关键字,私有的意思

  • 它可以用来修饰类中的成员(成员变量,成员方法)
  • private的特点:private修饰的成员只能在当前类中访问,其他类中无法直接访问

this关键字,本类对象的引用

  • this是在方法中使用的,哪个对象调用了该方法,那么,this就代表调用该方法的对象引用
  • this什么时候存在的?当创建对象的时候,this存在的
  • this的作用:用来区别同名的成员变量与局部变量(this.成员变量)
public void setName(String name) {
    this.name = name;
}