【第6章 面向对象基础】

面向对象基础

接下来,我们要学习的是Java中最核心的课程——面向对象编程。为什么说面向对象是Java最核心的课程呢?因为写Java程序是有套路的,而面向对象就是写Java程序的套路;你如果不知道面向对象编程,那么你Java语言就算白学了。

1. 面向对象入门

  • 面向对象不是一种技术,而是一种编程思想

面向对象这种编程套路(思想)是咋回事呢? 接下来,我们通过一个案例快速的认识一下。

现在假设我们需要处理的是学生的姓名、语文成绩、数学成绩这三个数据,要求打印输出这个学生的总成绩,和平均成绩。

学生的总成绩,和平均成绩。
遇到这样的需求,我们以前都会定义方法来做,如下图所示

注意:这里每一个方法有三个参数

方法1

定义好方法之后,我们调用方法的时候,需要给每一个方法传递三个实际参数

传递三个实际参数

在上面案例中,这种编程方式是一种面向过程的编程方式。所谓面向过程,就是编写一个一个的方法,有数据要进行处理就交给方法来处理。

但是实际上姓名、语文成绩、数学成绩三个数据可以放在一起,组合成一个对象,然后让对象提供方法对自己的数据进行处理。这种方式称之为面向对象编程。

面向对象编程

总结一下: 所谓面向对象编程,就是把要处理的数据交给对象,让对象来处理。

2. 深刻认识面向对象

在上面我们已经用面向对象的编程套路,处理了学生数据。接下来我们就要搞清楚,面向对象的几个最核心问题了。

面向对象的几个最核心问题

我们把这三个问题搞明白,那么你对面向对象的理解就很到位。

2.1 面向对象编程有什么好处?

先来看第一个问题,面向对象编程到底有什么好处呢? 那就不得不谈,Java的祖师爷对这个世界的理解了。

Java的祖师爷,詹姆斯高斯林认为,在这个世界中 **万物皆对象!**任何一个对象都可以包含一些数据,数据属于哪个对象,就由哪个对象来处理。

这样的话,只要我们找到了对象,其实就找到了对数据的处理方式。

万物皆对象

所以面向对象编程的好处,用一句话总结就是:面向对象的开发更符合人类的思维习惯,让编程变得更加简单、更加直观。

2.2 程序中对象到底是个啥?

说完面向对象编程有什么好处之后,这里有同学可能会有问题了,你刚才举的例子中,“汽车”、“手机”、“蔡徐坤”是一个实实在在的东西,你说是一个对象好理解。那我们程序中的对象到底是个啥呢?

对象实质上是一种特殊的数据结构。 这种结构怎么理解呢?

你可以把对象理解成一张表格,表当中记录的数据,就是对象拥有的数据。

把对象理解成一张表格
这就是程序中的对象到底是个啥! 一句话总结,对象其实就是一张数据表,表当中记录什么数据,对象就处理什么数据

2.3 对象是怎么出来的?

刚刚我们讲到对象就是一张数据表,那么这个数据表是怎么来的呢?这张表是不会无缘无故存在的,因为Java也不知道你这个对象要处理哪些数据,所以这张表需要我们设计出来。

用什么来设计这张表呢?就是类(class),类可以理解成对象的设计图,或者对象的模板。

类

我们需要按照对象的设计图创造一个对象。设计图中规定有哪些数据,对象中就只能有哪些数据。

按照对象的设计图创造一个对象

一句话总结:对象可以理解成一张数据表,而数据表中可以有哪些数据,是有类来设计的。

3 对象在计算机中的执行原理

前面我们写了面向对象的代码,也知道对象到底是咋回事。如果我们再搞清楚对象在计算机中的执行原理,那我们对面向对象的理解就更加专业了。

按照我们之前讲的数组的执行原理,数组变量记录的其实数数组在堆内存中的地址。其实面向对象的代码执行原理和数组的执行原理是非常类似的。

其实Student s1 = new Student(); 这句话中的原理如下

  • Student s1 表示的是在栈内存中,创建了一个Student类型的变量,变量名为s1
  • new Student() 会在堆内存中创建一个对象,而对象中包含学生的属性名和属性值

同时系统会为这个Student对象分配一个地址值0x4f3f5b24

  • 接着把对象的地址赋值给栈内存中的变量s1,通过s1记录的地址就可以找到这个对象
  • 当执行s1.name=“播妞” 时,其实就是通过s1找到对象的地址,再通过对象找到对象的name属性,再给对象的name属性赋值为播妞;

搞明白Student s1 = new Student(); 的原理之后,**Student s2 = new Student();**原理完全一样,只是在堆内存中重新创建了一个对象,又有一个新的地址。s2.name是访问另对象的属性。

对象的内存图

4 类和对象的一些注意事项

通过前面的学习我们已经入门了。接下来,关于面向对象有一些细枝末节的东西需要给大家交代一下。
我把这些注意事项已经列举在下面了,我们把几个不好理解的解释一下就可以了(标记方框),其他的大大家一看就能理解。

面向对象有一些细枝末节的东西

第一条: 一个代码文件中,可以写多个class类,但是只能有一个是public修饰,且public修饰的类必须和文件名相同。

假设文件名为Demo1.java,这个文件中假设有两个类Demo1类和Student类,代码如下

//public修饰的类Demo1,和文件名Demo1相同
public class Demo1{
    
}

class Student{
    
}

第二条: 对象与对象之间的数据不会相互影响,但是多个变量指向同一个对象会相互影响。

如下图所示,s1和s2两个变量分别记录的是两个对象的地址值,各自修改各自属性值,是互不影响的。

各自修改各自属性值,是互不影响的

如下图所示,s1和s2两个变量记录的是同一个对象的地址值,s1修改对象的属性值,再用s2访问这个属性,会发现已经被修改了。

s1和s2两个变量记录的是同一个对象的地址值

5 this关键字

5.1 this是什么呢?

this就是一个变量,用在方法中,可以拿到当前类的对象。

我们看下图所示代码,通过代码来体会这句话到底是什么意思。哪一个对象调用方法方法中的this就是哪一个对象

 this关键字

上面代码运行结果如下:

this运行结果如下

5.2 this有什么用呢?

通过this在方法中可以访问本类对象的成员变量。我们看下图代码,分析打印结果是多少

本类对象的成员变量

分析上面的代码s3.score=325,调用方法printPass方法时,方法中的this.score也是325; 而方法中的参数score接收的是250。执行结果是:

考上了

事实上在计算机底层,对象去调用方法时,会自动把自己的地址值当作实参,也会把方法区的方法自动加上对应的形参方便接收

  • 比如上面的s3调用printPass(),底层会为这个方法加上(Student this)

关于this关键字我们就学习到这里,重点记住这句话:哪一个对象调用方法方法中的this就是哪一个对象

6 构造器

6.1 什么是构造器?

构造器其实是一种特殊的方法,但是这个方法没有返回值类型,连void也没有,(因为void也是一种返回类型,只是不能返回值而已)方法名必须和类名相同

如下图所示:下面有一个Student类,构造器名称也必须叫Student;也有空参数构造器,也可以有有参数构造器。

构造器

6.2 构造器的特点

在创建对象时,会调用构造器

也就是说 new Student() 就是在执行构造器,当构造器执行完了,也就意味着对象创建成功。

在创建对象时,会调用构造器

关于构造器的特点,我们记住一句话:new 对象就是在执行构造方法

6.3 构造器的应用场景

其实构造器就是用来创建对象的。可以在创建对象时给对象的属性做一些初始化操作。如下图所示:

构造器的应用场景

6.4 构造器的注意事项

1.在设计一个类时,如果不写构造器,Java会自动生成一个无参数构造器。
2.一定定义了有参数构造器,Java就不再提供空参数构造器,此时建议自己加一个无参数构造器。

关于构造器的这几个问题我们再总结一下。掌握这几个问题,构造方法就算完全明白了。

1.什么是构造器?
答:构造器其实是一种特殊的方法,但是这个方法没有返回值类型,方法名必须和类名相 同。
2.构造器什么时候执行?
答:new 对象就是在执行构造方法;
3.构造方法的应用场景是什么?
答:在创建对象时,可以用构造方法给成员变量赋值
4.构造方法有哪些注意事项?
答:在设计一个类时,如果不写构造器,Java会自动生成一个无参数构造器。
一定定义了有参数构造器,Java就不再提供空参数构造器,此时建议自己加一个无参数构造器。

7 封装性

7.1 什么是封装呢?

所谓封装,就是用类设计的对象处理某一个事物的数据时,应该把要处理的数据,以及处理数据的方法,都设计到一个对象中去。

比如:在设计学生类时,把学生对象的姓名、语文成绩、数学成绩三个属性,以及求学生总分、平均分的方法,都封装到学生对象中来。

什么是封装

现在我们已经知道什么是封装了。那我们学习封装,学习个啥呢? 其实在实际开发中,在用类设计对事处理的数据,以及对数据处理的方法时,是有一些设计规范的。

封装的设计规范用8个字总结,就是:合理隐藏、合理暴露

比如,设计一辆汽车时,汽车的发动机、变速箱等一些零件并不需要让每一个开车的知道,所以就把它们隐藏到了汽车的内部。

把发动机、变速箱等这些零件隐藏起来,这样做其实更加安全,因为并不是所有人都很懂发动机、变速箱,如果暴露在外面很可能会被不懂的人弄坏。

合理隐藏

在设计汽车时,除了隐藏部分零件,但是还是得合理的暴露一些东西出来,让司机能够操纵汽车,让汽车跑起来。比如:点火按钮啊、方向盘啊、刹车啊、油门啊、档把啊… 这些就是故意暴露出来让司机操纵汽车的。

合理暴露

好了,到现在我们已经理解什么是封装的一些规范了。就是:合理暴露、合理隐藏

7.2 封装在代码中的体现

知道什么是封装之后,那封装在代码中如何体现呢?一般我们在设计一个类时,会将成员变量隐藏,然后把操作成员变量的方法对外暴露。

这里需要用到一个修饰符,叫private,被private修饰的变量或者方法,只能在本类中被访问。

如下图所示,private double score; 就相当于把score变量封装在了Student对象的内部,且不对外暴露,你想要在其他类中访问score这个变量就,就不能直接访问了;

如果你想给Student对象的score属性赋值,得调用对外暴露的方法setScore(int score),在这个方法中可以对调用者传递过来的数据进行一些控制,更加安全。

对外暴露的方法

当你想获取socre变量的值时,就得调用对外暴露的另一个方法 getScore()

关于封装我们就学习到这里了。

8 实体JavaBean

学习面向对象编程中,经常写的一种类——叫实体JavaBean类。

8.1 什么是实体类?

实体类就是一种特殊的类,它需要满足下面的要求:

实体类

接下来我们按照要求,写一个Student实体类:

Student实体类

写完实体类之后,我们看一看它有什么特点? 其实我们会发现实体类中除了有给对象存、取值的方法就没有提供其他方法了。所以实体类仅仅只是用来封装数据用的。

8.2 实体类的应用场景

在实际开发中,实体类仅仅只用来封装数据而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离。如下图所示

实现数据和数据业务处理相分离

在实际应用中,会将类作为一种数据类型使用。如下图所示,在StudentOperator类中,定义一个Student类型的成员变量student,然后使用构造器给student成员变量赋值。

然后在StudentOperator的printPass()方法中,使用student调用Student对象的方法,对Student对象的数据进行处理。

将类作为一种数据类型使用

到这里,我们已经学习了JavaBean实体类的是什么,以及它的应用场景,我们总结一下

1.JavaBean实体类是什么?有啥特点
JavaBean实体类,是一种特殊的类;它需要私有化成员变量,有空参数构造方法、同时提供getXxx和setXxx方法;
JavaBean实体类仅仅只用来封装数据,只提供对数据进行存和取的方法
2.JavaBean的应用场景?
JavaBean实体类,只负责封装数据,而把数据处理的操作放在其他类中,以实现数据和数 据处理相分离。

9 成员变量和局部变量的区别

成员变量和局部变量的区别
如下图所示,成员变量在类中方法外,而局部变量在方法中。

成员变量在类中方法外,而局部变量在方法中。

到这里,我们关于面向对象的基础知识就学习完了。面向对象的核心点就是封装,将数据和数据的处理方式,都封装到对象中; 至于对象要封装哪些数据?对数据进行怎样的处理? 需要通过类来设计。

需要注意的是,不同的人,对同一个对象进行设计,对象封装那些数据,提供哪些方法,可能会有所不同;只要能够完成需求,符合设计规范,都是合理的设计。

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值