我想知道这些之间的区别是什么:
1 - )
JsonViewRequestBodyAdvice
2-)
JFrame frame = new JFrame();
JLabel label = new JLabel("example");
frame.add(label);
另外,我们可以使用如下语法:
1 - )
JFrame frame = new JFrame();
frame.add(new Label("example"));
但为什么我们不能这样使用它:
2 - )
new Timer(10, new ActionListener() {...}).start();
答案 0 :(得分:3)
这两者之间的区别是这样的,
如果在将参数作为参数发送给方法时不需要引用变量,则可以在调用方法时直接生成对象。
喜欢这个frame.add(new Label("example"));
但是如果你确实要求你将作为参数传递的对象,那么最好有它的引用变量,这样你就可以在代码中用它做一些事情,
假设您希望在方法完成任务后更改某个实例变量或获取Object
状态。在这种情况下,您需要引用变量Object
并且 Ramanlfc
给出了您的其他问题表示new Timer(10, new ActionListener() {...}).start();
这可以在这里忽略方法返回类型,这个任务将在语句发布时完成,
但是
Timer timer = new Timer(10, new ActionListener() {...}).start();
这是不可能的,因为start()
没有返回分配给Timer
引用变量的Timer
答案 1 :(得分:2)
Timer timer = new Timer(10, new ActionListener() {...}).start();
赋值从右到左,因此您的表达式求值的内容应该可以赋给=
左侧的操作数。 <{1}}在这种情况下不会返回start()
,因此失败。
答案 2 :(得分:1)
在前面的两个示例中,您将创建一个JFrame并将其分配给JFrame变量。与标签相同。
Firebase
因为返回类型
而无效Timer timer = new Timer(10, new ActionListener() {...}).start();
无效。
start();
有效,因为您从不尝试将void返回值分配给Timer。
答案 3 :(得分:1)
其他答案是正确的。
另一种思考方式是调用new JLabel
立即在内存中创建JLabel对象。只有在构造完成后,对象才会分配给您的JLabel label
变量。 label
变量不是您的JLabel对象。它是一个引用,可以将我们带到JLabel对象的名称。 JLabel对象本身在内存中浮动。
JLabel对象就像太空行走上的宇航员。将该对象分配给label
变量就像将宇航员的系绳末端放在手中一样。使用那个label
变量就像拖着那个系绳去到宇航员那里。
您的备用代码将引用传递给JLabel对象,并传递给JFrame对象。同样,JLabel对象已完全完整且完整,然后切换到JFrame。在交接之后,本地代码已经忘记了#34;关于JLabel。没有本地引用变量意味着无法返回JLabel对象。 JLabel对象在某些地方仍然存在于内存中,但是我们的本地代码无法访问。在我们的太空行走类比中,将参考文献交给JFrame就像将宇航员的绳索交给其他人一样。
如果我们将一个本地JLabel参考变量和传递给JFrame,那就像把两条系绳连接到我们太空行走的宇航员那样。在将第二个系绳传递给其他人(JFrame对象)的同时,手持一条系绳(局部变量)。
如果所有引用都设置为null
或超出范围,那就像释放所有系绳到我们的宇航员一样。该对象仍然存在于内存中一段时间,但成为垃圾收集的候选对象。实际从内存中删除发生在垃圾收集器运行时,并决定是时候回收该内存空间。