📄 chap04.htm
字号:
<font color=#0000ff>void</font> f5(<font color=#0000ff>float</font> x) { prt(<font color=#004488>"f5(float)"</font>); }
<font color=#0000ff>void</font> f5(<font color=#0000ff>double</font> x) { prt(<font color=#004488>"f5(double)"</font>); }
<font color=#0000ff>void</font> f6(<font color=#0000ff>float</font> x) { prt(<font color=#004488>"f6(float)"</font>); }
<font color=#0000ff>void</font> f6(<font color=#0000ff>double</font> x) { prt(<font color=#004488>"f6(double)"</font>); }
<font color=#0000ff>void</font> f7(<font color=#0000ff>double</font> x) { prt(<font color=#004488>"f7(double)"</font>); }
<font color=#0000ff>void</font> testConstVal() {
prt(<font color=#004488>"Testing with 5"</font>);
f1(5);f2(5);f3(5);f4(5);f5(5);f6(5);f7(5);
}
<font color=#0000ff>void</font> testChar() {
<font color=#0000ff>char</font> x = 'x';
prt(<font color=#004488>"char argument:"</font>);
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
}
<font color=#0000ff>void</font> testByte() {
<font color=#0000ff>byte</font> x = 0;
prt(<font color=#004488>"byte argument:"</font>);
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
}
<font color=#0000ff>void</font> testShort() {
<font color=#0000ff>short</font> x = 0;
prt(<font color=#004488>"short argument:"</font>);
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
}
<font color=#0000ff>void</font> testInt() {
<font color=#0000ff>int</font> x = 0;
prt(<font color=#004488>"int argument:"</font>);
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
}
<font color=#0000ff>void</font> testLong() {
<font color=#0000ff>long</font> x = 0;
prt(<font color=#004488>"long argument:"</font>);
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
}
<font color=#0000ff>void</font> testFloat() {
<font color=#0000ff>float</font> x = 0;
prt(<font color=#004488>"float argument:"</font>);
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
}
<font color=#0000ff>void</font> testDouble() {
<font color=#0000ff>double</font> x = 0;
prt(<font color=#004488>"double argument:"</font>);
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
}
<font color=#0000ff>public</font> <font color=#0000ff>static</font> <font color=#0000ff>void</font> main(String[] args) {
PrimitiveOverloading p =
<font color=#0000ff>new</font> PrimitiveOverloading();
p.testConstVal();
p.testChar();
p.testByte();
p.testShort();
p.testInt();
p.testLong();
p.testFloat();
p.testDouble();
}
} <font color=#009900>///:~</font></PRE></FONT></BLOCKQUOTE>
<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">If you view the output of this program,
you’ll see that the constant value 5 is treated as an <B>int</B>, so if an
overloaded method is available that takes an <B>int</B> it is used. In all other
cases, if you have a data type that is smaller than the argument in the method,
that data type is promoted. <B>char</B> produces a slightly different effect,
since if it doesn’t find an exact <B>char</B> match, it is promoted to
<B>int</B>.
</backtalk:display>
[ <a href='http://www.mindview.net/backtalk/CommentServlet?ID=TIJ3_CHAPTER4_I22'
target="_blank">Add Comment</a> ]
<backtalk:display ID=TIJ3_CHAPTER4_I23>
</FONT><BR></P></DIV>
<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">What happens if your argument is
<I>bigger</I> than the argument expected by the overloaded method? A
modification of the above program gives the answer:</FONT><BR></P></DIV>
<BLOCKQUOTE><FONT SIZE = "+1"><PRE><font color=#009900>//: c04:Demotion.java</font>
<font color=#009900>// Demotion of primitives and overloading.</font>
<font color=#0000ff>public</font> <font color=#0000ff>class</font> Demotion {
<font color=#0000ff>static</font> <font color=#0000ff>void</font> prt(String s) {
System.out.println(s);
}
<font color=#0000ff>void</font> f1(<font color=#0000ff>char</font> x) { prt(<font color=#004488>"f1(char)"</font>); }
<font color=#0000ff>void</font> f1(<font color=#0000ff>byte</font> x) { prt(<font color=#004488>"f1(byte)"</font>); }
<font color=#0000ff>void</font> f1(<font color=#0000ff>short</font> x) { prt(<font color=#004488>"f1(short)"</font>); }
<font color=#0000ff>void</font> f1(<font color=#0000ff>int</font> x) { prt(<font color=#004488>"f1(int)"</font>); }
<font color=#0000ff>void</font> f1(<font color=#0000ff>long</font> x) { prt(<font color=#004488>"f1(long)"</font>); }
<font color=#0000ff>void</font> f1(<font color=#0000ff>float</font> x) { prt(<font color=#004488>"f1(float)"</font>); }
<font color=#0000ff>void</font> f1(<font color=#0000ff>double</font> x) { prt(<font color=#004488>"f1(double)"</font>); }
<font color=#0000ff>void</font> f2(<font color=#0000ff>char</font> x) { prt(<font color=#004488>"f2(char)"</font>); }
<font color=#0000ff>void</font> f2(<font color=#0000ff>byte</font> x) { prt(<font color=#004488>"f2(byte)"</font>); }
<font color=#0000ff>void</font> f2(<font color=#0000ff>short</font> x) { prt(<font color=#004488>"f2(short)"</font>); }
<font color=#0000ff>void</font> f2(<font color=#0000ff>int</font> x) { prt(<font color=#004488>"f2(int)"</font>); }
<font color=#0000ff>void</font> f2(<font color=#0000ff>long</font> x) { prt(<font color=#004488>"f2(long)"</font>); }
<font color=#0000ff>void</font> f2(<font color=#0000ff>float</font> x) { prt(<font color=#004488>"f2(float)"</font>); }
<font color=#0000ff>void</font> f3(<font color=#0000ff>char</font> x) { prt(<font color=#004488>"f3(char)"</font>); }
<font color=#0000ff>void</font> f3(<font color=#0000ff>byte</font> x) { prt(<font color=#004488>"f3(byte)"</font>); }
<font color=#0000ff>void</font> f3(<font color=#0000ff>short</font> x) { prt(<font color=#004488>"f3(short)"</font>); }
<font color=#0000ff>void</font> f3(<font color=#0000ff>int</font> x) { prt(<font color=#004488>"f3(int)"</font>); }
<font color=#0000ff>void</font> f3(<font color=#0000ff>long</font> x) { prt(<font color=#004488>"f3(long)"</font>); }
<font color=#0000ff>void</font> f4(<font color=#0000ff>char</font> x) { prt(<font color=#004488>"f4(char)"</font>); }
<font color=#0000ff>void</font> f4(<font color=#0000ff>byte</font> x) { prt(<font color=#004488>"f4(byte)"</font>); }
<font color=#0000ff>void</font> f4(<font color=#0000ff>short</font> x) { prt(<font color=#004488>"f4(short)"</font>); }
<font color=#0000ff>void</font> f4(<font color=#0000ff>int</font> x) { prt(<font color=#004488>"f4(int)"</font>); }
<font color=#0000ff>void</font> f5(<font color=#0000ff>char</font> x) { prt(<font color=#004488>"f5(char)"</font>); }
<font color=#0000ff>void</font> f5(<font color=#0000ff>byte</font> x) { prt(<font color=#004488>"f5(byte)"</font>); }
<font color=#0000ff>void</font> f5(<font color=#0000ff>short</font> x) { prt(<font color=#004488>"f5(short)"</font>); }
<font color=#0000ff>void</font> f6(<font color=#0000ff>char</font> x) { prt(<font color=#004488>"f6(char)"</font>); }
<font color=#0000ff>void</font> f6(<font color=#0000ff>byte</font> x) { prt(<font color=#004488>"f6(byte)"</font>); }
<font color=#0000ff>void</font> f7(<font color=#0000ff>char</font> x) { prt(<font color=#004488>"f7(char)"</font>); }
<font color=#0000ff>void</font> testDouble() {
<font color=#0000ff>double</font> x = 0;
prt(<font color=#004488>"double argument:"</font>);
f1(x);f2((<font color=#0000ff>float</font>)x);f3((<font color=#0000ff>long</font>)x);f4((<font color=#0000ff>int</font>)x);
f5((<font color=#0000ff>short</font>)x);f6((<font color=#0000ff>byte</font>)x);f7((<font color=#0000ff>char</font>)x);
}
<font color=#0000ff>public</font> <font color=#0000ff>static</font> <font color=#0000ff>void</font> main(String[] args) {
Demotion p = <font color=#0000ff>new</font> Demotion();
p.testDouble();
}
} <font color=#009900>///:~</font></PRE></FONT></BLOCKQUOTE>
<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">Here, the methods take narrower primitive
values. If your argument is wider then you must
<A NAME="Index398"></A><I>cast</I> to the necessary type using the type name in
parentheses. If you don’t do this, the compiler will issue an error
message.
</backtalk:display>
[ <a href='http://www.mindview.net/backtalk/CommentServlet?ID=TIJ3_CHAPTER4_I23'
target="_blank">Add Comment</a> ]
<backtalk:display ID=TIJ3_CHAPTER4_I24>
</FONT><BR></P></DIV>
<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">You should be aware that this is a
<A NAME="Index399"></A><A NAME="Index400"></A><I>narrowing conversion,</I> which
means you might lose information during the cast. This is why the compiler
forces you to do it—to flag the narrowing conversion.
</backtalk:display>
[ <a href='http://www.mindview.net/backtalk/CommentServlet?ID=TIJ3_CHAPTER4_I24'
target="_blank">Add Comment</a> ]
<backtalk:display ID=TIJ3_CHAPTER4_I25>
</FONT><A NAME="_Toc481064573"></A><BR></P></DIV>
<A NAME="Heading168"></A><FONT FACE = "Verdana"><H3 ALIGN="LEFT">
Overloading on return
values<BR><A NAME="Index401"></A><A NAME="Index402"></A></H3></FONT>
<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">It is common to wonder “Why only
class names and method argument lists? Why not distinguish between methods based
on their return values?” For example, these two methods, which have the
same name and arguments, are easily distinguished from each other:
</backtalk:display>
[ <a href='http://www.mindview.net/backtalk/CommentServlet?ID=TIJ3_CHAPTER4_I25'
target="_blank">Add Comment</a> ]
<backtalk:display ID=TIJ3_CHAPTER4_I26>
</FONT><BR></P></DIV>
<BLOCKQUOTE><FONT SIZE = "+1"><PRE><font color=#0000ff>void</font> f() {}
<font color=#0000ff>int</font> f() {}</PRE></FONT></BLOCKQUOTE>
<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">This works fine when the compiler can
unequivocally determine the meaning from the context, as in <B>int x =
f( )</B>. However, you can call a method and ignore the return value; this
is often referred to as <I>calling a method for its <A NAME="Index403"></A>side
effect</I> since you don’t care about the return value but instead want
the other effects of the method call. So if you call the method this way:
</backtalk:display>
[ <a href='http://www.mindview.net/backtalk/CommentServlet?ID=TIJ3_CHAPTER4_I26'
target="_blank">Add Comment</a> ]
<backtalk:display ID=TIJ3_CHAPTER4_I27>
</FONT><BR></P></DIV>
<BLOCKQUOTE><FONT SIZE = "+1"><PRE>f();</PRE></FONT></BLOCKQUOTE>
<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">how can Java determine which
<B>f( )</B> should be called? And how could someone reading the code see
it? Because of this sort of problem, you cannot use return value types to
distinguish overloaded methods.
</backtalk:display>
[ <a href='http://www.mindview.net/backtalk/CommentServlet?ID=TIJ3_CHAPTER4_I27'
target="_blank">Add Comment</a> ]
<backtalk:display ID=TIJ3_CHAPTER4_I28>
</FONT><A NAME="_Toc375545279"></A><A NAME="_Toc481064574"></A><BR></P></DIV>
<A NAME="Heading169"></A><FONT FACE = "Verdana"><H3 ALIGN="LEFT">
Default constructors</H3></FONT>
<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">As mentioned previously, a default
constructor (a.k.a. a “no-arg” constructor)
<A NAME="Index404"></A><A NAME="Index405"></A>is one without arguments, used to
create a “vanilla object.” If you create a class that has no
constructors, the compiler will automatically create a default constructor for
you. For example:
</backtalk:display>
[ <a href='http://www.mindview.net/backtalk/CommentServlet?ID=TIJ3_CHAPTER4_I28'
target="_blank">Add Comment</a> ]
<backtalk:display ID=TIJ3_CHAPTER4_I29>
</FONT><BR></P></DIV>
<BLOCKQUOTE><FONT SIZE = "+1"><PRE><font color=#009900>//: c04:DefaultConstructor.java</font>
<font color=#0000ff>class</font> Bird {
<font color=#0000ff>int</font> i;
}
<font color=#0000ff>public</font> <font color=#0000ff>class</font> DefaultConstructor {
<font color=#0000ff>public</font> <font color=#0000ff>static</font> <font color=#0000ff>void</font> main(String[] args) {
Bird nc = <font color=#0000ff>new</font> Bird(); <font color=#009900>// default!</font>
}
} <font color=#009900>///:~</font></PRE></FONT></BLOCKQUOTE>
<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">The line
</backtalk:display>
[ <a href='http://www.mindview.net/backtalk/CommentServlet?ID=TIJ3_CHAPTER4_I29'
target="_blank">Add Comment</a> ]
<backtalk:display ID=TIJ3_CHAPTER4_I30>
</FONT><BR></P></DIV>
<BLOCKQUOTE><FONT SIZE = "+1"><PRE><font color=#0000ff>new</font> Bird();</PRE></FONT></BLOCKQUOTE>
<DIV ALIGN="LEFT"><P><FONT FACE="Georgia">creates a new object and calls the
default constructor, even though one was not explicitly defined. Without it we
would have no method to call to build our object. However, if you define any
constructors (with or without arguments), the compiler will <I>not</I>
synthesize one for you:
</backtalk:display>
[ <a href='http://www.mindview.net/backtalk/CommentServlet?ID=TIJ3_CHAPTER4_I30'
target="_blank">Add Comment</a> ]
<backtalk:display ID=TIJ3_CHAPTER4_I31>
</FONT><BR></P></DIV>
<BLOCKQUOTE><FONT SIZE = "+1"><PRE><font color=#0000ff>class</font> Bush {
Bush(<font color=#0000ff>int</font> i) {}
Bush(<font color=#0000ff>double</font> d) {}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -