我是java的初学者。我找到了这个例子并且无法理解我们怎样才能通过一个新的" operator,在构造函数的参数内创建一个对象。此外,它的嵌套和括号中还有另一个语句(作为参数)。
例如:在新的' Bufferedreader'内部我们传递了一个新的输入流'对象,然后再次调用构造函数中的方法:url.openStream()。我已经看过很多次了,我很困惑为什么我们不创建一个新的对象引用" InputStream i = null;'然后将其传递给构造函数?
另外,一般来说,从方法返回一个值并将其分配给类实例是什么意思?测试t = x.getname();',其中值返回应该是类类型?我不明白这一点,请帮助!
StringBuilder json = new StringBuilder();
try {
URL url = new URL(sMyUrl);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
try {
String str;
while ((str = in.readLine()) != null) {
json.append(str).append("\n");
}
} finally {
in.close();
}
} catch (Exception e) {
throw new RuntimeException("Failed to read JSON from stream", e);
}
答案 0 :(得分:3)
类实例创建表达式(new Something(...)
)是一个类似于任何其他表达式的表达式。它的类型为Something
,因此可以在需要引用Something
的任何地方使用:
Something s = new Something();
someMethod(new Something());
new Something().methodOnSomething();
assert new Something() != null;
// etc.
之间没有太大区别
Something s = new Something();
Other o = new Other(s);
和
Other o = new Other(new Something());
主要区别在于您可以在第一种情况下使用变量s
。
如果您之后不需要引用s
,那么关于您是否创建单独的变量,实际上是首选/样式/可读性问题。
答案 1 :(得分:2)
您在堆上创建一个对象而不引用它,并在使用它之后收集垃圾。
// creates an object on the heap with 'foo' as a pointer to it.
Foo foo = new Foo();
// then the above reference can be passed, in this case to the constructor of the 'Bar'
Bar bar = new Bar(foo);
没有任何东西阻止你在没有引用的情况下直接传递新对象。
// in this case you are passign the object straight to the constructor of 'Bar'
Bar bar = new Bar(new Foo());
以上示例在您未在对象上设置任何内容或对象为无状态时很常见。
除此之外,您将创建对正在玩的对象的引用,并在传递给它之前在其上设置一些内容。
// creates an object on the heap with 'foo' as a pointer to it.
Foo foo = new Foo();
// set the state of the object
foo.setBehaviour("clumsy");
foo.isFooDirty(true);
// then the above reference can be passed, in this case to the constructor of the 'Bar' with its state.
Bar bar = new Bar(foo);
答案 2 :(得分:2)
我已经多次看过这个,为什么我们不创建一个对“InputStream”的新对象引用然后将它传递给构造函数?
由于没有使用它进一步制作变量。它只是一次性使用,所以只需内联即可。只是为了保存一行代码。没有性能差异。
另外,一般来说,从方法返回一个值并将其分配给类实例是什么意思?测试t = x.getname();'
这意味着来自类getname()
的方法x
返回类型为Test
的实例。并将返回的实例分配给t
,以便进一步使用它。
例如:
public Test getname(){
Test te = new Test();
//do something or may not.
return te;
}
因此返回的te
将分配给上述t
答案 3 :(得分:0)
您需要了解语句/表达式(operator precedence)的评估顺序。
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
从给定的例子开始,右边(后面=)将按从右到左的顺序进行评估,new
将在作为参数传递给另一个构造函数或方法之前进行评估,这意味着它不是传递的new Something()
,是特定于正在传递的新对象(在评估new Something()
之后)。
您可能会发现有关Decorator or Wrapper pattern的有用读物,其中一个对象包含另一个对象,添加了其他行为。