Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

全部面试题

461 道题目
我的收藏与复习
题干与完整题解免费阅读第 12 / 47 页

答:Java 原生对象序列化用 Serializable 标记类型参与相应协议,它是没有业务方法的标记接口。普通对象不满足原生协议要求,写入时可能抛 NotSerializableException。但 JSON 等其他序列化方案有各自规则,并不因此都要求实现 Serializable。

专注学习

答:当一族对象确实共享实例状态、初始化约束和稳定执行骨架,同时只希望子类补充少数步骤时,抽象类通常更合适。若只是定义跨类型的能力协议,接口常更灵活。抽象类与接口可以配合使用,不必把它们设计成只能二选一。

专注学习

答:因为静态方法没有自动绑定的当前实例,而实例字段必须属于某个具体对象。类名调用一个静态方法时,运行环境不能替你决定读取哪个对象的字段。但只要显式提供合法对象引用,静态方法仍可以按访问规则读取其实例状态。

专注学习

答:不一定报错。父子类声明相同签名的静态方法,在满足返回类型、可见性、final 等限制时可以构成方法隐藏,但不属于重写。调用哪个静态方法主要由编译期确定的类型决定,不会根据接收变量实际指向的子类对象进行普通实例方法式的动态分派。

专注学习

答:Java 没有提供让普通类自行定义 +、- 等运算符含义的声明机制。运算符的适用类型与行为由语言规范规定,例如数值加法和字符串连接。用户需要为自定义类型提供 add、plus 等具名方法;不能因为字符串能使用 +,就认为任意类都能重载它。

专注学习

答:若类型需求合适,枚举单例是简洁选择,语言及原生序列化机制会维护相应的枚举实例语义。普通类也可采用静态持有者实现延迟初始化。无论哪一种,“单例”都需限定到相应运行时类和类加载器,不能直接推导成多进程、多服务器只有一个对象。

专注学习

答:不能继承 String,因为它被声明为 final。需要增加文本行为时,可以用组合包装 String,或者在确实符合字符序列协议时实现 CharSequence。后者也不会自动获得 String 的全部方法、相等性约定或不可变保证,选择时仍要看 API 实际需要什么。

专注学习

答:常见方式包括类型字面量 Type.class、对象的 getClass()、按名字调用 Class.forName,以及使用指定 ClassLoader 的加载方法。它们取得的信息和副作用不同:getClass 反映实际运行类型,类字面量可表达基本类型,而常用 forName 还会要求初始化对应类。

专注学习
本页 10 道,共 461 道浏览其他领域