JAVA入门学习(五)——面向对象与面向过程、封装继承多态、类、对象、变量、this\super关键词

JAVA入门学习(一)——基本数据类型

JAVA入门学习(二)——进制以及进制的转换、数据类型隐式转换的优先级、变量

JAVA入门学习(三)——Scanner、语句类型

JAVA入门学习(四)——数组(包括二维数组、排序)、方法(定义、调用、重载、覆盖、值传递)

一、面向对象与面向过程

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。
而面向对象的设计则是从另外的思路来解决问题⬇。
整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。

功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。

再比如我要把这个五子棋游戏改为围棋游戏,如果你是面向过程设计,那么五子棋的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,五子棋和围棋的区别不就是规则吗?(当然棋盘大小好像也不一样,但是你会觉得这是一个难题吗?直接在棋盘对象中进行一番小改动就可以了。)而下棋的大致步骤从面向对象的角度来看没有任何变化。

当然,要达到改动只是局部的需要设计的人有足够的经验,使用对象不能保证你的程序就是面向对象,初学者或者很蹩脚的程序员很可能以面向对象之虚而行面向过程之实,这样设计出来的所谓面向对象的程序很难有良好的可移植性和可扩展性。

二、类

1.类:对具有共同属性和行为特征的一类事物的抽象。
2.对象:通过类创建的实例。类是创建对象的模板。

3.类的定义:

	class  类名{
       类成员的定义:成员变量,方法,int i;
    }

4.类分为工具类,测试类(程序入口类)

5.构造方法:(构造器)

什么是构造方法:方法名和类名相同,无返回类型。可以有多个
来源:(1)2个途径,一个系统默认
(2)public 类名(){}
(3)自定义
作用:和new一起完成创建对象
使用:new 构造方法
多个构造方法一定重载的,构造方法重载

三、对象

对象的初始化过程(内存): 创建对象时,成员变量会被初始化。

四、变量

变量的分类 定义的位置:成员变量和局部变量
成员变量:定义到类体中
局部变量:方法内或者参数列表
访问范围:
<1成员变量:整个类内
<2局部变量:当前方法

五、局部块和构造块

构造块 : 在构造方法之前执行,初始化成员变量

局部块 :执行完毕,立即回收,可以提高内存的利用率

六、this关键字

this关键字与super关键字

   this:表示当前类对象
   访问类成员:this.成员
   调用本类的构造方法:this(实参);
         		 this()必须是构造方法的第一条有效语句

七、面向对象的三大特征

1.封装

封装的实现:定义私有变量 、提供公有的方法

封装指的是属性私有化,根据需要提供setter和getter方法来访问属性。即隐藏具体属性和实现细节,仅对外开放接口,控制程序中属性的访问级别。

封装目的:增强安全性和简化编程,使用者不必在意具体实现细节,而只是通过外部接口即可访问类的成员。

2.继承

<1.特点:
     什么继承:由已有类产生新类,这种机制叫继承
     父类子类:已有类->父类  新类->子类
     继承性:子类可以继承父类的所有成员(构造方法不能继承)
            有些方法不可以使用的
     java单一继承,一个类只能继承一个父类。
     Object是顶级类
     满足一种关系:is a
     extends 

< 2.继承是指将多个相同的属性和方法提取出来,新建一个父类。 Java中一个类只能继承一个父类,且只能继承访问权限非private的属性和方法。
子类可以重写父类中的方法,命名与父类中同名的属性。

继承目的:代码复用。

❤️.继承关系中的构造方法的调用规则:
a. 子类创建对象时,总是默认的调用父类的无参构造方法;
b.如果父类没有无参的构造方法,使用super()调用指定的构造方法

3.多态
菜鸟教程

多态可以分为两种:设计时多态和运行时多态。 设计时多态:即重载,是指Java允许方法名相同而参数不同(返回值可以相同也可以不相同)。
运行时多态:即重写,是指Java运行根据调用该方法的类型决定调用哪个方法。

多态目的:增加代码的灵活度。

七、形参与实参

实参(argument): 全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等,
无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

形参(parameter): 全称为"形式参数"
由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。
形式参数:形参是函数被调用时用于接收实参值的变量。

根据实际需要可有可无。没有形参时,圆括号也不可省;多个参数之间应用逗号分隔。参数包括参数名和参数类型。

形参的类型说明可有如下两种格式:

  int max(int  a,int b)/*形参的类型在形参表中直接说明*/

    {  return (a>b?a:b);}int max(a,b)

   inta,b;         /*形参的类型在函数体前、函数名后说明*/

   { return(a>b?a:b); }

前者为标准格式,后者为传统格式,通常用前者。

形参和实参的区别

形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。

实参出现在主调函数中,进入被调函数后,实参变量也不能使用。

形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。

1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回

主调函数后则不能再使用该形参变量。

2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形

参。 因此应预先用赋值,输入等办法使实参获得确定值。

3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。

4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值

发生改变,而实参中的值不会变化。

5.当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该

函数运行结束的时候形参被释放,而实参内容不会改变。

而如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参

本身。所以在函数体内部可以改变实参的值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值