方法
![](https://i-blog.csdnimg.cn/blog_migrate/0c1bfaeda1674e911a50ad771e5a3ba8.png)
这就是方法。
注意点
![](https://i-blog.csdnimg.cn/blog_migrate/27dbd327316fcd1bff3a10c18fd08e46.png)
![](https://i-blog.csdnimg.cn/blog_migrate/798361ad44c5d6364f5ce4d5941da78b.png)
方法重载
需求
![](https://i-blog.csdnimg.cn/blog_migrate/ba895f7615462fed71a21c39ee1af8ba.png)
主要是方法名该怎么取?对于英文确实是一个考验。
而且就是为了相加就出现折磨多函数,也没办法记住,所以java规定了方法重载,功能相同的函数可以起同样的名字。
![](https://i-blog.csdnimg.cn/blog_migrate/c2f240f33fa3d24f751653589b26b643.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e23cca10ac3c30571d1efa6c0dfb558b.png)
只看是否在同一个类,是否是方法名相同,是否参数不同。
而参数不同又分为:个数不同,参数类型不同,顺序不同。
只要有一个不同就可以。
![](https://i-blog.csdnimg.cn/blog_migrate/66d0e116388691a7ab51f0dab70309bc.png)
注意,java虚拟机会通过参数的不同来区分同名的方法。
![](https://i-blog.csdnimg.cn/blog_migrate/87c6e67615224a2e055aca34160bf1ff.png)
上面是返回值类型不同,但是方法重载与返回值无关,所以不构成重载。
![](https://i-blog.csdnimg.cn/blog_migrate/05dcf67d93b9e2d45c451a372de0bb34.png)
![](https://i-blog.csdnimg.cn/blog_migrate/296f8ff8419775c1be8586829904a3bc.png)
两个方法是否构成重载,与返回值类型无关。
![](https://i-blog.csdnimg.cn/blog_migrate/21b75b4e027c9db4e7c24331766dbbf9.png)
不在一个类中,不构成重载。
![](https://i-blog.csdnimg.cn/blog_migrate/ded4a5a5e88fa7faa480ef0cd5bc2f79.png)
![](https://i-blog.csdnimg.cn/blog_migrate/16d6ec2d0e9560fe60cb8cff99b21bd0.png)
方法名一样,形参类型顺序不同,构成重载。
方法调用内存原理
![](https://i-blog.csdnimg.cn/blog_migrate/1590becc728b5f01239a7f4e6de60a9a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2aa3d1792ed76c8c091fb995fe3c2732.png)
![](https://i-blog.csdnimg.cn/blog_migrate/eaadf6bb0307a52927715b10a45c9a00.png)
study执行完之后,study方法弹出栈内存。
然后sleep被调用,所以sleep进入栈内存。
基本数据类型和引用数据类型
![](https://i-blog.csdnimg.cn/blog_migrate/33d7b8fce0ff719b094cc5384f6539b8.png)
基本数据类型变量中存储的就是真实值,存放在栈内存中。
![](https://i-blog.csdnimg.cn/blog_migrate/c11f5de514084177f74ed18f84e3def8.png)
而引用数据类型变量存放的是堆内存中的地址,数据存放在堆空间中。
![](https://i-blog.csdnimg.cn/blog_migrate/119b87781e86dbedbe2c4f28a3726adb.png)
类
![](https://i-blog.csdnimg.cn/blog_migrate/07a332f75c5c4d125afb4d3874cc1363.png)
类中的属性没有指定初始化值的话,会有默认值。
![](https://i-blog.csdnimg.cn/blog_migrate/512b2730edc0e796b718957a574933ac.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b27d44d96c0861fadb0a28b615f5f7b6.png)
封装
面向对象三大特性:封装,继承,多态。
封装就是将一个类应有的属性和行为写到类里面。
![](https://i-blog.csdnimg.cn/blog_migrate/299e3124c4224bb4d600fae6e76a6041.png)
private关键字
![](https://i-blog.csdnimg.cn/blog_migrate/4618b39b23a240bbeb0aca687b5d202c.png)
我们想要的是正确值可以赋值,而不是所有值都不能赋予。出现get和set方法。
![](https://i-blog.csdnimg.cn/blog_migrate/e692f3267e883dbfd8542c2f36b2cc9c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/70842c2e87be8b46b851bdbc56666813.png)
就近原则和this关键字
![](https://i-blog.csdnimg.cn/blog_migrate/fe1162abccf9153cede8f23aa0e22916.png)
![](https://i-blog.csdnimg.cn/blog_migrate/58dd771c0f6e3799fd7811ad4a67a323.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3b4c535c22f32118a4e4b85661beeac6.png)
构造方法
![](https://i-blog.csdnimg.cn/blog_migrate/0b9b565ec4cc399a4077f3c9abd6dcbd.png)
不写构造方法会默认调用空构造方法。声明构造方法只会就不会调用空构造方法。
注意:构造方法是负责对象创建好之后进行赋值,而不是创建对象。
![](https://i-blog.csdnimg.cn/blog_migrate/06dde44b92dc321e4f6181c5c2df7197.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cac8d2626b3034a8e4eed723a4e9603a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5ec1d363333e3564ae4e61d167c317dc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/96b120b93f3c2d6278a02a455ddb48e2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/713ca9c449b91d84836f2675161b7d83.png)
注意,new的时候才算创建对象。
标准javaBean类
给类的标准化建议。
![](https://i-blog.csdnimg.cn/blog_migrate/f01217ac12a1a5027cad77c88d20566b.png)
对象内存图
![](https://i-blog.csdnimg.cn/blog_migrate/10278efe4a43a00196eb6541c18df207.png)
整个JVM所占的内存分为五个部分。
![](https://i-blog.csdnimg.cn/blog_migrate/52813ac1c7c5c907f9ed41fb93f092f6.png)
每一个模块都有自己的责任,我们需要了解栈,堆,方法区。
![](https://i-blog.csdnimg.cn/blog_migrate/7d94490d7afbb9a5ab7115f40ca86fbc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f1b7a44ac3b738ce2edf9b3db8146022.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0dedefc12908b7ec01ae53d5d82d0f8d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c0e9ceb86183a8e5f86e79c23087a38f.png)
实际上成员方法字节码文件在方法区,对空间存的是成员方法的地址。指向方法区该函数。
![](https://i-blog.csdnimg.cn/blog_migrate/cc6dd4edea423fbc35e4fcd0f130fca1.png)
注意,调用s1.study()的时候,会将study方法加入栈内存,该方法执行结束之后,会将该方法弹出栈。
![](https://i-blog.csdnimg.cn/blog_migrate/b605a3508203cf76a8e2c2665579077d.png)
问题是现在再次new一个Student()类,是否还需要在方法区再次加载Student.class文件,答案是不需要。
![](https://i-blog.csdnimg.cn/blog_migrate/4b9ea682e5dc85440597183da379f420.png)
从内存角度解释引用数据类型和基本数据类型
![](https://i-blog.csdnimg.cn/blog_migrate/04743727dfcd1a8fb06afde1880b41c8.png)
this内存原理
![](https://i-blog.csdnimg.cn/blog_migrate/9323984d7050a52fe5bce2bcc8ed7dc7.png)
因为如果不加this,采用就近原则。
this的作用就是区分局部变量和成员变量。
this的本质是方法调用者的地址值
![](https://i-blog.csdnimg.cn/blog_migrate/a258ebccd6cc7a036080c69ebc929051.png)