面向对象编程

面向过程编程(POP),是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的

我们先回顾一下面向过程:

之前编程都是写一个main方法,程序从上到下都是依次执行,是一个顺序结构,是一个线性思维,面向过程适合处理一些简单的问题,就比如要造一栋高楼,你要做钢筋工,又要做水泥工,呈现出的结果就是一个人要做很多复杂的工作,成本很高

面向对象编程(OOP),是一种以对象为中心的编程思想,通过指挥对象实现具体的功能

面向对象介绍:

面向对象是一种分类的思维,同样是造楼,面向对象的意思是,会找一个总设计师,分配一些任务,给不同的人分工去做,比如说一部分去搞地基,一部分去搞粉刷,而粉刷又可能再分为刷墙,刷门等等,再去继续细分,到了最底下的工作,其实还是要去用面向过程去编程,但是整体的这个架构就变得非常清楚了!所以说分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些问题单独思考,最后才对某个分类下的细节进行面向过程的思索。

面向对象适合处理复杂的问题,适合处理需要多人协作的问题!

总结:

1.面向对象和面向过程是不可分割的,面向对象类似于一个框架,而面向过程类似于一个具体的流程

2.面向对象的本质:以类的方式组织代码,以对象的形式封装数据

补充:

从认识的角度考虑是先有对象后有类。对象是具体的事物。类,是抽象的,是对对象的抽象。

解释:比如说先有很多很多的人,然后把这些人提取出共同特点,也就是咱们的抽象,抽象出来这些人为某一类,比如说这些人都会当老师,所以就统一为教师类,是不是先有了这一个个具体的人的这个对象,然后才抽象出来了咱们这一个个类

从代码角度考虑是先有类后有对象。类是对象的模板。

解释:因为我们先要去设计,先得把要做的事情分好类,然后再去实现,比如说还是人,我们搞一个person类,这个类就是先定义好的,这就相当于一个模板,就会根据这个模板来创建出来好多好多的人对象啊,当然这里的人都是通过new关键字产生的

面向对象的核心思想:

1.抽象(这个概念在上面的补充中说明了,就是共同的特点,也就是类,是对对象的抽象)

2.三大特性:封装、继承、多态 

创建与初始化对象:

使用new关键字创建对象

使用new关键字创建的时候,除了分配内存空间(分配内存空间说白了就是你这个类是一个模板,我new一个对象出来,是不是就是一个特定的唯一的对象,再new一个对象,是不是又是一个独立的对象,两个对象是活生生具体的不同的特定存在!)之外,还会给创建好的对象进行默认的初始化(默认初始化就是对类中的成员变量进行初始化,比如我们String  name;这个成员变量,当new对象的时候,就会初始化这个成员变量,默认会为null,再比如说int age;默认初始化的时候,这个age就会设为0)以及对类中的构造器的调用

对象的真实面目:

类中构造器也称为构造方法,是在进行创建对象的时候必须调用的。并且构造器有以下两个特点:1.必须和类的名字相同、2.必须没有返回类型,也不能写void   3.也没有static

构造器的作用:

1.实例化初始值,就是上面说的,我们在创建对象的时候,这些成员变量的初始化就是由构造器来完成的,会将初始化值进行实例化

2.使用new关键字,本质就是在调用构造器方法

拓展:在类定义中,一旦使用了有参构造,那么无参构造必须显式定义,否则的话无参构造器就无效了。我们创建对象的时候,new的时候调用无参构造方法的时候就会报错!

在创建对象过程中,new后面跟系统默认的构造方法(这里的意思是,在你新建一个类时,即使你在里面什么都不写,它里面也会存在一个系统默认的构造方法,这个我们在java文件里是看不到的,只有在编译了之后,去看这个类的class文件,才能看到这个默认构造方法),实际上就是调用这个构造方法,按照这个类的设计,把成员变量初始化,成员方法赋地址,都保存在new 出来的堆内存空间里,对于堆内存,一般是存放咱们具体创建出来的对象,而前面的对象名,也就是这个对象,是放在栈内存里,栈内存里一般是一些方法,和对一些对象变量的引用。其实我们可以将对象看成变量,而这个变量的数据类型就是该对象的类

使用对象:

1.使用成员变量:

格式:对象名 . 变量名

范例: s. name

2.使用成员方法:

格式:对象名.方法名()

范例:s.study();

类的定义: 类的组成是属性和行为

属性:在代码中通过成员变量(类中方法外的变量)来体现,可以理解为一个个字段

行为:在代码中通过成员方法(和前面的方法相比去掉static关键字即可)来体现(注意:这里为什么不能用静态修饰方法,这是因为对于类来说肯定都是希望通过创建对象来进行使用,而不是说搞成静态方法,当类被加载了,该方法就可以被使用了

一个类里面只有属性和方法,再没有其他的东西

注意:成员变量不能赋值,因为在类的定义中,成员变量只是对这个类的共性属性进行描述,不应该带有个人信息,否则不就变成所有的对象都要具有同种属性

这个定义出的类只是一张设计图,不是具体的事物,所以不能运行

不能加入main方法,因为定义的这个类只是针对学生(定义了一个类名为student)这块进行描述,main方法并不属于描述学生行为的方法

看看下面的示例代码:是不是就验证了之前说过的。面向对象的本质:以类的方式组织代码,以对象的形式封装数据

面向对象的三大特性——封装:

该露的露,该藏的藏:我们程序设计要追求高内聚,低耦合,高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合就是仅暴露少量的方法供外部使用

封装(数据的隐蔽):通常应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐蔽,也就是通过属性私有;get/set

 注意:封装主要是针对于成员变量的,并不针对于成员方法

 核心:关键字private:私有的,和public是对应的,都是权限修饰符,而public是公共的,就是谁都可以去访问,对于private,它就是封装的核心,也就是上面提到过的属性私有,

可以看到,被private修饰的成员变量,在创建对象后,使用对象的成员变量去赋值,发现是不行的!这就是属性私有,

 那如果就要去操作这些被私有的成员变量怎么办?我们就会在类中提供public修饰的get/set方法,get顾名思义就是获取属性的值,set就是给这个属性设置值,这些方法就可以操作这些被私有的属性了,也就是上述说过的通过操作接口来访问!

那么我们讲了封装,那到底这个能干什么?

讲个示例:

我们在这个类里面再写一个age的成员变量,我们知道对于年龄肯定是不会无限增加的,那么我们在利用set方法,给age赋值的时候,给一个999,那么这合适吗?所以说这种数据是不合法的,

 那么这种东西在程序里面是可以规避掉的,我们由于在类中封装过了,所以是不是可以在这个set方法里面做一些检查,这就是封装的好处,可以避免你去破坏这个系统!你想,如果是之前,直接调用变量去赋值,那么不清楚业务逻辑的人是不是就会造成很多的错误数据,破坏了程序的稳定性1

 所以说封装的意义:

1.提高程序的安全性,保护数据!

2.隐藏代码的实现细节,就比如说之前对于age的数据判断,用户只能去设计年龄值,里面的细节用户是不知道的

3.统一接口,就是所有的调用获取都是get/set,形成了一个规范

面向对象的三大特性——继承: 

继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模!(比如说动物,动物是不是很高的一个分类了,我们把它可以抽象成类,那么动物下面是不是还可以分为哺乳动物,爬行动物等等,那么这些分类是不是又可以抽象成一批类啊,那么现在动物这个类是不是下面这一批类的又一次抽象啊,下面这一批类是动物这个类的扩展,那么这就是继承)

extends:它的意思是扩展。子类是父类的扩展! 

继承是类和类之间的一种关系,继承关系的两个类,一个是子类,一个是父类,子类继承父类,使用的是extends关键字来表示

示例:

我们创建一个person类,student类,teacher类。分析一下,人这个类是一个父类,而学生和老师也是人,那么这两个类是不是人这个类的子类啊!那我们用这两个类去继承person这个类

 1.子类可以继承父类的所有方法(子类继承了父类,就会有父类的所有方法,前提是这些方法由public修饰)

首先我们在父类里面写一个成员方法, 

学生类里面没有这个方法

 那现在new学生这个对象出来,发现可以调用say()方法

 2.子类可以继承父类的所有成员变量 (前提是成员变量的修饰符是public,如果是private私有的话,则无法被继承)

注意:只要子类继承了父类,就会拥有父类的一切,当然前提修饰符都是public,但是之前讲了面向对象的三大特性之一的封装,我们知道以后创建包装类,它其中的所有成员变量应该都由private修饰符修饰

那么现在将money由private修饰,意思money只能在person类中去调用,别的类是无法调用的,尽管你student类继承了person类,也是不行的 

money说了,我是父类中私有的,为什么要让你用呢?所以说这些修饰符是有很明显的作用的,就是如果你要让你的子类去继承些父类的东西,它不可能是父类中私有的东西,私有的东西是无法继承的!

那么我们子类现在要怎么去用父类中的私有的成员变量呢?是不是又回到了之前的封装思想,利用public修饰的set/get方法

那么借此机会,再讲讲其他的修饰符: 

1、private修饰的成员方法或者成员变量只能在本类中访问。

2、default修饰的成员方法或者成员变量只能被本包中的类访问。

3、protected修饰的成员方法或者成员变量只能被本包中的类和不同包中的子类访问。

4、public修饰的成员方法或者成员变量可以被所有包中的所有类访问。

注意:以上4点前提条件是类是被public修饰的,类只能被public或者default修饰,另外一个java文件中最多只能有一个public修饰的类。
 

那么一个类中,编写成员变量的时候,前面不加修饰符。比如说  int  age ;那么这里其实前面默认就会有一个修饰符,default修饰符,就是默认的意思 

总结一下:对于修饰符的使用,前提是要知道这个类是什么作用,比如说是包装类,封装数据的,那么这里的成员变量就一定要用private修饰,如果一个类是业务类,那么这里的成员变量你可以选择public、default、protected、至于这些修饰符的选择,旨在于维护系统的稳定性和便于扩展开发以及创建一个规范而已,让代码看着更清晰明了!

说一个快捷键:Ctrl+H,打开当前类继承状态的树结构 

可以看到我们每个类的顶层父类都是一个object类,那么这个类是什么呢? 

示例:

我们把person类中的成员变量和方法都删除完 

再来测试类中去new,person这个对象,然后再用对象去调用它里面的方法看看,发现里面有好多的方法,我们明明没有定义这些方法,

那么这就说明了,有一个类是我们看不见的,就像之前的无参构造器一样,是默认的,那么在java中所有的类都默认直接或者间接继承了object类

 

注意:java类当中只有单继承没有多继承! (说白了就是你一个儿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值