![27e8cafba34aac4c05fbe4d9238f6f23.png](https://i-blog.csdnimg.cn/blog_migrate/faba354eb40d184a975885e0d0064ede.jpeg)
构造器—static—this—block
- 构造器
构造器|构造方法|构造函数
* new会做3件事情:
* 1.在堆中为对象开辟空间,成员属性会跟随对象进入到堆内存中,并赋默认值。
* 2.调用构造器为对象初始化信息。
* 3.把地址反回给引用。
构造器的作用:
* 为对象初始化信息,但不是创建对象的作用。
构造器如何使用:
* 只能跟随new一起使用
* 定义:
* 修饰符 类名([参数列表]){
* 方法体;
* }
![e49f2f3bacf42cbf301c02c83727d05c.png](https://i-blog.csdnimg.cn/blog_migrate/c2db9978844f42edc570119064c7d326.jpeg)
如果没有在类中自定义构造器,编译器会默认为我们提供一个空构造(没有参数)
![ab13fa44b459ba2a4e3ec36d030e657a.png](https://i-blog.csdnimg.cn/blog_migrate/4ee2ab27344128367a8d9f5b7297b6b3.png)
如果类中有自定义构造器,编译器都不会在为你提供任何构造器包括空构造
![dde7929e31ec18f40a44754f3cecd221.png](https://i-blog.csdnimg.cn/blog_migrate/c206fefb7cd23d69c1edab71b953820b.png)
此时拿到了空构造里面的内容!
![e331d672551af355f33eb100114927f2.png](https://i-blog.csdnimg.cn/blog_migrate/b6b8fe955de9240a11ff3b9fa98a312f.png)
![9b3dfef7d69fda6ff61d28d14695ab42.png](https://i-blog.csdnimg.cn/blog_migrate/937a38bb8eadceca283fa12022904860.png)
这个就是说明了只要创建了对象就会使用构造器。
一个类中的多个构造器可以构成重载,调用的时候匹配实参即可。
![9e5b50591daf36816cd905b7def03a10.png](https://i-blog.csdnimg.cn/blog_migrate/2564baaa0d1eee26998dadc5dbffa839.png)
![f3aeb8d4644204d1c0beb55ea6b04ba7.png](https://i-blog.csdnimg.cn/blog_migrate/4823119faacff22f307902e03079a234.png)
此时利用构造重载比较方便。
此时构造器为你的对象属性赋值了。对名字赋值了。
![0e82e476714418008250b1b5ae02767f.png](https://i-blog.csdnimg.cn/blog_migrate/3f34b4fdeff8fd90d4a98264bc69d3ff.png)
![02deb2ef8f780c6101234199afae4e4b.png](https://i-blog.csdnimg.cn/blog_migrate/0d05116a4e2e7f17f293eb7acfb10d17.png)
构造器能创建对象的同时并赋值。
![3247a888b72b82d88e68c9e3a20d8691.png](https://i-blog.csdnimg.cn/blog_migrate/63ea30436aeb5d189a764d527ea367d9.png)
![1d402cb3cb68eb06e7d692abb8873cb4.png](https://i-blog.csdnimg.cn/blog_migrate/cb7f3b416269ef795f229247e1d737e2.png)
此时狗的名字叫做”王大锤”了。
如果你能在创建对象的时候你就能确定一些或者全部成员的属性,你就可以调用构造器(带参构造器)创建对象的同时为他赋值。
![7a729fe395ed09841474b5c07c44f8da.png](https://i-blog.csdnimg.cn/blog_migrate/73bff62ce63bd4ab2bd69a5eed8ad45b.png)
![0826daa03e48e0317d8892f6d80175f3.png](https://i-blog.csdnimg.cn/blog_migrate/30a3feca63182daa9a90b8501567bbf6.png)
![134880e772622f21c0a4dc521beefcae.png](https://i-blog.csdnimg.cn/blog_migrate/3f0fe3bc5dc4f7df3b3cb0da39ed53a3.png)
此时报错,将空构造器给注释了,导致第6行代码出错。
![273b854204583c0e34dce62c42a31545.png](https://i-blog.csdnimg.cn/blog_migrate/8c2647ce671556eaf784a771d55b93ba.png)
若将空构造器的注释给去掉(把空构造器给放出来)则不会报错。
一个类中的多个构造器可以构成重载,调用的时候匹配实参(以上例子说明了此点)
构造器没有返回值类型,也不需要void,可以根据需求添加return,但是不能返回数据
![ee929d9221c8fc13fd541e7c1a807970.png](https://i-blog.csdnimg.cn/blog_migrate/3b4de1b21c068fdd7f6d352357758ebe.png)
![4350fa339d8adb81d57e5a78bd8662f1.png](https://i-blog.csdnimg.cn/blog_migrate/e439639358a7fc207ef774b3f3a32872.png)
![2b4b94988125b18001ed434f56c82163.png](https://i-blog.csdnimg.cn/blog_migrate/ba34e33ff31e36156444acd8b5cb9cfe.png)
Dog dog2=new Dog("哈哈");若将“哈哈”换成“哈哈2”,这输出的结果为:
![4eb562a4c16c76b99ee5ea284eb23881.png](https://i-blog.csdnimg.cn/blog_migrate/2f128e072d9ae6383162562157aa584d.png)
构造器不能被final,abstract,static修饰
* 构造器如果修饰符为private,只能在当前类中创建对象
*
* 构造器是特殊的方法,定义和使用比较特殊,但是依旧拥有方法的特性重载,作用就。是为对象初始化信息
二、This
* this 代表当前对象(当前new的对象)本身,存储当前对象的地址
* 构造器中使用,构造器的“首行”使用
调用本类中的其他构造器 this(参数列表) -->实参
![e20dcb47344902360e346ec651c5fa2b.png](https://i-blog.csdnimg.cn/blog_migrate/067aaa9a5db0a09a01947d203bbcec01.png)
![511650c1aa5e7124c1a762bcafc58054.png](https://i-blog.csdnimg.cn/blog_migrate/e9619d1a03b66f2ade3c682b1b580394.png)
图表 1注意:this必须放在首行,否则会报错。这个“this”是指当前对象,即Flower f = new Flower("红色","玫瑰花",1,12); Flower 类的。
![20ef11dba7991a77ddb550c92f0cb629.png](https://i-blog.csdnimg.cn/blog_migrate/38c5fcd8d93e602c63109fe8c9bcbd39.png)
此代码是调用空构造器
结果是先执行“我是空构造”之后,回来在执行“我是4个参数构造器”。
执行过程是5291730;
![02e4f14f9219ada00ab305ae68d642b0.png](https://i-blog.csdnimg.cn/blog_migrate/9671db139111734e29288c5fecf13c03.png)
![c8fadcea26265676107a63d9d6094db7.png](https://i-blog.csdnimg.cn/blog_migrate/6273082235f0543309a81253bea385af.png)
此代码是在空构造中调用this,此时可行的,代码可以正常执行。
![e9714dc91bf672937c8f5f40992fb4d5.png](https://i-blog.csdnimg.cn/blog_migrate/f765a73a46200d2e28504e0cb63579cf.png)
备注:两个构造器互相调用则会出错。
![a107ec537152a061999a4fe7458dbfe7.png](https://i-blog.csdnimg.cn/blog_migrate/de7606176206d7534210c30778e0238b.png)
此处的三个“color”是同一个。即是同名的成员。
![c7a27a8a559ce15d117efe50206bd11c.png](https://i-blog.csdnimg.cn/blog_migrate/214b845c39aa0591b3331c995eec5f9f.png)
此代码比上一个代码做了简化。只满足首行的调用。
![9ac29c1c480482288331d3d99f4ed2e7.png](https://i-blog.csdnimg.cn/blog_migrate/0b87165019e3b0ddfa0b9d0d3edbd991.png)
![eb5ad34867d021bedf53d2b61d0b00c9.png](https://i-blog.csdnimg.cn/blog_migrate/00a9e44c03429ca3f12ce7546f8e7625.png)
![2e055fd25486bb39e9aa6a90ae27d846.png](https://i-blog.csdnimg.cn/blog_migrate/e78b18d506b2c115859a8acbfe6c6539.png)
说明这样简化操作是可行的。
作用:可以帮转我们简化代码
*
* 注意:
* 1.必须在首行
* 2.构造器之间不能相互调用
![cb4589517888f437b41ed91ca9013e5c.png](https://i-blog.csdnimg.cn/blog_migrate/d73d5e81d3a8b2a8467a9e19ee06f02c.png)
![d97e5ac9d0b6d39734eb36ad94bdd4c7.png](https://i-blog.csdnimg.cn/blog_migrate/b4026c5e4f91b4c0527a3a1cea695909.png)
![07889dc469cf9d76f1e407709dddcd9f.png](https://i-blog.csdnimg.cn/blog_migrate/e161d7085ec2a2f81b8d798ad3cdf0de.png)
![d97e5ac9d0b6d39734eb36ad94bdd4c7.png](https://i-blog.csdnimg.cn/blog_migrate/b4026c5e4f91b4c0527a3a1cea695909.png)
![f82290c1302326f45131eb95f30dcc06.png](https://i-blog.csdnimg.cn/blog_migrate/773f8624ef8fb07f723df0fdf92c2371.png)
![fa85dc94b036e261dba9fd0f12177886.png](https://i-blog.csdnimg.cn/blog_migrate/abfa74d7f5a0b401f9e3917a71063dd3.png)
![19d8197522708665726c634e231f5c85.png](https://i-blog.csdnimg.cn/blog_migrate/66398271371e80a92ce29297bea0964a.png)
若在方法open方法中加入参数“String color”,此时改成f.opoen(“紫色”);
则运行结果是“紫色花开了”。此时就是出现了“就近原则现象”,即就是新加入的参数String color离open最近。
![eadb45588087563beab9939dfa037e9c.png](https://i-blog.csdnimg.cn/blog_migrate/e6988e7e547bcee3ae23456c8f52f76c.png)
区分同名变量问题:成员方法中使用,构造器中..
* 局部和成员之间.. 会发生就近原则,指向同名的成员,使用this
* 成员方法中,this代表当前调用成员方法的对象
![85b6b467f2dac6d62e6a9702cbad565b.png](https://i-blog.csdnimg.cn/blog_migrate/3037ef25840981be56e0569e968bad41.png)
解释一下,谁调用的open?,是f,f中存着Flower的地址0x001, f.open执行的时候它里面的成员变量color
![21f025bdcf5fec01423026c184e0f05a.png](https://i-blog.csdnimg.cn/blog_migrate/bceb5178826b39040805283dcdb9a471.png)
![363b2e57e539381e485fd829ef03110c.png](https://i-blog.csdnimg.cn/blog_migrate/21a19e2fa6f9722b9d1d98b32325cce5.png)
此时的运行结果就是“红色花开了”。
![afa2568adeb147489981a971aa9cd4d7.png](https://i-blog.csdnimg.cn/blog_migrate/756d8137b8afbd227ccf36d402e90b94.png)
此处this写不写都无所谓的。
![2d52f338cfceaa68210f736f9d59c6ad.png](https://i-blog.csdnimg.cn/blog_migrate/ad8f12507ce36dcc8fd08e008596457e.png)
![7e5ac95ed2157d91c4eb08fe032455d0.png](https://i-blog.csdnimg.cn/blog_migrate/7731fdc8ed4ef5e6fc998445e21faf58.png)
此时在num面前加上this
![f8aa33cc7a6ebf1ed1ffc7e4f0d4e654.png](https://i-blog.csdnimg.cn/blog_migrate/0b8cec50d8f0d7e109b16a0c693830ec.png)
如果同名,不适用this调用,默认发生就近原则
* 如果不存在同名问题,使用成员变量,前面默认省略了this
![a314748009b5fdf8fe5abd78997241cd.png](https://i-blog.csdnimg.cn/blog_migrate/0a3622c59cb562270fb115c6b05b6f4d.jpeg)
![bc66b8f49a0e9c5790018eb5b4044994.png](https://i-blog.csdnimg.cn/blog_migrate/3f6eedf82e90c124f8dc6967a1c01986.png)
![ab46ec04aaeb38b7399eba11a9b20856.png](https://i-blog.csdnimg.cn/blog_migrate/09d64f23e7c19590a5bd706873bd3d5d.png)
![bd8ffab6a27e8c5607a0a55e8a9d3e66.png](https://i-blog.csdnimg.cn/blog_migrate/32a912189d549a117787186828d0ea71.png)
不同的对象,每一个对象调用了open,它里面的this就是指那个对象。即是f2。
构造器中区分同名:
* this-->当前new的对象
![dd5f6deecef342306bf4d6b1317937db.png](https://i-blog.csdnimg.cn/blog_migrate/f9a18cb2f0968829eb556d0757f490c0.png)
此时代码更简洁了。
this不能使用在static修饰的方法中。
三、static 静态的 是成员的修饰符。
static修饰变量-->静态变量|类变量
static修饰方法-->静态方法|类方法
static 还可以修饰类和块。
Static 只能修饰成员,不能修饰局部的。
![288a35c7dfbfcce8570b09615fd65473.png](https://i-blog.csdnimg.cn/blog_migrate/51e053020d1816ae5238740d7e984440.png)
此时输出的结果a是5。
![4d65288aec5a6f240925fbf0372d4f30.png](https://i-blog.csdnimg.cn/blog_migrate/89eb4a35a99da4cd525e02f05142003e.png)
![573ff19026231e0b7e1519885f44a558.png](https://i-blog.csdnimg.cn/blog_migrate/3a1b89ae825a4acd3b396f44573b4284.png)
![01f0fc677755c69e7646d780ac5ef695.png](https://i-blog.csdnimg.cn/blog_migrate/0334e92c19dba814f22a71d09a4d859a.png)
![d4edb34182672a0ddce19f0830c67b0c.png](https://i-blog.csdnimg.cn/blog_migrate/f4cd5f055f6c7fd44db54b73ea00eb76.png)
成员是属于对象,静态的属于类的。
因为成员是根据一系列的对象,一系列的事物抽取的共性,写在当前类这个模板之中。凡是这个类里面的成员都有这个共性。这些方法都能使用的。
静态内容的使用:
* 类名.静态变量名
* 对象.静态变量名
* 类名.静态方法名([参数列表]);
* 对象.静态方法名([参数列表]);
![006b71b91b93e68a4df7a29311f4046f.png](https://i-blog.csdnimg.cn/blog_migrate/a8490a2ddaf61f33289d7fae9306051f.png)
![194ffd59d585ec9db223beb76ebc3fc1.png](https://i-blog.csdnimg.cn/blog_migrate/cd9ce8b1f0bd8a415df89d5b3062b49e.png)
![333863e9bfe9bbd315c8d62a024fb386.png](https://i-blog.csdnimg.cn/blog_migrate/88f0cc003cad7f65f30826d27f836218.png)
如果静态的内容中可以直接使用静态的内容,但是不能直接使用成员的内容,通过对象去使用
* 如果成员的内容中,可以直接使用静态的内容,可以直接使用成员的内容
![2ed86cac2b548ac59a22475bd7cdaac3.png](https://i-blog.csdnimg.cn/blog_migrate/929de4c5df00246f8ebadf2b8120ee18.png)
![8a5c365563b4f4346aff941fc2d3253d.png](https://i-blog.csdnimg.cn/blog_migrate/6629eb3e4c2229363502e65010f223c2.png)
静态内容:
![c70d9bc5dcb021574773e1aff267fc14.png](https://i-blog.csdnimg.cn/blog_migrate/f332110548e075a875703e818f051cff.png)
![9fb08d072ea79769d9ddf1e46538a1bd.png](https://i-blog.csdnimg.cn/blog_migrate/10cd8f3a4fa6e718eaff55cff4558a59.png)
![73ef3fb7f0de02b6c1de5911eeeea83f.png](https://i-blog.csdnimg.cn/blog_migrate/11ca4ec79465bc0c72c2bf259db1dd8a.jpeg)
![94889d8922f889707090b493a2882e04.png](https://i-blog.csdnimg.cn/blog_migrate/9fb8f07d8d09c56ea41068f769fcf6cf.png)
成员内容:
![ead4da1e818566d2a8ccfd6acc35066b.png](https://i-blog.csdnimg.cn/blog_migrate/577c7f230a961fcb71cada67b0e477ed.png)
方法不调用不执行
* 成员方法:没有static修饰的方法
* 对象.方法名();
* 静态方法:static修饰的方法
* 类名.方法名(); -->执行方法中的代码
* 对象.方法名();
*
* 什么时候方法定义成成员方法:
1.必须存在对象才可以使用
2.是否想要在方法中直接使用静态和成员的内容
* 什么时候方法定义成静态方法:
1.没有对象可以使用,这个功能,这个属性不从属于某个对象 。
2.只能直接使用静态的内容,不能直接使用成员的,不能存在this。
四、块
{} -->作用域
* {}-->方法中 ==>局部代码块|普通语句块 执行时机:调用方法
![fb9abd1543e6c86288f1bd38976ab8a1.png](https://i-blog.csdnimg.cn/blog_migrate/fb2411a1f081a837193ae0c2c0b4a7c4.png)
![0408c5bf5db3dcd6bb375e2fe01c48e4.png](https://i-blog.csdnimg.cn/blog_migrate/0c61ef7c89269c7895ad0485e1f2e780.png)
代码在执行过程中给a重新赋值了,此时a的值为10。
![68572657758faaebd7a1f1178f2366fb.png](https://i-blog.csdnimg.cn/blog_migrate/9b3784ab3fdabd05859d62f8df945cae.png)
注意:局部在代码中声明,在代码中调用。
![4d347b391f64eb65345d211badae5bb2.png](https://i-blog.csdnimg.cn/blog_migrate/3e90a1256b7998b2c34cd331ae72c61e.png)
![120fa0d34946f08ccbc747bbebdb47c4.png](https://i-blog.csdnimg.cn/blog_migrate/a1dd87394b34c93a93e176b4fc49694f.png)
![2f27b50ad05aaa0b79e2c201e1734d81.png](https://i-blog.csdnimg.cn/blog_migrate/ea47760485af1e07725c11ac186a46d0.png)
* {}-->类中方法外 ==>构造块 执行时机:创建对象
![d56ad1724e9998b6ef69cb0a68fbcb8d.png](https://i-blog.csdnimg.cn/blog_migrate/9de51fe4d627140d7e03a8c3c4f51b1b.png)
![349e0435035924de6dc1175bd7659678.png](https://i-blog.csdnimg.cn/blog_migrate/1b3fd42c632525654315af4d86b3e08f.png)
![b0669590859980597fdf8e846ef67e86.png](https://i-blog.csdnimg.cn/blog_migrate/8262e843f0dee7c510f379ba27d817e0.png)
执行顺序:123
* static{}-->类中方法外==>静态块 执行时机:类加载
![f52742f1d68e431c44bafc7cc228c67e.png](https://i-blog.csdnimg.cn/blog_migrate/8fff5ca08c0014254e67a87795801477.png)
![bbd63bb232a9f0750b423ed3d0955407.png](https://i-blog.csdnimg.cn/blog_migrate/49efd7df68ee7f1d733c1e56241afa7b.png)
*
![2985b69d8f3e160adbfd420e65a2e640.png](https://i-blog.csdnimg.cn/blog_migrate/3830d76303201d05db7138ee8122af3c.png)
* 1.先于构造器的代码执行,编译时默认自动把构造块中的代码编译到要执行的构造器代码的最上方 ,如果存在多个构造块,从上到下以执依次
* 2.在类第一次加载完成之后执行,只执行一次,先于main方法执行,如果存在多个静态块,从上到下依次执行
*
* static块-->main
* 构造块-->构造器