Ken explained to you the how, let me try and explain the why...
In Delphi, the documented behavior for variables descending from TObject is a default value of nil.
You have something confused here:
The member variables of a class (i.e. descendant of TObject) are initialized to 0 or nil.
However whether the Object reference itself is initialized depends on the context.
This has been the case since at least Delphi 2.
The reason for this is a speed optimization:
Local variables are short lived
Local (a global) variables live on the stack.
This memory structure continuously reuses the same memory.
Initializing variables to nil (or 0) would not save you any work, because you're supposed to instantiate the variable to something useful.
procedure Test;
var
MyObject: TMyObject;
begin
MyObject:= TMyObject.Create;
.....
Initializing it to nil before the procedure starts obviously serves no purpose here, because you cannot work with it until you've set it to something non-nil.
Because local variables are used close to where they are declared there is little risk of confusion.
When the procedure ends, the local variables go out of scope.
What this really means is that the memory space where these variables used to live is reused in another procedure.
Objects can be long lived
When an object is created, the system allocates memory for it on the heap.
Delphi uses its own memory manager.
For all objects, you can be sure that after the call to TObject.Create
all member variables of the object are set to 0 (or nil).
As David pointed out, this allows the system to safely free the instance if the Create (the part further down the line from TObject) fails.
It also makes sense because otherwise you'd have to initialize lots of variables in every constructor you write; now you only have to give non-null members a value.
This makes sense on several levels.
Classes can have dozens or hundreds of member variables.
It prevents mistakes.
It allows errors in constructors to be handled.