Java/Class/Overloading — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
|
(нет различий)
|
Текущая версия на 09:36, 1 июня 2010
Содержание
- 1 Demonstration of both constructor and ordinary method overloading
- 2 Demonstration of overriding fields
- 3 Demotion of primitives and overloading
- 4 Overloaded constructor
- 5 Overloaded method
- 6 Overloading a base-class method name in a derived class does not hide the base-class versions
- 7 Overloading based on the order of the arguments
- 8 Promotion of primitives and overloading
Demonstration of both constructor and ordinary method overloading
<source lang="java">
// : c04:JavaOverloading.java // Demonstration of both constructor and ordinary method overloading. // From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002 // www.BruceEckel.ru. See copyright notice in CopyRight.txt.
class Tree {
int height; Tree() { System.out.println("Planting a seedling"); height = 0; } Tree(int i) { System.out.println("Creating new Tree that is " + i + " feet tall"); height = i; } void info() { System.out.println("Tree is " + height + " feet tall"); } void info(String s) { System.out.println(s + ": Tree is " + height + " feet tall"); }
} public class JavaOverloading {
public static void main(String[] args) { for (int i = 0; i < 5; i++) { Tree t = new Tree(i); t.info(); t.info("overloaded method"); } // Overloaded constructor: new Tree(); }
} ///:~
</source>
Demonstration of overriding fields
<source lang="java">
/*
* Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002. * All rights reserved. Software written by Ian F. Darwin and others. * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS"" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Java, the Duke mascot, and all variants of Sun"s Java "steaming coffee * cup" logo are trademarks of Sun Microsystems. Sun"s, and James Gosling"s, * pioneering role in inventing and promulgating (and standardizing) the Java * language and environment is gratefully acknowledged. * * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for * inventing predecessor languages C and C++ is also gratefully acknowledged. */
/** Demonstration of overriding fields. */ public class OverrideField {
public static void main(String[] av) { System.out.println("OA"s version of getAttr returns: " + new OA().getAttr()); System.out.println("OB"s version of getAttr returns: " + new OB().getAttr()); // Declared as OA, instantiated as OB, so gets OB"s version of things. OA c = new OB(); System.out.println("C"s version of getAttr returns: " + c.getAttr()); }
} class OA {
final int attr = 1; int getAttr() { System.out.println("In OA.getAttr"); return attr; }
} class OB extends OA {
final int attr = 2; int getAttr() { System.out.println("In OB.getAttr"); super.getAttr(); // Just to show flow of control return attr; }
}
</source>
Demotion of primitives and overloading
<source lang="java">
// : c04:Demotion.java // Demotion of primitives and overloading. // From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002 // www.BruceEckel.ru. See copyright notice in CopyRight.txt. public class Demotion {
void f1(char x) { System.out.println("f1(char)"); } void f1(byte x) { System.out.println("f1(byte)"); } void f1(short x) { System.out.println("f1(short)"); } void f1(int x) { System.out.println("f1(int)"); } void f1(long x) { System.out.println("f1(long)"); } void f1(float x) { System.out.println("f1(float)"); } void f1(double x) { System.out.println("f1(double)"); } void f2(char x) { System.out.println("f2(char)"); } void f2(byte x) { System.out.println("f2(byte)"); } void f2(short x) { System.out.println("f2(short)"); } void f2(int x) { System.out.println("f2(int)"); } void f2(long x) { System.out.println("f2(long)"); } void f2(float x) { System.out.println("f2(float)"); } void f3(char x) { System.out.println("f3(char)"); } void f3(byte x) { System.out.println("f3(byte)"); } void f3(short x) { System.out.println("f3(short)"); } void f3(int x) { System.out.println("f3(int)"); } void f3(long x) { System.out.println("f3(long)"); } void f4(char x) { System.out.println("f4(char)"); } void f4(byte x) { System.out.println("f4(byte)"); } void f4(short x) { System.out.println("f4(short)"); } void f4(int x) { System.out.println("f4(int)"); } void f5(char x) { System.out.println("f5(char)"); } void f5(byte x) { System.out.println("f5(byte)"); } void f5(short x) { System.out.println("f5(short)"); } void f6(char x) { System.out.println("f6(char)"); } void f6(byte x) { System.out.println("f6(byte)"); } void f7(char x) { System.out.println("f7(char)"); } void testDouble() { double x = 0; System.out.println("double argument:"); f1(x); f2((float) x); f3((long) x); f4((int) x); f5((short) x); f6((byte) x); f7((char) x); } public static void main(String[] args) { Demotion p = new Demotion(); p.testDouble(); }
} ///:~
</source>
Overloaded constructor
<source lang="java">
public class Point {
int x, y; Point(int x, int y) // Overloaded constructor { this.x = x; this.y = y; } Point(Point p) // Overloaded constructor { this(p.x, p.y); } // Calls the first constructor void move(int dx, int dy) { x += dx; y += dy; } public String toString() { return "(" + x + ", " + y + ")"; }
}
</source>
Overloaded method
<source lang="java">
public class Overloading {
double method(int i) { return i; } boolean method(boolean b) { return !b; } static double method(int x, double y) { return x + y + 1; } static double method(double x, double y) { return x + y + 3; } public static void main(String[] args) { System.out.println(method(10, 20)); System.out.println(method(10, 20.0)); System.out.println(method(10.0, 20)); System.out.println(method(10.0, 20.0)); }
}
</source>
Overloading a base-class method name in a derived class does not hide the base-class versions
<source lang="java">
// : c06:Hide.java // Overloading a base-class method name in a derived class does not hide the base-class versions. // From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002 // www.BruceEckel.ru. See copyright notice in CopyRight.txt. class Homer {
char doh(char c) { System.out.println("doh(char)"); return "d"; } float doh(float f) { System.out.println("doh(float)"); return 1.0f; }
} class Milhouse { } class Bart extends Homer {
void doh(Milhouse m) { System.out.println("doh(Milhouse)"); }
} public class Hide {
public static void main(String[] args) { Bart b = new Bart(); b.doh(1); b.doh("x"); b.doh(1.0f); b.doh(new Milhouse()); }
} ///:~
</source>
Overloading based on the order of the arguments
<source lang="java">
// : c04:OverloadingOrder.java // Overloading based on the order of the arguments. // From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002 // www.BruceEckel.ru. See copyright notice in CopyRight.txt. public class OverloadingOrder {
static void print(String s, int i) { System.out.println("String: " + s + ", int: " + i); } static void print(int i, String s) { System.out.println("int: " + i + ", String: " + s); } public static void main(String[] args) { print("String first", 11); print(99, "Int first"); }
} ///:~
</source>
Promotion of primitives and overloading
<source lang="java">
// : c04:PrimitiveOverloading.java // Promotion of primitives and overloading. // From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002 // www.BruceEckel.ru. See copyright notice in CopyRight.txt. public class PrimitiveOverloading {
void f1(char x) { System.out.println("f1(char)"); } void f1(byte x) { System.out.println("f1(byte)"); } void f1(short x) { System.out.println("f1(short)"); } void f1(int x) { System.out.println("f1(int)"); } void f1(long x) { System.out.println("f1(long)"); } void f1(float x) { System.out.println("f1(float)"); } void f1(double x) { System.out.println("f1(double)"); } void f2(byte x) { System.out.println("f2(byte)"); } void f2(short x) { System.out.println("f2(short)"); } void f2(int x) { System.out.println("f2(int)"); } void f2(long x) { System.out.println("f2(long)"); } void f2(float x) { System.out.println("f2(float)"); } void f2(double x) { System.out.println("f2(double)"); } void f3(short x) { System.out.println("f3(short)"); } void f3(int x) { System.out.println("f3(int)"); } void f3(long x) { System.out.println("f3(long)"); } void f3(float x) { System.out.println("f3(float)"); } void f3(double x) { System.out.println("f3(double)"); } void f4(int x) { System.out.println("f4(int)"); } void f4(long x) { System.out.println("f4(long)"); } void f4(float x) { System.out.println("f4(float)"); } void f4(double x) { System.out.println("f4(double)"); } void f5(long x) { System.out.println("f5(long)"); } void f5(float x) { System.out.println("f5(float)"); } void f5(double x) { System.out.println("f5(double)"); } void f6(float x) { System.out.println("f6(float)"); } void f6(double x) { System.out.println("f6(double)"); } void f7(double x) { System.out.println("f7(double)"); } void testConstVal() { System.out.println("Testing with 5"); f1(5); f2(5); f3(5); f4(5); f5(5); f6(5); f7(5); } void testChar() { char x = "x"; System.out.println("char argument:"); f1(x); f2(x); f3(x); f4(x); f5(x); f6(x); f7(x); } void testByte() { byte x = 0; System.out.println("byte argument:"); f1(x); f2(x); f3(x); f4(x); f5(x); f6(x); f7(x); } void testShort() { short x = 0; System.out.println("short argument:"); f1(x); f2(x); f3(x); f4(x); f5(x); f6(x); f7(x); } void testInt() { int x = 0; System.out.println("int argument:"); f1(x); f2(x); f3(x); f4(x); f5(x); f6(x); f7(x); } void testLong() { long x = 0; System.out.println("long argument:"); f1(x); f2(x); f3(x); f4(x); f5(x); f6(x); f7(x); } void testFloat() { float x = 0; System.out.println("float argument:"); f1(x); f2(x); f3(x); f4(x); f5(x); f6(x); f7(x); } void testDouble() { double x = 0; System.out.println("double argument:"); f1(x); f2(x); f3(x); f4(x); f5(x); f6(x); f7(x); } public static void main(String[] args) { PrimitiveOverloading p = new PrimitiveOverloading(); p.testConstVal(); p.testChar(); p.testByte(); p.testShort(); p.testInt(); p.testLong(); p.testFloat(); p.testDouble(); }
} ///:~
</source>