我有一个java测试,这个java教授正试图和我争吵,因为我说我知道我的东西。
这个特定的问题引发了大声咒骂的交换。
1. Suppose that c1 and c2 are reference variables of type Clock.
What is the effect of each of the following statements?
a. c1= new Clock();
Answer
a. It creates the object c1, and the instance variables hr, min,
and sec are initialized to 0.
我的回答是它使用默认或无参数构造函数来实现Clock对象。但是,不,他的答案是它将所有实例变量设置为0.
我的问题是你会如何回答这个问题?我怎么知道变量在那里?我问我的教授,他回答说,"如果我发布代码,它将长达3页。"他不能把小时,小时,秒;对于第一行?!
答案 0 :(得分:6)
声明
c1 = new Clock();
使用其no args构造函数创建类Clock的新实例,并将其分配给局部变量c1。在不知道Clock的实现或其无args构造函数的实现的情况下,无法知道实例c1的内部状态在构造时是什么。成员变量可能已由构造函数或静态初始化设置。你的猜测和我的一样好。
我认为值得注意的是,如果没有看到Clock的实现,你就不知道Clock()是默认的no args构造函数还是没有args的定义构造函数。
答案 1 :(得分:0)
有些人喜欢表明他们是如何“聪明”和受过教育的。也许(只是也许)那是你教授的情况。
查看语句c1= new Clock();
,唯一可以说的是使用其无参数构造函数创建类Clock
的新实例,并分配对创建的实例的引用到名为c1
的变量,该变量必须先前已声明(该变量可能已经初始化,也可能尚未初始化)。实例化包括初始化类字段,如果定义了默认值,例如, private int myField = 4711;
,否则使用基元的默认值(int
默认为0
s)。
在没有看到类实现的情况下,您只是无法知道哪些字段已初始化以及如何。
Clock
可以以不同的方式存储其状态 - 这就是封装的含义。例如,它可以存储 timestamp - 自纪元以来的毫秒数。或者从一天开始。当然,它也可以存储小时+分钟+秒,但你无法知道,你应该不猜测任何东西。
自1.8以来,Java中也有class Clock
。也许你的教授意味着这门课 - 我不知道,因为我不知道背景。