相关疑难解决方法(0)

Java是"通过引用传递"还是"传递价值"?

我一直认为Java是传递引用的.

但是,我看过一些博客文章(例如,这个博客)声称它不是.

我不认为我理解他们所做的区别.

解释是什么?

java methods parameter-passing pass-by-reference pass-by-value

6270
推荐指数
80
解决办法
189万
查看次数

在Java中适用时使用"final"修饰符

在Java中,有一种做法是声明每个变量(本地或类),如果确实是参数final.

虽然这使得代码更加冗长,但这有助于轻松阅读/掌握代码,并且还可以防止错误,因为意图已明确标记.

您对此有何看法,您对此有何看法?

java oop

189
推荐指数
11
解决办法
6万
查看次数

什么时候应该使用final作为方法参数和局部变量?

我发现了一些建议使用的参考文献(例如)final尽可能多地使用,我想知道它有多重要.这主要是在方法参数和局部变量的上下文中,而不是最终方法或类.对于常数,它显然是有道理的.

一方面,编译器可以进行一些优化,这使得程序员的意图更加清晰.另一方面,它增加了详细程度,优化可能是微不足道的.

这是我应该努力记住的事情吗?

java final

161
推荐指数
8
解决办法
5万
查看次数

是否有任何性能原因在Java中声明方法参数final?

是否有任何性能原因在Java中声明方法参数final?

如:

public void foo(int bar) { ... }
Run Code Online (Sandbox Code Playgroud)

与:

public void foo(final int bar) { ... }
Run Code Online (Sandbox Code Playgroud)

假设bar只读取并且从未修改过foo().

java performance final

117
推荐指数
2
解决办法
3万
查看次数

在java中使用最终局部变量

我想知道是否有使用最终局部变量的可用性.当继承进入图像时,无论如何都不会覆盖变量.例如,如下的简单代码

public static void main(String args[]) {
    final String data = "Hello World!";
    System.out.println(data);
}
Run Code Online (Sandbox Code Playgroud)

这个例子非常简单,可能不是相关的代码,但问题更通用.我看过很多代码(都包含在main函数中,它们都有最终的局部变量)是否有任何可用性来声明局部变量作为最终的其他而不是他们不能在同一个功能本身编辑?

java final local-variables

32
推荐指数
5
解决办法
3万
查看次数

如何确定Java方法是否修改作为参数传递的对象

我来自C++背景,目前我正在学习Java.当我尝试使用某些第三方库时出现了一个问题.如何确定对作为参数的对象引用的方法的调用是否修改了对象?在C++中,由于使用了const关键字,因此很清楚.如果方法签名是:

void foo(Boo& boo);
Run Code Online (Sandbox Code Playgroud)

我知道引用的对象可能会被修改,而如果方法签名是:

void foo(const Boo& boo);
Run Code Online (Sandbox Code Playgroud)

编译器保证不会修改引用的对象.

我没有在Java中看到类似的东西,因为只有引用本身可以被声明为final,而不是引用的对象,并且最终的参数在第一个地方没有多大意义,因为它无论如何都是通过值传递的.因此,当我看到一个方法,如:

void foo(Boo boo) {...}
Run Code Online (Sandbox Code Playgroud)

如何确定boo引用的对象是否在函数体内修改(可能使用注释)?如果没有办法知道,是否有一些广泛使用的约定或一些最佳实践来避免混淆和错误?

java immutability

32
推荐指数
4
解决办法
2811
查看次数

Java中方法的最终变量

可能重复:
为什么在Java中将局部变量和方法参数标记为"final"?

我正在检查一些Java代码,我不擅长java至少有一些知识,如密封类,只读字段和不可覆盖的方法,但这对我来说很奇怪,final在方法中声明一个变量:

private static void queryGoogleBooks(JsonFactory jsonFactory, String query) throws Exception {
    // Set up Books client.
    final Books books = Books.builder(new NetHttpTransport(), jsonFactory)
        .setApplicationName("Google-BooksSample/1.0")
        .setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
          @Override
          public void initialize(JsonHttpRequest request) {
            BooksRequest booksRequest = (BooksRequest) request;
            booksRequest.setKey(ClientCredentials.KEY);
          }
        })
        .build();
Run Code Online (Sandbox Code Playgroud)

你能告诉我final在这种情况下的含义是什么吗?

这是完整的代码:

http://code.google.com/p/google-api-java-client/source/browse/books-cmdline-sample/src/main/java/com/google/api/services/samples/books/cmdline/ BooksSample.java?repo=samples

java final

30
推荐指数
2
解决办法
3万
查看次数

不应该指定参数'foo' - 有什么危害?

比较这种方法:

void doStuff(String val) {
    if (val == null) {
        val = DEFAULT_VALUE;
    }

    // lots of complex processing on val
}
Run Code Online (Sandbox Code Playgroud)

...对于这种方法:

void doStuff(String origVal) {
    String val = origVal;
    if (val == null) {
        val = DEFAULT_VALUE;
    }

    // lots of complex processing on val
}
Run Code Online (Sandbox Code Playgroud)

对于前一种方法,Eclipse会发出警告"不应分配参数'val'".为什么?

在我看来,前者更清洁.首先,它并没有迫使我想出两个好名字val(想出一个好的名字就足够了).

(注意:假设val封闭类中没有命名的字段.)

java eclipse warnings compiler-warnings

29
推荐指数
4
解决办法
2万
查看次数

在增强型for循环中使用final作为循环变量的目的是什么?

我理解以下声明是如何工作的.

for(final Animal animal : animalList){
//do some function
}
Run Code Online (Sandbox Code Playgroud)

但是在这里使用final关键字的目的是什么?

java variables foreach final

20
推荐指数
2
解决办法
9841
查看次数

Java速度访问数组索引与临时变量

什么是Java更快.直接多次访问数组索引,或将数组索引的值保存到新变量并使用它来进行后续计算?

访问索引

if ((shape.vertices[0].x >= fromX && shape.vertices[0].x <= toX) || // left side of shape in screen
    (shape.vertices[0].x <= fromX && shape.vertices[0].x + shape.width >= fromX) || // right side of shape in screen
    (shape.vertices[0].x >= fromX && shape.vertices[0].x + shape.width <= toX)) { // shape fully in screen

    // ...
}
Run Code Online (Sandbox Code Playgroud)

临时变量

float x = shape.vertices[0].x;
float y = shape.vertices[0].y;
if ((x >= fromX && x <= toX) || // left side of shape in screen
    (x <= …
Run Code Online (Sandbox Code Playgroud)

java arrays performance

7
推荐指数
1
解决办法
3058
查看次数