Java/Class/Override Polymorphism

Материал из Java эксперт
Перейти к: навигация, поиск

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>