Java/Class/Override Polymorphism
Содержание
It only looks like you can override a private or private final method
<source lang="java">
// : c06:FinalOverridingIllusion.java // It only looks like you can override a private or private final method. // From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002 // www.BruceEckel.ru. See copyright notice in CopyRight.txt. class WithFinals {
// Identical to "private" alone: private final void f() { System.out.println("WithFinals.f()"); } // Also automatically "final": private void g() { System.out.println("WithFinals.g()"); }
} class OverridingPrivate extends WithFinals {
private final void f() { System.out.println("OverridingPrivate.f()"); } private void g() { System.out.println("OverridingPrivate.g()"); }
} class OverridingPrivate2 extends OverridingPrivate {
public final void f() { System.out.println("OverridingPrivate2.f()"); } public void g() { System.out.println("OverridingPrivate2.g()"); }
} public class FinalOverridingIllusion {
public static void main(String[] args) { OverridingPrivate2 op2 = new OverridingPrivate2(); op2.f(); op2.g(); // You can upcast: OverridingPrivate op = op2; // But you can"t call the methods: //! op.f(); //! op.g(); // Same here: WithFinals wf = op2; //! wf.f(); //! wf.g(); }
} ///:~
</source>
Method override demo
<source lang="java">
/* From http://java.sun.ru/docs/books/tutorial/index.html */ /*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution 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. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */
public class Earth extends Planet {
public static void hide() { System.out.println("The hide method in Earth."); } public void override() { System.out.println("The override method in Earth."); } public static void main(String[] args) { Earth myEarth = new Earth(); Planet myPlanet = (Planet)myEarth; myPlanet.hide(); myPlanet.override(); }
} class Planet {
public static void hide() { System.out.println("The hide method in Planet."); } public void override() { System.out.println("The override method in Planet."); }
}
</source>
Override Shape
<source lang="java">
// : c10:Shapes.java // From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002 // www.BruceEckel.ru. See copyright notice in CopyRight.txt. class Shape {
void draw() { System.out.println(this + ".draw()"); }
} class Circle extends Shape {
public String toString() { return "Circle"; }
} class Square extends Shape {
public String toString() { return "Square"; }
} class Triangle extends Shape {
public String toString() { return "Triangle"; }
} public class Shapes {
public static void main(String[] args) { // Array of Object, not Shape: Object[] shapeList = { new Circle(), new Square(), new Triangle() }; for (int i = 0; i < shapeList.length; i++) ((Shape) shapeList[i]).draw(); // Must cast }
} ///:~
</source>
Polymorphism in Java
<source lang="java">
// : c07:Shapes.java // Polymorphism in Java. // From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002 // www.BruceEckel.ru. See copyright notice in CopyRight.txt. import java.util.Random; class Shape {
void draw() { } void erase() { }
} class Circle extends Shape {
void draw() { System.out.println("Circle.draw()"); } void erase() { System.out.println("Circle.erase()"); }
} class Square extends Shape {
void draw() { System.out.println("Square.draw()"); } void erase() { System.out.println("Square.erase()"); }
} class Triangle extends Shape {
void draw() { System.out.println("Triangle.draw()"); } void erase() { System.out.println("Triangle.erase()"); }
} // A "factory" that randomly creates shapes: class RandomShapeGenerator {
private Random rand = new Random(); public Shape next() { switch (rand.nextInt(3)) { default: case 0: return new Circle(); case 1: return new Square(); case 2: return new Triangle(); } }
} public class ShapesDemo {
private static RandomShapeGenerator gen = new RandomShapeGenerator(); public static void main(String[] args) { Shape[] s = new Shape[9]; // Fill up the array with shapes: for (int i = 0; i < s.length; i++) s[i] = gen.next(); // Make polymorphic method calls: for (int i = 0; i < s.length; i++) s[i].draw(); }
} ///:~
</source>