我是Java编程的新手,试图获得OOP的悬念。 所以我build立了这个抽象类: public abstract class Vehicle{….} 和2个子类: public class Car extends Vehicle{….} public class Boat extends Vehicle{….} Car和Boat还拥有一些不常见的独特的领域和方法(不具有相同的名称,所以我不能在车辆中定义它们的抽象方法)。 现在在mainClass中,我已经安装了新的Garage: Vehicle[] myGarage= new Vehicle[10]; myGarage[0]=new Car(2,true); myGarage[1]=new Boat(4,600); 我对多态性非常满意,直到我试图访问Car独有的一个字段,比如: boolean carIsAutomatic = myGarage[0].auto; 编译器不接受这个。 我使用cast来解决这个问题: boolean carIsAutomatic = ((Car)myGarage[0]).auto; 这工作…但它不能帮助方法,只是字段。 这意味着我做不到 (Car)myGarage[0].doSomeCarStuff(); 所以我的问题是 – 我的车库里真的有什么? 我试图去理解直觉,了解“幕后”是怎么回事。 为了未来的读者,下面给出一个简短的答案: 是的,我的myGarage[]有一辆Car 作为静态types语言,如果通过基于Vehicle超类的数据结构(如Vehicle myGarage[] )访问这些语言,Java编译器将不会访问非“Vehicle”的方法/字段 至于如何解决,主要有两种方法: 使用types转换,这将缓解编译器的问题,并在devise中留下任何错误来运行时间 我需要铸造的事实说,devise是有缺陷的。 如果我需要访问非车辆function,那么我不应该将汽车和船存储在基于车辆的数据结构中。 要么使所有这些function属于Vehicle,要么使用更具体的(派生的)基于types的结构 […]
如果我从java命令行省略-Xmxn选项,则使用默认值。 根据java文档 “默认值是在运行时根据系统configurationselect”。 什么系统configuration设置影响默认值?
你用什么工具在大的Java项目中find未使用/死的代码? 我们的产品已经开发了好几年了,手工检测不再使用的代码变得非常困难。 然而,我们尽可能多地删除未使用的代码。 一般战略/技术(特定工具除外)的build议也受到赞赏。 编辑:请注意,我们已经使用代码覆盖工具(Clover,IntelliJ),但这些帮助不大。 死代码仍然有unit testing,并显示为覆盖。 我猜想一个理想的工具可以识别代码集群,这些代码很less有其他代码取决于它,允许文档手动检查。
是否有可能在Hibernate打印生成的SQL查询真正的价值而不是问号? 如果用Hibernate API不可能的话,你会如何build议打印带有实际值的查询?
我有一个接口,它返回java.lang.Iterable<T> 。 我想用Java 8 Stream API来处理这个结果。 然而,Iterable不能“stream”。 任何更好的主意如何使用stream(没有将Iterable转换为List)?
javax包的基本原理是什么? 什么进入java和什么到javax? 我知道javax中有很多enterprise-y包,但Swing,新的date和时间api(JSR-310)以及其他J2SE包也是如此。
在Java应用程序中创build临时目录是否存在标准可靠的方法? Java的问题数据库中有一个条目,在注释中有一些代码,但是我想知道是否有一个标准的解决scheme可以在常见的库(Apache Commons等)中find?
运行这个时候: public class WhatTheShoot { public static void main(String args[]){ try { throw null; } catch (Exception e){ System.out.println(e instanceof NullPointerException); System.out.println(e instanceof FileNotFoundException); } } } 答复是: true false 这对我来说是相当惊人的。 我会认为这会净编译时错误。 为什么我可以在Java中抛出null,为什么抛出它为NullPointerException? (其实,我不知道这是否是一个“upcast”,因为我扔了null) 除了一个非常愚蠢的面试问题(请别人在面试中提出这个问题),我看不出任何理由throw null 。 也许你想被解雇,但那是…我的意思是,为什么有人会throw null ? 有趣的事实 IntelliJ IDEA 12告诉我,我的行, e instanceof NullPointerException ,将永远是错误的。 这根本不是真的。
我如何获得我的Java过程的ID? 我知道有几个平台依赖的黑客,但我更喜欢更通用的解决scheme。
我一直想知道,一般来说,在循环之前是否声明一个抛出variables,而不是在循环内部重复,会产生任何(性能)差异? Java中的一个(相当无意义的)例子: a)循环之前的声明: double intermediateResult; for(int i=0; i < 1000; i++){ intermediateResult = i; System.out.println(intermediateResult); } b)循环内声明(重复): for(int i=0; i < 1000; i++){ double intermediateResult = i; System.out.println(intermediateResult); } 哪一个更好, a或b ? 我怀疑重复的variables声明(例子b ) 在理论上造成了更多的开销,但是编译器足够聪明以至于无关紧要。 示例b具有更紧凑的优点,并将variables的范围限制在使用位置。 不过,我倾向于按照例子编码。 编辑:我特别感兴趣的Java案例。