何先振第9期:面向对象之类的成员

  大家好,我叫何先振。这期开始给大家讲Java的面向对象。

一.学习面向对象的作用

  Java面向对象是Java基础里面的核心,掌握之后我们就可以知道Java程序里面的代码是如何运作以及代码之间的联系,让你在看代码的时候有个整体上的把控。所以说这块是非常重要的一块内容。

二.Java面向对象的概括

  Java面向对象的内容包括三个部分:

  第一部分是类以及类成员的介绍。

  第二部分是面向对象的特征:继承、封装、多态、抽象。

  第三部分是面向对象的其他关键字介绍。

三.面向对象(OOP)和面向过程(POP)的介绍

  第一讲我们讲过,程序设计语言中有面向过程的语言,比如:C语言和C++语言。也有面向对象的语言:比如java、C#。 面向对象和面向过程其实都是一种思想,只不过他们的思想各有特点。  这些语言之所以有这些特点,就是因为他们是基于这种思想被设计出来的。

  人也一样,我们经常会被问到,你想做个什么样的人?比如你说想做个老师、做个医生等等,这些都是你脑海里面的想象,都是虚的,它是要依赖人具体实践出来,体现的。

  面向过程POP(Procedure Oriented Programming),这种思想,强调功能行为,以函数为单位,主要考虑该怎么做。比如:把大象装进冰箱,第一步:打开冰箱;第二步:把大象放进去;第三步:关上冰箱。

  面向对象(Object Oriented Pragramming),这种思想,强调主体,拿到一件事情,首先分析有几个主体,然后在分析主体里面的功能。比如:把大象装进冰箱。分析出有三个主体,人、大象、冰箱,这就是三个对象。

  考虑这三个对象里面的功能。人的功能有:打开冰箱,抬起大象,关上冰箱。象的功能有:进冰箱。冰箱的功能有:开门,关门功能。分析出了这些主体和主体的功能,我们在考虑由谁去做这件事情。 这两种思想在程序中,面向过程写出来的程序更像一个执行者,从上到下让程序执行。

  面向对象写出来的程序更像一个指挥者,指挥着你程序中的对象完成功能。 为什么说面向对象程序语言更能开发出解决我们复杂需求大型的软件呢?这就像平时,我们创立企业的过程,刚开始小公司只有几个人,拿到活大家一起干就完事了。等你公司大到有上百人了,要想配合起来干活,你就得分部门、分小组,每个部分定部门的职责、定部门的规章制度。这样更方便我们管理公司和办事效率。

  程序也是一样,开发复杂需求大型的软件,我们的面向对象程序设计思想比面向过程设计思想更能提高我们的效率和方便管理。 Java在语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构。涉及到Java语言与前端Html、后端数据库交互时,前后端在跟java层做交互时,都体现为类和对象。这也就是说,Java中万事万物皆对象。

四.类和对象

  类:是对一类事物的描述,是抽象的,概念上的定义。

  对象:是实际存在的该类事物的每个个体,因而也被称为该类的实例(instance)。

  可以理解为:类等于抽象概念的人,对象等于具体的实实在在的某个人,比如张三、李四。 面向对象的程序设计的重点是对类的设计。类的设计其实就是类的成员的设计。

  那么类的成员又有哪些?下面我们就来讲类的属性和方法,它们是类的基本成员。

五.类的属性和方法

  一个类它有自己的属性和行为,比如我们人类,属性有名字、有年龄、有两只手,两只脚。这些属性是描述类。

  行为就是这个类可以做哪些事情,比如可以吃饭、睡觉、行走等。

  那么类中通过变量和方法描述这些属性和行为: 属性(Field):对应类的成员变量,变量中存放的数据就是属性。 行为(Method):对应类的成员方法。

六.类和对象的使用

  创建类,通过class关键字,创建类。

  设计类的成员属性和方法: 设计属性,如图:

  设计方法,如图:

  创建类的对象:就是类的实例化,用类名 对象名=new 类名(); 进行创建。

  调用对象的结构:属性和方法。 调用属性的格式:对象.属性。如图:

  调用方法的格式:对象.方法。如图:

七.类和多个对象的关系

  如果创建了一个类的多个对象,每个对象都独立拥有一套类的属性(非静态static的)。这样就意味着如果我们修改了一个对象的属性a的值,不会影响到另外一个对象的属性a的值。

  这种跟数组类似,对象和数组都属于引用类型,创建一个对象,对象名保存的是堆中的地址值。new的时候会在堆空间开辟了两块独立的空间。两个对象名都保存了不一样的地址值,而对象名存的地址值不一样。所以改了一个对象的属性,是不会影响另一个对象里面堆空间的属性值。

  如果我们改变另一个对象的地址值,将对象1的地址值赋给了对象2,那么它们同时指向了同一个堆空间,这两个对象任何一个对象改变,都会引起另外一个对象的属性发生变化。 同一个地址值的对象,属性互相访问。

  改变了任何一个值,都会引起另外一个对象的值改变,改了p3对象的值,p2的也跟着变了。

  下面我们具体来看,对象在内存中的解析,让我们知道出现这种关系的原因。 八.对象的内存解析

  内存中,我们创建了一个p1的对象,先new的时候在内存中的堆空间开辟了一块空间,这个空间的地址值是:十六进制表示0x12ab,里面存放了对象的属性值。如果开始没有赋值就生成默认值,String默认值为null,age默认值为0,isMale默认值为false。new完之后,栈空间会声明了一个变量叫p1也就是变量名,变量名p1保存的是堆空间的地址值:0x12ab。当我们给属性赋值的时候对象.属性。就是拿对象的地址值找到堆空间的属性,然后赋值改变里面的属性值。

  P3和p1两个变量存放的是相同的地址值,所以数据是共享的,改变堆空间的属性,两个对象都可以拿到相同的地址值,访问已经改过的堆空间中的对象属性。

九.属性(成员变量)和局部变量的对比

  相同点:

   定义变量的格式相同:数据类型 变量名=变量值。 都是先声明,后使用。 变量都有其对应的作用域。

  不同点:

  1.在类中声明的位置不同。属性是直接声明在类的{}内:

  局部变量是声明在方法内、方法形参、代码块内、构造器形参、构造器内的变量。方法内:

  方法形参:

  代码块、构造器我们后面在讲。

  2.关于权限修饰符的不同。默认初始化值的情况。属性:类的属性,根据其类型,都有默认的初始化值。

  整型(byte、short、int、long)初始化值为0。 浮点型(float、double)初始化值为0.0。 字符型(char)默认为:0或('\u0000')。 布尔型:boolean默认为false。 引用数据类型:(类、数组、接口):默认值为null

  局部变量:没有默认初始化值,意味着,我们在调用局部变量之前,一定要赋值。如果不赋值就会报错。

  特别的,形参在调用时,我们赋值即可。比如password形参,调用方法时赋值为123456。

  3.在内存中加载的位置不同。属性:加载到堆空间中。(非static)局部变量:加载到栈空间中。

十.类中方法的声明和使用

1.方法的描述:

  方法是描述类具有的功能或行为。比如前面数组我们学到过的Arrays的工具类,里面就有各种各样的方法,能够直接被我们调用,进行排序、查找等功能。

 2.方法的声明:

  权限修饰符 返回值类型 方法名(形参列表){ 方法体 }。形参列表没有可以省略。

  注意:还有些特殊的关键字,我们可以后面讲:static、final、abstract。

3.方法的分类

  可以根据有返回值和无返回值,有形参列表和无形参列表分为四种: 无返回值、无形参列表:

  无返回值、有形参列表:

  有返回值、无形参列表:

  有返回值、有形参列表:

4.方法的说明:

  关于权限修饰符:

  Java中规定的四种权限修饰符private、public、缺省(不填写)、protected。这些权限修饰符加在方法前面,就代表能调用这个方法的范围大小。比如private只能在本类中可以被调用,其他类都不能调用我private私有的方法。public就是公开的,其他类都可以调用。这个讲到面向对象的封装性再详细的说。如图:加了private,测试类不能调用。

  返回值类型: 定义方法时可以有返回值,也可以无返回值。 无返回值:

  有返回值:

  如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法体中需要使用return 关键字来返回指定类型的数据(变量和常量)。如图:有返回值String,必须return 返回一个String类型的数据。

  如果方法没有返回值,则方法声明时,需要使用void来表示。方法体中不需要使用return。

  但是如果使用的话,不能return 后面带返回的数据,此时return只表示方法结束的意思。

  那么我们定义方法时该不该有返回值?我们可以看需求。凭经验,具体问题具体分析。 方法名:属于标识符,遵循标识符的规范,而且要见名知意。 形参列表:方法可以声明0个、1个、多个形参。 格式:数据类型1 形参1,数据类型2 形参2,....

  我们定义方法要不要形参?也是看具体需求。凭经验,具体问题具体分析。 方法体:方法体是方法功能的体现。

  return关键字的使用: 使用范围,是用在方法体中。 作用:结束方法体作用。 针对有反回值类型的方法,使用return 数据,来让方法返回所要的数据。

  注意点:return关键字后面不可以声明执行语句。 方法的使用:可以调用当前类的属性或方法。

  特殊的方法,方法A中又调用了方法A,这种方法叫做递归方法。

  但是不能随便使用,容易出现内存溢出异常,java.lang.StackOverflowError。因为sleep定义了形参,这是个局部变量,方法运行的时候局部变量一直保存在栈中,自己调自己,每调一次,栈中就会有局部变量,但是方法一直没有结束,局部变量一直待在栈中,直到栈存满了,还在调用声明局部变量,这时候栈中的内存不够了,就会溢出来了。

方法中可以调用方法,但是不能定义方法。

十一.匿名对象

  我们创建的对象,没有赋给一个变量名,就叫匿名对象。

  特点:匿名对象只能调用一次,调用之后下次调用又是另外一个对象了。因为每次new 的时候都会创建一个堆空间的对象,他们的地址值是不一样的。两个对象的堆空间不一样,属性值不一样。

  开发中的使用:开发中我们经常会直接new 一个匿名对象,传入到一个方法中。这个实际上是传到方法的形参中,在方法中因为将地址值赋值给了形参,所以方法可以根据形参变量名,使用多次。 如图:new Customter这个匿名对象,传给了showCustomter方法的形参cus,cus可以对这个匿名对象使用多次,因为形参变量里面有保存传进来的匿名对象的地址值。

  以上就是我们这期内容的介绍,学习更多Java知识请点击关注,下期我们开始更深入的讲Java的面向对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值