面向对象
类与对象
类
现实世界中如果事物与事物有共同特征,那么我们就把他们称之为一类,比如鱼类,运动类,电竞类等等。类是人类大脑思考总结出的一个模板,是一个抽象的概念。一个事物都应该具备状态和行为,比如学生,状态包括性别,年龄等等行为包括学习,跑步等等
这个学生的状态我们在类中称之为属性,行为我们称之为方法,假设一个学生性别男,喜欢跑步,那么他就有男这么一个状态和跑步这么一个行为
![](https://i-blog.csdnimg.cn/direct/bb1ba141f73a47eb91433b34bde88d64.png)
所以类 = 属性 + 方法
类中的属性又称为实例变量(对象变量),通常当一个方法表示一个对象的行为时该方法不用static修饰,这个方法又称为实例方法(对象方法),两者在访问时必须先有对象(类的实例化)才能访问。
对象
实际存在的个体,又称示例instance,通过类这个模板可以实例化多个对象,在上面的示例中我们只是大致给出了一个学生的类,没有具体实例化,假设这个学生性别为男,正在跑步。我们就可以通过类来实例化出这个学生对象
![](https://i-blog.csdnimg.cn/direct/fb700956b3054efe9be5f9ea2846c733.png)
引用
引用的本质是一个变量,存储的是通过类实例化后的java对象的内存地址。
可以通过引用访问对象的属性。
访问实例变量有两种方法:第一种读取 引用.变量名 第二种修改 引用.变量名 = 值。
![](https://i-blog.csdnimg.cn/direct/0b045e3fe69e4e04bb1cef7403934906.png)
JVM(Java虚拟机内存分析)
![](https://i-blog.csdnimg.cn/direct/f6b958995b2140dda97d042bff37bf7e.png)
方法调用时的参数传递问题
![](https://i-blog.csdnimg.cn/direct/f15aafe51d6341d49a455b5ec4c838c2.png)
我们先试着分析一下这段代码的运行结果
初学者大部分都会认为结果为:add(i)的值为:11
11
但是i的值实际没有发生变化。
![](https://i-blog.csdnimg.cn/direct/707764c228c54b34a0244f45bd456fc7.png)
那么为什么i的值没有自增1呢,这时候就涉及到方法的调用时的参数传递问题,在我们创建的add方法开始被main方法调用的时候局部变量i被传到add方法的()里,这个步骤就等于() = i;()用来接收变量,而"()"就可以看作是另一个名为()的局部变量,这样当我们将i的值传给()就相当于把i的值赋值了一份传给了(),这两个局部变量互不干扰,比如:
![](https://i-blog.csdnimg.cn/direct/89b6ae7d8e734f53b363a80166d31e1c.png)
当我们在add方法中对i++时,当前的i和main方法里的i已经时两个不同的i只是变量名相同,所以在对add方法中的i++时,main中的i不受影响,进而结果是原来的i不变,add方法中的i自增1。
方法调用时的引用数据类型传递问题
![](https://i-blog.csdnimg.cn/direct/7e4c1537395c4e259aaf70e397ca7e15.png)
试着分析以上代码,写出运行结果。
这里我们还是add方法,但是add方法中的形式参数类型为引用数据类型,结果还和上面的传基本数据类型结果一样吗?答案是不一样。
在方法形式参数类型为引用数据类型时,我们传递的是当前引用所存储的对象的地址,而不管这个地址怎么复制,最终通过这个地址所找到的内容还是一样的,都是s1.age,所以不管我们是在哪里修改这个地址中的内容,它都是修改的这个数据本身
![](https://i-blog.csdnimg.cn/direct/9d6aa775f07c478688ef96c74bd6b618.png)
我们只需要记住当一个方法需要修改参数时,方法调用的时候参数的传递只是把变量复制了一份传到方法里面,只不过有的时候形式参数列表中的数据为基本数据类型,有的时候形式参数列表中的数据为引用数据类型。 当为基本数据类型时原参数(要传入的参数)不变,当为引用数据类型时原参数(要传入的参数)改变。