1、面向对象
1-1 初识:面向对象
Java是一门面向对象(Object Oriented Program,继承OOP)的语言,也称OOP语言。面向对象即在完成一件事情时,主要依靠对象之间的交互来完成。
1-2 面向对象与面向过程
面向过程:
分析出解决问题所需要的步骤,然后用函数把这些步骤实现,在一步一步的具体步骤中按顺序调用函数。
eg:下五子棋,面向过程的设计思路是首先分析解决这个问题的步骤:
(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。
用函数实现上面一个一个的步骤,然后在下五子棋的主函数里依次调用上面的函数:
面向对象:
在日常生活或编程中,简单的问题可以用面向过程的思路来解决,但当问题的规模变得更大时,用面向过程的思想是远远不够的。所以出现了面向对象的编程思想。世界上有很多人和事物,每一个都可以看做一个对象,而每个对象都有自己的属性和行为,对象与对象之间通过方法来交互。面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。
在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:
(1)黑白双方,这两方的行为是一样的。
(2)棋盘系统,负责绘制画面
(3)规则系统,负责判定犯规、输赢等。
然后赋予每个对象一些属性和行为:
(4)第一类对象(黑白双方)负责接受用户输入,并告知第二类对象(棋盘系统)棋子布局的变化,棋盘系统接收到了棋子的变化,并负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以看出,面向对象是以功能来划分问题,而不是以步骤解决。
2、类的定义
由以上可知,每个对象都有自己的属性和行为,对象与对象之间通过方法来交互。面向对象把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。
2-1 认识类
类是用来描述对象(实体)的,主要描述该实体具有哪些属性,哪些功能。
类:类是一个模板,它描述一类对象的行为和状态。
对象:对象是类的一个实例,有状态和行为。
eg: 定义狗类,其属性有:名字、年龄、颜色;行为有:摇尾巴、叫、吃等
一个狗为一个对象,名字为“小旺”,“2”,“白”;可以 摇尾巴,叫,吃。
2-2 类的定义
-> 定义类的语法格式:
class className{
field; //->称为 字段 or 成员变量
method; //->称为 方法 or 成员方法
}
使用class关键字;className为自定义的类名;类中包含的为类的成员。属性主要用来描述类,称为类的成员属性 or 成员方法;方法说明类主要有哪些功能,成为类的成员方法【方法中的变量为局部变量】。
eg:定义一个狗类:
-> 一般一个文件中只定义一个类;
-> main方法所在的类一般要用public修饰
-> public修饰的类必须要与文件名相同
3、类的实例化
类即是用户自定义了一个新的类型。
类的实例化即是用类类型创建对象的过程【用类产生对象的过程】。
eg:
输出
-> 采用new关键字,配合类名来实例化对象;
-> 使用 . 来访问对象中的属性及方法;
-> 同一个类可以创建多个对象;
-> 成员变量不用初始化。对于引用数据类型,默认为null;基本数据类型为0、false等。
eg:
输出
总结类与对象:
-> 类相当于一个模板。用来对一个实体进行描述,限定了类有哪些成员;
-> 类是一种自定义的类型,可以用来定义变量;
-> 一个类可以实例化多个对象
->实例化对象 ,成员方法调用时会在栈上开辟栈帧,成员变量占用的空间如下图:
4、this引用
首先看个例子:该代码创建了一个Date类,在main中创建了3个对象d1,d2,d3。通过类中的成员方法对对象进行了设置和打印。
4-1 形参名 与 成员变量名 相同的情况
eg1:
形参为局部变量,而局部变量具有优先性。此时这些变量
都是局部变量,不是成员变量了。 输出均为初始值。
eg2:
4-2 this引用
-> this引用,指向当前对象【成员方法运行时调用该成员方法的对象】
-> this的类型: 对应类 类型的引用。即哪个对象调用就是哪个对象的引用类型;
-> this只能在 成员方法 中使用;
-> 在成员方法中,this只能引用当前对象,不能再引用其他对象;
-> this不能出现在静态方法中;
5、对象的初始化
5-1 引入
在java方法内部定义一个局部变量,必须进行初始化。
如下例子,num没有进行初始化,会出错:
如果是一个对象的话,可以编译运行。输出时为默认初始值0。
对象可以,而一个局部变量却不行。这是因为在实例化对象时,调用了其类中不带参数的构造方法。
5-2 构造方法 【可以进行初始化】
-> 构造方法是一个特殊的成员方法;
-> 构造方法的名字必须与类名相同,在创建对象时,由编译器自动调用,在整个对象的生命周期 只调用一次。
eg:
-> 构造方法的作用:对 对象中的成员进行初始化,不负责给对象开辟空间。
-> 构造方法:名字必须与类名相同;
没有返回值类型;
构造方法可以重载;
创建对象时由编译器自动调用,并且在对象的生命周期只调用一次;
如果自己没有写任何构造方法,那么编译器会默认生成一个不带参数的构造方法;
如果用户定义了,那么编译器不生成;
eg:重载:
--> 构造方法中,可以通过this调用其他构造方法
eg:在无参的构造方法中调用带有3个参数的构造方法
-> this()必须放到构造方法的第一行;且不能形成环的调用;【eg:无参调用带3个参的,带3个参的又调用无参】
5-3 默认初始化
即构造方法为对象进行初始化了,初始化的值为默认值。基本数据类型为0,false,/u0000;引用数据类型为null;
5-4 就地初始化
在声明变量时,就直接给了初始值。 -> 不建议
eg: