标签: scjp

为什么我们使用带有匿名内部类的final关键字?

我正在准备S(O)CJP,以及Sierra和Bates的书.

关于内部类(方法本地或匿名),他们说我们不能访问局部变量,因为它们存在于堆栈上,而类存在于堆上并且可以由方法返回,然后尝试访问这些变量在堆栈上但由于方法已经结束而不再存在...

众所周知,我们可以通过使用final关键字来绕过这一点.这就是他们在书中所说的但他们并没有真正解释最终关键字的影响...据我所知,在方法局部变量上使用final关键字并不能使它在堆上生效. ..那么如何能够访问仍然存在于堆栈中的最终变量,而不会有更多的堆栈?

我想在内部类中应该有这种最终局部变量的某种"复制".由于价值不能改变,为什么不重复这些信息...有人可以确认这个或告诉我,如果我错过了什么?

java oop scjp java-ee

23
推荐指数
2
解决办法
2472
查看次数

Java SneakyThrow异常,键入擦除

有人可以解释这段代码吗?

public class SneakyThrow {


  public static void sneakyThrow(Throwable ex) {
    SneakyThrow.<RuntimeException>sneakyThrowInner(ex);
  }

  private static <T extends Throwable> T sneakyThrowInner(Throwable ex) throws T {
    throw (T) ex;
  }



  public static void main(String[] args) {
    SneakyThrow.sneakyThrow(new Exception());
  }


}
Run Code Online (Sandbox Code Playgroud)

它可能看起来很奇怪,但这不会产生强制转换异常,并且允许抛出已检查的异常而不必在签名中声明它,或者将其包装在未经检查的异常中.

请注意,两者都没有sneakyThrow(...)或主要声明任何已检查的异常,但输出为:

Exception in thread "main" java.lang.Exception
    at com.xxx.SneakyThrow.main(SneakyThrow.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Run Code Online (Sandbox Code Playgroud)

本hack在龙目岛的使用,注释@SneakyThrow,允许抛出checked异常没有声明.


我知道它与类型擦除有关,但我不确定理解黑客的每个部分.


编辑: 我知道我们可以插入一个Integera List<String>和那个checked/unchecked异常区别是编译时功能.

从非泛型类型List转换为类似于List<XXX>编译器的泛型类型时会产生警告.但是直接转换为泛型类型并不像(T) ex上面的代码那样常见.

如果你愿意,对我来说似乎很奇怪的部分是我理解JVM中的内容List<Dog>并且List<Cat> …

java scjp lombok ocpjp

22
推荐指数
3
解决办法
3818
查看次数

枚举作为实例变量

如果你有一个枚举如

enum Coffee {
    BIG,
    SMALL
}
Run Code Online (Sandbox Code Playgroud)

和一个像枚举这样的实例变量的类:

public class MyClass {
    private Coffee coffee;

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

为什么在构造函数中可以说例如coffee.BIG?我不明白你可以使用参考?枚举是否将实例变量初始化为其他内容null?这是第一章SCJP书中的自测题#4.我试图缩短代码和问题.

java enums scjp

19
推荐指数
3
解决办法
4万
查看次数

按位移位运算符.签名和未签名

我正在使用互联网上的补习说进行SCJP考试.

根据我的说明,>>操作员应该是右移,右边是符号位.虽然左移位运算符<<应该保留符号位.

然而,在我周围玩耍时,我可以用<<操作员移动标志(fe Integer.MAX_VALUE << 1评估为-2,而我永远无法用>>操作员移动标志.

我一定是在误解这里的东西,但是什么?

java scjp bit-shift

18
推荐指数
1
解决办法
2万
查看次数

Java中的这种泛型用法是什么?X. <Y>()的方法

我已经阅读了整本SCJP6书籍Sierra和Bates的书,考试成绩为88%.

但是,我仍然没有听说过这种代码是如何工作的,因为它在泛型章节中没有解释:

Collections.<TimeUnit>reverseOrder()
Run Code Online (Sandbox Code Playgroud)

这种仿制药的用法是什么?我在一些代码中发现它但从未读过任何关于它的内容.在我看来它允许给类型推断一些帮助.我试图搜索一下,但这并不容易找到(而且它甚至不在SCJP书/考试中!)

那么有人可以给我一个正确的解释它是如何工作的,这些都是用例等吗?

谢谢


编辑 感谢您的答案,但我期待更多细节:)所以如果有人想添加一些额外的信息:

更复杂的情况如何呢?

  • 使用类中声明的类型,我可以做类似Collections.<T>reverseOrder()例子吗?
  • 使用extends,super
  • 运用 ?
  • 给编译器只提供部分帮助(即O.manyTypesMethod<?,MyHelpTypeNotInfered,?,?,?,?,?>())

java generics scjp type-inference

18
推荐指数
1
解决办法
700
查看次数

如何以编程方式测试断言是否已启用?

OCP Java SE 6程序员实践考试的正确答案之一是:

您可以通过编程方式测试已启用的断言,而不会抛出AssertionError.

我怎样才能做到这一点?

java scjp assertion ocpjp

18
推荐指数
3
解决办法
4251
查看次数

我应该为SCJP准备多久?

好吧,我知道这可能听起来有些愚蠢,因为这取决于人,但平均而言,我应该花多少时间来准备SCJP?我已经有了一些Java经验(我的大学有一些小型和中型项目,从实现一个简单的"船"游戏到一些客户端 - 服务器的东西).

我正考虑在7月7日左右拍摄它,所以我有大约7-8个月,是否足够/太多/不够?

此外,我一直在寻找一本好书,还有什么比Kathy Sierra和Bert Bates的"Java认证程序员Java 6学习指南"更好的了吗?那些实际问题呢(比如"实现这个和这个"或"编写一段代码......")?

啊,这真的值得(我自己花钱).我不是在问它是否会让我成为一个更好的程序员(因为我已经看到了stackoverflow上的这样一个线程)但是雇主是否还关心它?

java scjp

17
推荐指数
3
解决办法
4万
查看次数

Java不可达catch块编译器错误

为什么在Java中我们可以捕获一个Exception即使它没有被抛出,但我们无法捕获它的子类(除了"unchecked" RuntimeException和它的子类).示例代码:

class Test {
    public static void main(String[] args) {
        try {
            // do nothing
        } catch (Exception e) {
            // OK           
        }

        try {
            // do nothing
        } catch (IOException e) {
               // COMPILER ERROR: Unreachable catch block for IOException.
               //This exception is never thrown from the try statement body
        }       
    }
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

java scjp

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

Java继承问题

在探索scjp问题时,我遇到了这种我觉得奇怪的行为.

我已经声明了两个类Item和Bolt,如下所示:

class Item {
    int cost = 20;

    public int getCost() {
        return cost;
    }
}

class Bolt extends Item {
    int cost = 10;

    public int getCost() {
        return cost;
    }
}
Run Code Online (Sandbox Code Playgroud)

并尝试两次访问成本的价值

public class Test {
    public static void main(String[] args) {
        Item obj = new Bolt();
        System.out.println(obj.cost);
        System.out.println(obj.getCost());
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是20 10.我无法理解这是怎么发生的.

java inheritance scjp

14
推荐指数
2
解决办法
341
查看次数

SCJP 6和OCJP都一样吗?

两者SCJP 6OCJP 6考试是否相同?我本月将要写OCJP 6考试,但我正在准备Kathy Seirra的SCJP 6考试.

为了练习,我正在准备Kathy seirra "OCP Java SE 6 programmer study guide".好吗?

我对这句话感到困惑"SCJP 6" , "OCJP 6", "OCP Java SE 6 Programmer".那些是一样的吗?

如果同样为什么这么多不同的名字?

先感谢您?请指导我.

java scjp

14
推荐指数
1
解决办法
1万
查看次数

标签 统计

java ×10

scjp ×10

ocpjp ×2

assertion ×1

bit-shift ×1

enums ×1

generics ×1

inheritance ×1

java-ee ×1

lombok ×1

oop ×1

type-inference ×1