无法为属性或索引器赋值_构造器—static—this—block

本文详细介绍了Java中构造器的作用和使用,包括默认构造器、构造器重载以及构造器与this关键字的配合使用。同时,讲解了this关键字在区分成员变量和局部变量中的应用,以及static修饰符在静态变量和静态方法中的使用。此外,还阐述了代码块(构造块和静态块)的执行顺序及其在类加载过程中的作用。
摘要由CSDN通过智能技术生成

27e8cafba34aac4c05fbe4d9238f6f23.png

构造器—static—this—block

  1. 构造器

构造器|构造方法|构造函数

* new会做3件事情:

* 1.在堆中为对象开辟空间,成员属性会跟随对象进入到堆内存中,并赋默认值。

* 2.调用构造器为对象初始化信息。

* 3.把地址反回给引用。

构造器的作用:

* 为对象初始化信息,但不是创建对象的作用。

构造器如何使用:

* 只能跟随new一起使用

* 定义:

* 修饰符 类名([参数列表]){

* 方法体;

* }

e49f2f3bacf42cbf301c02c83727d05c.png

如果没有在类中自定义构造器,编译器会默认为我们提供一个空构造(没有参数)

ab13fa44b459ba2a4e3ec36d030e657a.png

如果类中有自定义构造器,编译器都不会在为你提供任何构造器包括空构造

dde7929e31ec18f40a44754f3cecd221.png

此时拿到了空构造里面的内容!

e331d672551af355f33eb100114927f2.png

9b3dfef7d69fda6ff61d28d14695ab42.png

这个就是说明了只要创建了对象就会使用构造器。

一个类中的多个构造器可以构成重载,调用的时候匹配实参即可。

9e5b50591daf36816cd905b7def03a10.png

f3aeb8d4644204d1c0beb55ea6b04ba7.png

此时利用构造重载比较方便。

此时构造器为你的对象属性赋值了。对名字赋值了。

0e82e476714418008250b1b5ae02767f.png

02deb2ef8f780c6101234199afae4e4b.png

构造器能创建对象的同时并赋值。

3247a888b72b82d88e68c9e3a20d8691.png

1d402cb3cb68eb06e7d692abb8873cb4.png

此时狗的名字叫做”王大锤”了。

如果你能在创建对象的时候你就能确定一些或者全部成员的属性,你就可以调用构造器(带参构造器)创建对象的同时为他赋值。

7a729fe395ed09841474b5c07c44f8da.png

0826daa03e48e0317d8892f6d80175f3.png

134880e772622f21c0a4dc521beefcae.png

此时报错,将空构造器给注释了,导致第6行代码出错。

273b854204583c0e34dce62c42a31545.png

若将空构造器的注释给去掉(把空构造器给放出来)则不会报错。

一个类中的多个构造器可以构成重载,调用的时候匹配实参(以上例子说明了此点)

构造器没有返回值类型,也不需要void,可以根据需求添加return,但是不能返回数据

ee929d9221c8fc13fd541e7c1a807970.png

4350fa339d8adb81d57e5a78bd8662f1.png

2b4b94988125b18001ed434f56c82163.png

Dog dog2=new Dog("哈哈");若将“哈哈”换成“哈哈2”,这输出的结果为:

4eb562a4c16c76b99ee5ea284eb23881.png

构造器不能被final,abstract,static修饰

* 构造器如果修饰符为private,只能在当前类中创建对象

*

* 构造器是特殊的方法,定义和使用比较特殊,但是依旧拥有方法的特性重载,作用就。是为对象初始化信息

二、This

* this 代表当前对象(当前new的对象)本身,存储当前对象的地址

* 构造器中使用,构造器的“首行”使用

调用本类中的其他构造器 this(参数列表) -->实参

e20dcb47344902360e346ec651c5fa2b.png

511650c1aa5e7124c1a762bcafc58054.png

图表 1注意:this必须放在首行,否则会报错。这个“this”是指当前对象,即Flower f = new Flower("红色","玫瑰花",1,12); Flower 类的。

20ef11dba7991a77ddb550c92f0cb629.png

此代码是调用空构造器

结果是先执行“我是空构造”之后,回来在执行“我是4个参数构造器”。

执行过程是5291730;

02e4f14f9219ada00ab305ae68d642b0.png

c8fadcea26265676107a63d9d6094db7.png

此代码是在空构造中调用this,此时可行的,代码可以正常执行。

e9714dc91bf672937c8f5f40992fb4d5.png

备注:两个构造器互相调用则会出错。

a107ec537152a061999a4fe7458dbfe7.png

此处的三个“color”是同一个。即是同名的成员。

c7a27a8a559ce15d117efe50206bd11c.png

此代码比上一个代码做了简化。只满足首行的调用。

9ac29c1c480482288331d3d99f4ed2e7.png

eb5ad34867d021bedf53d2b61d0b00c9.png

2e055fd25486bb39e9aa6a90ae27d846.png

说明这样简化操作是可行的。

作用:可以帮转我们简化代码

*

* 注意:

* 1.必须在首行

* 2.构造器之间不能相互调用

cb4589517888f437b41ed91ca9013e5c.png

d97e5ac9d0b6d39734eb36ad94bdd4c7.png

07889dc469cf9d76f1e407709dddcd9f.png

d97e5ac9d0b6d39734eb36ad94bdd4c7.png

f82290c1302326f45131eb95f30dcc06.png

fa85dc94b036e261dba9fd0f12177886.png

19d8197522708665726c634e231f5c85.png

若在方法open方法中加入参数“String color”,此时改成f.opoen(“紫色”);

则运行结果是“紫色花开了”。此时就是出现了“就近原则现象”,即就是新加入的参数String color离open最近。

eadb45588087563beab9939dfa037e9c.png

区分同名变量问题:成员方法中使用,构造器中..

* 局部和成员之间.. 会发生就近原则,指向同名的成员,使用this

* 成员方法中,this代表当前调用成员方法的对象

85b6b467f2dac6d62e6a9702cbad565b.png

解释一下,谁调用的open?,是f,f中存着Flower的地址0x001, f.open执行的时候它里面的成员变量color

21f025bdcf5fec01423026c184e0f05a.png

363b2e57e539381e485fd829ef03110c.png

此时的运行结果就是“红色花开了”。

afa2568adeb147489981a971aa9cd4d7.png

此处this写不写都无所谓的。

2d52f338cfceaa68210f736f9d59c6ad.png

7e5ac95ed2157d91c4eb08fe032455d0.png

此时在num面前加上this

f8aa33cc7a6ebf1ed1ffc7e4f0d4e654.png

如果同名,不适用this调用,默认发生就近原则

* 如果不存在同名问题,使用成员变量,前面默认省略了this

a314748009b5fdf8fe5abd78997241cd.png

bc66b8f49a0e9c5790018eb5b4044994.png

ab46ec04aaeb38b7399eba11a9b20856.png

bd8ffab6a27e8c5607a0a55e8a9d3e66.png

不同的对象,每一个对象调用了open,它里面的this就是指那个对象。即是f2。

构造器中区分同名:

* this-->当前new的对象

dd5f6deecef342306bf4d6b1317937db.png

此时代码更简洁了。

this不能使用在static修饰的方法中。

三、static 静态的 是成员的修饰符。

static修饰变量-->静态变量|类变量

static修饰方法-->静态方法|类方法

static 还可以修饰类和块。

Static 只能修饰成员,不能修饰局部的。

288a35c7dfbfcce8570b09615fd65473.png

此时输出的结果a是5。

4d65288aec5a6f240925fbf0372d4f30.png

573ff19026231e0b7e1519885f44a558.png

01f0fc677755c69e7646d780ac5ef695.png

d4edb34182672a0ddce19f0830c67b0c.png

成员是属于对象,静态的属于类的。

因为成员是根据一系列的对象,一系列的事物抽取的共性,写在当前类这个模板之中。凡是这个类里面的成员都有这个共性。这些方法都能使用的。

静态内容的使用:

* 类名.静态变量名

* 对象.静态变量名

* 类名.静态方法名([参数列表]);

* 对象.静态方法名([参数列表]);

006b71b91b93e68a4df7a29311f4046f.png

194ffd59d585ec9db223beb76ebc3fc1.png

333863e9bfe9bbd315c8d62a024fb386.png

如果静态的内容中可以直接使用静态的内容,但是不能直接使用成员的内容,通过对象去使用

* 如果成员的内容中,可以直接使用静态的内容,可以直接使用成员的内容

2ed86cac2b548ac59a22475bd7cdaac3.png

8a5c365563b4f4346aff941fc2d3253d.png

静态内容:

c70d9bc5dcb021574773e1aff267fc14.png

9fb08d072ea79769d9ddf1e46538a1bd.png

73ef3fb7f0de02b6c1de5911eeeea83f.png

94889d8922f889707090b493a2882e04.png

成员内容:

ead4da1e818566d2a8ccfd6acc35066b.png

方法不调用不执行

* 成员方法:没有static修饰的方法

* 对象.方法名();

* 静态方法:static修饰的方法

* 类名.方法名(); -->执行方法中的代码

* 对象.方法名();

*

* 什么时候方法定义成成员方法:

1.必须存在对象才可以使用

2.是否想要在方法中直接使用静态和成员的内容

* 什么时候方法定义成静态方法:

1.没有对象可以使用,这个功能,这个属性不从属于某个对象 。

2.只能直接使用静态的内容,不能直接使用成员的,不能存在this。

四、块

{} -->作用域

* {}-->方法中 ==>局部代码块|普通语句块 执行时机:调用方法

fb9abd1543e6c86288f1bd38976ab8a1.png

0408c5bf5db3dcd6bb375e2fe01c48e4.png

代码在执行过程中给a重新赋值了,此时a的值为10。

68572657758faaebd7a1f1178f2366fb.png

注意:局部在代码中声明,在代码中调用。

4d347b391f64eb65345d211badae5bb2.png

120fa0d34946f08ccbc747bbebdb47c4.png

2f27b50ad05aaa0b79e2c201e1734d81.png

* {}-->类中方法外 ==>构造块 执行时机:创建对象

d56ad1724e9998b6ef69cb0a68fbcb8d.png

349e0435035924de6dc1175bd7659678.png

b0669590859980597fdf8e846ef67e86.png

执行顺序:123

* static{}-->类中方法外==>静态块 执行时机:类加载

f52742f1d68e431c44bafc7cc228c67e.png

bbd63bb232a9f0750b423ed3d0955407.png

*

2985b69d8f3e160adbfd420e65a2e640.png

* 1.先于构造器的代码执行,编译时默认自动把构造块中的代码编译到要执行的构造器代码的最上方 ,如果存在多个构造块,从上到下以执依次

* 2.在类第一次加载完成之后执行,只执行一次,先于main方法执行,如果存在多个静态块,从上到下依次执行

*

* static块-->main

* 构造块-->构造器

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值