Path: csiph.com!newsfeed.hal-mli.net!feeder3.hal-mli.net!newsfeed.hal-mli.net!feeder1.hal-mli.net!news.ripco.com!news-out.news.tds.net!newsreading01.news.tds.net!53ab2750!not-for-mail From: "Eric Sosman" Subject: Re: why does this work? Message-ID: <5023FE3C.56484.calajapr@time.synchro.net> X-Comment-To: dkoleary Newsgroups: comp.lang.java.programmer In-Reply-To: <5023FE3B.56477.calajapr@time.synchro.net> References: <5023FE3B.56477.calajapr@time.synchro.net> X-FTN-AREA: COMP.LANG.JAVA.PROGRAMMER X-FTN-MSGID: 1:261/38 e3800a3c X-FTN-REPLY: 1:261/38 4481ccde Content-Type: text/plain; charset=IBM437 Content-Transfer-Encoding: 8bit X-Gateway: time.synchro.net [Synchronet 3.16a-Win32 NewsLink 1.98] Lines: 68 Date: Thu, 09 Aug 2012 18:44:38 GMT NNTP-Posting-Host: 69.21.70.65 X-Complaints-To: news@tds.net X-Trace: newsreading01.news.tds.net 1344537878 69.21.70.65 (Thu, 09 Aug 2012 13:44:38 CDT) NNTP-Posting-Date: Thu, 09 Aug 2012 13:44:38 CDT Organization: tds.net Xref: csiph.com comp.lang.java.programmer:17535 To: dkoleary From: "Eric Sosman" To: dkoleary From: Eric Sosman On 8/8/2012 1:30 PM, dkoleary wrote: > [...] > How come that isn't recursive? XCopy.main() instantiates a new XCopy. Shouldn't that new XCopy instance also instantiate a new XCopy? See Daniel Pitts' explanation. Another thing you could try to help you see what's going on is to sprinkle some more println() calls through the code to help trace through the execution. In this case you're interested in where the constructor fits with relation to everything else, but there's no explicit constructor written in the code. As I'm sure you've learned, this means the compiler will write a simple constructor for you -- but there's no way to get the compiler to stick println() calls in what it writes, so your recourse is to write your own explicit constructor. With this in mind, the code might look like: class XCopy { public static void main(String[] args) { System.out.println("entering main()"); int orig = 42; System.out.println("main() creates an XCopy"); XCopy x = new XCopy(); System.out.println("main() created an XCopy"); int y = x.go(orig); System.out.println(orig + " " + y); System.out.println("main() is finished"); } int go(int arg) { System.out.println("executing go(), arg = " + arg); return arg * 2; } // Explicit constructor, just for the println XCopy() { System.out.println("constructing an XCopy"); } } Run this version, study the output, and see if the sequence of events becomes clearer. This technique is sometimes called "printf debugging" (the name comes from a different programming language). Despite its simplicity, it can be astonishingly effective, and the overall approach can be used in most environments and most languages. Indeed, Java's various logging frameworks (you may learn about them later) are basically just fancied-up versions of printf debugging: A piece of the program blurts "Look! I'm *here*, and these are a few interesting values." -- Eric Sosman esosman@ieee-dot-org.invalid -+- BBBS/Li6 v4.10 Dada-1 + Origin: Prism bbs (1:261/38) -+- Synchronet 3.16a-Win32 NewsLink 1.98 Time Warp of the Future BBS - telnet://time.synchro.net:24 --- BBBS/Li6 v4.10 Dada-1 * Origin: Prism bbs (1:261/38) --- Synchronet 3.16a-Win32 NewsLink 1.98 Time Warp of the Future BBS - telnet://time.synchro.net:24