为什么我们用" new"创建一个对象?运算符,然后将其作为参数传递给构造函数?

时间:2017-06-23 13:13:06

标签: java object methods return new-operator

我是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);
}

4 个答案:

答案 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的有用读物,其中一个对象包含另一个对象,添加了其他行为。