我理解为什么以下是错误的:
byte a = 3;
byte b = 8;
byte c = a + b; // compile error
Run Code Online (Sandbox Code Playgroud)
它不会编译.表达式总是导致int.所以我们应该做了明确的演员:
byte c = (byte) (a + b); // valid code
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么以下是正确的:
byte d = 3 + 8; // it's valid! why?
Run Code Online (Sandbox Code Playgroud)
因为字面整数(例如3或8)总是隐式的int.并且int-or-smaller表达式也总是导致int.谁能解释一下这里发生了什么?
我唯一可以猜到的是编译器将此表达式等同于以下内容:
byte d = 11;
Run Code Online (Sandbox Code Playgroud)
并不认为这是一个表达.
规范规定,界面旨在定义合同什么类可以做,并包含了一组以实现所需的方法.但与此同时,界面可能有常量.
出于什么目的,Java中允许它?
接口中常量的存在点是什么,它们如何在其中使用?据我所知,他们只能被方法视为参数.但是我没有看到太多意义,因为接口没有说明类如何实现其方法.
String template = "%s and '%'";
String result = String.format(template, "my string");
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)
预期:
my string and '%'
Run Code Online (Sandbox Code Playgroud)
但结果是:
java.util.UnknownFormatConversionException: Conversion = '''
Run Code Online (Sandbox Code Playgroud)
为什么?如何正确地声明序列'%'以使其被忽略String.format()?
假设有2个班级.并Child扩展Parent.
public class Parent {}
Run Code Online (Sandbox Code Playgroud)
和
public class Child extends Parent {}
Run Code Online (Sandbox Code Playgroud)
我知道以下代码不正确:
Child obj = new Parent(); // causes java.lang.Error
Run Code Online (Sandbox Code Playgroud)
要么
Child obj = (Child) new Parent(); // causes java.lang.ClassCastException
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么我在第一种情况下得到编译错误,在第二种情况下得到运行时异常.毕竟,父母永远不能转换或投射到孩子身上.为什么在编译时没有检查第二种情况?
我会非常感谢一个明确而合理的想法!
class NotSerializable {}
class MyClass implements Serializable {
private NotSerializable field; // class NotSerializable does not implement Serializable!!
}
public class Runner {
public static void main(String[] args) {
MyClass ob = new MyClass();
try {
FileOutputStream fs = new FileOutputStream("testSer.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(ob);
os.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileInputStream fis = new FileInputStream("testSer.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
MyClass copyOb = (MyClass) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
} …Run Code Online (Sandbox Code Playgroud)