写代码的时候突发奇想的在新建对象的同时给它的属性赋值。
例如:
正常写法: Brand brand = new Brand();
brand.setId(1);
我的错误写法: Brand brand = new Brand().setId(1);//这样写会报错。
new Brand().setId(1);//这样不会报错,但是没有办法调用对象去 getId()
朋友的解释是:
new 出来的对象( B )都存放于堆中,而实例化的对象( A )在栈里。 正常写法调用方法( C )的顺序 是 A->B->C
错误的写法里,直接 B->C,然后并不能再反过来,将 B 指向 A 。 (B->C)->A
1
codehz 2020 年 12 月 17 日 via Android
(问题不是在 setId 没返回 this 上吗(
|
2
gotonull 2020 年 12 月 17 日
Lombok 不就能解决这问题吗
|
3
l48x4264l46 2020 年 12 月 17 日
new Brand() 返回的是当前实例,所以可以调用 setId 方法。而 setId 放回是 void,与 Brand brand 不符。所以不能用。试试使用建造者模式去创建对象。就可以实现你所想要的结果了。
|
4
chendy 2020 年 12 月 17 日 因为你的 setId 返回的不是 Brand…(猜测是 void
|
6
lovelive1024 2020 年 12 月 17 日
你那么写相当于把 setid 方法的返回值赋值给 brand 对象,但是 setid 方法没有返回值,所以就报错了
如果 setid 这么定义就可以像你那么写,但是这样不符合规范 public Brand setId(Long id){ this.id = id; return this; } |
7
nekochyan 2020 年 12 月 17 日
你自己想想你 setId 返回的是什么
|
8
wysnylc 2020 年 12 月 17 日
百度 链式
|
9
hoyixi 2020 年 12 月 17 日
报错,报的啥错,你不看一眼吗
|
10
greatHair OP 谢谢大家,我明白了,大师,我悟了。(我有点蠢
|
11
anansi 2020 年 12 月 17 日
这个也太弱智了吧,什么堆啊栈啊的
|
12
Vegetable 2020 年 12 月 17 日
有点好笑,因为 setId 返回的不是 Brand,如果是 js 之类的,还得(new Brand()).setId 明确你 new 的是谁才行。
|
14
dcalsky 2020 年 12 月 17 日
你朋友一听就是老八股文大师了。
|
15
zhuweiyou 2020 年 12 月 17 日 写个带参构造函数不行么
|
16
syozzz 2020 年 12 月 17 日
。。。
|
17
SkyLine7 2020 年 12 月 23 日
3 楼正解
|