Saturday, November 19, 2011

Final Keyword


The final keyword

The final keyword is used in several different contexts as a modifier meaning that what it modifies cannot be changed in some sense.

final classes

You will notice that a number of the classes in Java library are declared final, e.g.
public final class String 
This means this class will not be subclassed, and informs the compiler that it can perform certain optimizations it otherwise could not. It also provides some benefit in regard to security and thread safety.
The compiler will not let you subclass any class that is declared final. You probably won't want or need to declare your own classes final though.

final methods

You can also declare that methods are final. A method that is declared final cannot be overridden in a subclass. The syntax is simple, just put the keywordfinal after the access specifier and before the return type like this:
public final String convertCurrency()

final fields

You may also declare fields to be final. This is not the same thing as declaring a method or class to be final. When a field is declared final, it is a constant which will not and cannot change. It can be set once (for instance when the object is constructed, but it cannot be changed after that.) Attempts to change it will generate either a compile-time error or an exception (depending on how sneaky the attempt is).
Fields that are both finalstatic, and public are effectively named constants. For instance a physics program might define Physics.c, the speed of light as
public class Physics {

  public static final double c = 2.998E8;
  
  
}
In the SlowCar class, the speedLimit field is likely to be both final and static though it's private.
public class SlowCar extends Car {

  private final static double speedLimit = 112.65408; // kph == 70 mph

  public SlowCar(String licensePlate, double speed, double maxSpeed,
   String make, String model, int year, int numberOfPassengers, int numDoors) {
    super(licensePlate, 
     (speed < speedLimit) ? speed : speedLimit, 
     maxSpeed, make, model, year, numberOfPassengers, numDoors);
  }

  public void accelerate(double deltaV) {

     double speed = this.speed + deltaV;
     
     if (speed > this.maxSpeed) {
       speed = this.maxSpeed; 
     }
     
     if (speed > speedLimit) {
       speed = speedLimit;
     }
     
     if (speed < 0.0) {
       speed = 0.0; 
     } 
     
     this.speed = speed;    
     
  }
   
}

final arguments

Finally, you can declare that method arguments are final. This means that the method will not directly change them. Since all arguments are passed by value, this isn't absolutely required, but it's occasionally helpful.
What can be declared final in the Car and MotorVehicle classes?

java.lang.Math


Examples of java.lang.Math Methods
Here is an example program that exercises most of the routines in java.lang.Math. If your high school math is a little rusty, don't worry if you don't remember the exact meaning of logarithms or cosines. Just know that they're here in Java if you need them.
public class MathLibraryExample {

  public static void main(String[] args) {
   
    int i = 7;
    int j = -9;
    double x = 72.3;
    double y = 0.34;
 
    System.out.println("i is " + i);    
    System.out.println("j is " + j);
    System.out.println("x is " + x);    
    System.out.println("y is " + y);
    
    // The absolute value of a number is equal to
    // the number if the number is positive or
    // zero and equal to the negative of the number
    // if the number is negative.

    System.out.println("|" + i + "| is " + Math.abs(i));    
    System.out.println("|" + j + "| is " + Math.abs(j));
    System.out.println("|" + x + "| is " + Math.abs(x));    
    System.out.println("|" + y + "| is " + Math.abs(y));

    // Truncating and Rounding functions

    // You can round off a floating point number 
    // to the nearest integer with round()
     System.out.println(x + " is approximately " + Math.round(x));    
     System.out.println(y + " is approximately " + Math.round(y));    

    // The "ceiling" of a number is the  
    // smallest integer greater than or equal to
    // the number. Every integer is its own
    // ceiling.
     System.out.println("The ceiling of " + i + " is " + Math.ceil(i));    
     System.out.println("The ceiling of " + j + " is " + Math.ceil(j));
     System.out.println("The ceiling of " + x + " is " + Math.ceil(x));    
     System.out.println("The ceiling of " + y + " is " + Math.ceil(y));

     // The "floor" of a number is the largest 
     // integer less than or equal to the number.
     // Every integer is its own floor.
     System.out.println("The floor of " + i + " is " + Math.floor(i));    
     System.out.println("The floor of " + j + " is " + Math.floor(j));
     System.out.println("The floor of " + x + " is " + Math.floor(x));    
     System.out.println("The floor of " + y + " is " + Math.floor(y));

     // Comparison operators

     // min() returns the smaller of the two arguments you pass it
     System.out.println("min(" + i + "," + j + ") is " + Math.min(i,j));    
     System.out.println("min(" + x + "," + y + ") is " + Math.min(x,y));    
     System.out.println("min(" + i + "," + x + ") is " + Math.min(i,x));    
     System.out.println("min(" + y + "," + j + ") is " + Math.min(y,j));    

     // There's a corresponding max() method
     // that returns the larger of two numbers
     System.out.println("max(" + i + "," + j + ") is " + Math.max(i,j));    
     System.out.println("max(" + x + "," + y + ") is " + Math.max(x,y));    
     System.out.println("max(" + i + "," + x + ") is " + Math.max(i,x));    
     System.out.println("max(" + y + "," + j + ") is " + Math.max(y,j));    
     
     // The Math library defines a couple
     // of useful constants:
     System.out.println("Pi is " + Math.PI);    
     System.out.println("e is " + Math.E);      
     // Trigonometric methods
    // All arguments are given in radians

    // Convert a 45 degree angle to radians
    double angle = 45.0 * 2.0 * Math.PI/360.0;
    System.out.println("cos(" + angle + ") is " + Math.cos(angle));     
    System.out.println("sin(" + angle + ") is " + Math.sin(angle));    
   
     // Inverse Trigonometric methods
     // All values are returned as radians
  
    double value = 0.707;

    System.out.println("acos(" + value + ") is " + Math.acos(value));    
    System.out.println("asin(" + value + ") is " + Math.asin(value));    
    System.out.println("atan(" + value + ") is " + Math.atan(value));    

    // Exponential and Logarithmic Methods
 
    // exp(a) returns e (2.71828...) raised
    // to the power of a.  
    System.out.println("exp(1.0) is "  + Math.exp(1.0));
    System.out.println("exp(10.0) is " + Math.exp(10.0));
    System.out.println("exp(0.0) is "  +  Math.exp(0.0));

    // log(a) returns  the natural
    // logarithm (base e) of a.
    System.out.println("log(1.0) is "    + Math.log(1.0));
    System.out.println("log(10.0) is "   + Math.log(10.0));
    System.out.println("log(Math.E) is " + Math.log(Math.E));

    // pow(x, y) returns the x raised
    // to the yth power.
    System.out.println("pow(2.0, 2.0) is "  + Math.pow(2.0,2.0));
    System.out.println("pow(10.0, 3.5) is " + Math.pow(10.0,3.5));
    System.out.println("pow(8, -1) is "     + Math.pow(8,-1));

    // sqrt(x) returns the square root of x.
    for (i=0; i < 10; i++) {
      System.out.println(
       "The square root of " + i + " is " + Math.sqrt(i));
    }

      
    // Finally there's one Random method
    // that returns a pseudo-random number
    // between 0.0 and 1.0;
   
    System.out.println("Here's one random number: " + Math.random());    
    System.out.println("Here's another random number: " + Math.random());

  }

}



Here's the output from the math library example
i is 7
j is -9
x is 72.3
y is 0.34
|7| is 7
|-9| is 9
|72.3| is 72.3
|0.34| is 0.34
72.3 is approximately 72
0.34 is approximately 0
The ceiling of 7 is 7
The ceiling of -9 is -9
The ceiling of 72.3 is 73
The ceiling of 0.34 is 1
The floor of 7 is 7
The floor of -9 is -9
The floor of 72.3 is 72
The floor of 0.34 is 0
min(7,-9) is -9
min(72.3,0.34) is 0.34
min(7,72.3) is 7
min(0.34,-9) is -9
max(7,-9) is 7
max(72.3,0.34) is 72.3
max(7,72.3) is 72.3
max(0.34,-9) is 0.34
Pi is 3.14159
e is 2.71828
cos(0.785398) is 0.707107
sin(0.785398) is 0.707107
acos(0.707) is 0.785549
asin(0.707) is 0.785247
atan(0.707) is 0.615409
exp(1.0) is 2.71828
exp(10.0) is 22026.5
exp(0.0) is 1
log(1.0) is 0
log(10.0) is 2.30259
log(Math.E) is 1
pow(2.0, 2.0) is 4
pow(10.0, 3.5) is 3162.28
pow(8, -1) is 0.125
The square root of 0 is 0
The square root of 1 is 1
The square root of 2 is 1.41421
The square root of 3 is 1.73205
The square root of 4 is 2
The square root of 5 is 2.23607
The square root of 6 is 2.44949
The square root of 7 is 2.64575
The square root of 8 is 2.82843
The square root of 9 is 3
Here's one random number: 0.820582
Here's another random number: 0.866157