我正在准备S(O)CJP,以及Sierra和Bates的书.
关于内部类(方法本地或匿名),他们说我们不能访问局部变量,因为它们存在于堆栈上,而类存在于堆上并且可以由方法返回,然后尝试访问这些变量在堆栈上但由于方法已经结束而不再存在...
众所周知,我们可以通过使用final关键字来绕过这一点.这就是他们在书中所说的但他们并没有真正解释最终关键字的影响...据我所知,在方法局部变量上使用final关键字并不能使它在堆上生效. ..那么如何能够访问仍然存在于堆栈中的最终变量,而不会有更多的堆栈?
我想在内部类中应该有这种最终局部变量的某种"复制".由于价值不能改变,为什么不重复这些信息...有人可以确认这个或告诉我,如果我错过了什么?
有人可以解释这段代码吗?
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> …
如果你有一个枚举如
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.我试图缩短代码和问题.
我正在使用互联网上的补习说进行SCJP考试.
根据我的说明,>>操作员应该是右移,右边是符号位.虽然左移位运算符<<应该保留符号位.
然而,在我周围玩耍时,我可以用<<操作员移动标志(fe Integer.MAX_VALUE << 1评估为-2,而我永远无法用>>操作员移动标志.
我一定是在误解这里的东西,但是什么?
我已经阅读了整本SCJP6书籍Sierra和Bates的书,考试成绩为88%.
但是,我仍然没有听说过这种代码是如何工作的,因为它在泛型章节中没有解释:
Collections.<TimeUnit>reverseOrder()
Run Code Online (Sandbox Code Playgroud)
这种仿制药的用法是什么?我在一些代码中发现它但从未读过任何关于它的内容.在我看来它允许给类型推断一些帮助.我试图搜索一下,但这并不容易找到(而且它甚至不在SCJP书/考试中!)
那么有人可以给我一个正确的解释它是如何工作的,这些都是用例等吗?
谢谢
编辑 感谢您的答案,但我期待更多细节:)所以如果有人想添加一些额外的信息:
更复杂的情况如何呢?
Collections.<T>reverseOrder()例子吗?extends,super??O.manyTypesMethod<?,MyHelpTypeNotInfered,?,?,?,?,?>())OCP Java SE 6程序员实践考试的正确答案之一是:
您可以通过编程方式测试已启用的断言,而不会抛出
AssertionError.
我怎样才能做到这一点?
好吧,我知道这可能听起来有些愚蠢,因为这取决于人,但平均而言,我应该花多少时间来准备SCJP?我已经有了一些Java经验(我的大学有一些小型和中型项目,从实现一个简单的"船"游戏到一些客户端 - 服务器的东西).
我正考虑在7月7日左右拍摄它,所以我有大约7-8个月,是否足够/太多/不够?
此外,我一直在寻找一本好书,还有什么比Kathy Sierra和Bert Bates的"Java认证程序员Java 6学习指南"更好的了吗?那些实际问题呢(比如"实现这个和这个"或"编写一段代码......")?
啊,这真的值得(我自己花钱).我不是在问它是否会让我成为一个更好的程序员(因为我已经看到了stackoverflow上的这样一个线程)但是雇主是否还关心它?
为什么在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)
有任何想法吗?
在探索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.我无法理解这是怎么发生的.
两者SCJP 6和OCJP 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".那些是一样的吗?
如果同样为什么这么多不同的名字?
先感谢您?请指导我.