Last active
April 28, 2023 11:41
-
-
Save rjlutz/26c96dc2516850f7025761a14114ce0b to your computer and use it in GitHub Desktop.
Abstract Classes and Interfaces (Chapter 13) -- examples from Liang Intro to Java Comprehensive 10e
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Circle extends GeometricObject { | |
private double radius; | |
public Circle() { | |
} | |
public Circle(double radius) { | |
this.radius = radius; | |
} | |
/** Return radius */ | |
public double getRadius() { | |
return radius; | |
} | |
/** Set a new radius */ | |
public void setRadius(double radius) { | |
this.radius = radius; | |
} | |
@Override /** Return area */ | |
public double getArea() { | |
return radius * radius * Math.PI; | |
} | |
/** Return diameter */ | |
public double getDiameter() { | |
return 2 * radius; | |
} | |
@Override /** Return perimeter */ | |
public double getPerimeter() { | |
return 2 * radius * Math.PI; | |
} | |
/* Print the circle info */ | |
public void printCircle() { | |
System.out.println("The circle is created " + getDateCreated() + | |
" and the radius is " + radius); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class ComparableRectangle extends Rectangle | |
implements Comparable<ComparableRectangle> { | |
/** Construct a ComparableRectangle with specified properties */ | |
public ComparableRectangle(double width, double height) { | |
super(width, height); | |
} | |
@Override // Implement the compareTo method defined in Comparable | |
public int compareTo(ComparableRectangle o) { | |
if (getArea() > o.getArea()) | |
return 1; | |
else if (getArea() < o.getArea()) | |
return -1; | |
else | |
return 0; | |
} | |
@Override // Implement the toString method in GeometricObject | |
public String toString() { | |
return "Width: " + getWidth() + " Height: " + getHeight() + | |
" Area: " + getArea(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public interface Edible { | |
/** Describe how to eat */ | |
public abstract String howToEat(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public abstract class GeometricObject { | |
private String color = "white"; | |
private boolean filled; | |
private java.util.Date dateCreated; | |
/** Construct a default geometric object */ | |
protected GeometricObject() { | |
dateCreated = new java.util.Date(); | |
} | |
/** Construct a geometric object with color and filled value */ | |
protected GeometricObject(String color, boolean filled) { | |
dateCreated = new java.util.Date(); | |
this.color = color; | |
this.filled = filled; | |
} | |
/** Return color */ | |
public String getColor() { | |
return color; | |
} | |
/** Set a new color */ | |
public void setColor(String color) { | |
this.color = color; | |
} | |
/** Return filled. Since filled is boolean, | |
* the get method is named isFilled */ | |
public boolean isFilled() { | |
return filled; | |
} | |
/** Set a new filled */ | |
public void setFilled(boolean filled) { | |
this.filled = filled; | |
} | |
/** Get dateCreated */ | |
public java.util.Date getDateCreated() { | |
return dateCreated; | |
} | |
@Override | |
public String toString() { | |
return "created on " + dateCreated + "\ncolor: " + color + | |
" and filled: " + filled; | |
} | |
/** Abstract method getArea */ | |
public abstract double getArea(); | |
/** Abstract method getPerimeter */ | |
public abstract double getPerimeter(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class House implements Cloneable, Comparable<House> { | |
private int id; | |
private double area; | |
private java.util.Date whenBuilt; | |
public House(int id, double area) { | |
this.id = id; | |
this.area = area; | |
whenBuilt = new java.util.Date(); | |
} | |
public int getId() { | |
return id; | |
} | |
public double getArea() { | |
return area; | |
} | |
public java.util.Date getWhenBuilt() { | |
return whenBuilt; | |
} | |
@Override /** Override the protected clone method defined in | |
the Object class, and strengthen its accessibility */ | |
public Object clone() { | |
try { | |
return super.clone(); | |
} | |
catch (CloneNotSupportedException ex) { | |
return null; | |
} | |
} | |
@Override // Implement the compareTo method defined in Comparable | |
public int compareTo(House o) { | |
if (area > o.area) | |
return 1; | |
else if (area < o.area) | |
return -1; | |
else | |
return 0; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.ArrayList; | |
import java.math.*; | |
public class LargestNumbers { | |
public static void main(String[] args) { | |
ArrayList<Number> list = new ArrayList<Number>(); | |
list.add(45); // Add an integer | |
list.add(3445.53); // Add a double | |
// Add a BigInteger | |
list.add(new BigInteger("3432323234344343101")); | |
// Add a BigDecimal | |
list.add(new BigDecimal("2.0909090989091343433344343")); | |
System.out.println("The largest number is " + | |
getLargestNumber(list)); | |
} | |
public static Number getLargestNumber(ArrayList<Number> list) { | |
if (list == null || list.size() == 0) | |
return null; | |
Number number = list.get(0); | |
for (int i = 1; i < list.size(); i++) | |
if (number.doubleValue() < list.get(i).doubleValue()) | |
number = list.get(i); | |
return number; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Rational extends Number implements Comparable<Rational> { | |
// Data fields for numerator and denominator | |
private long numerator = 0; | |
private long denominator = 1; | |
/** Construct a rational with default properties */ | |
public Rational() { | |
this(0, 1); | |
} | |
/** Construct a rational with specified numerator and denominator */ | |
public Rational(long numerator, long denominator) { | |
long gcd = gcd(numerator, denominator); | |
this.numerator = ((denominator > 0) ? 1 : -1) * numerator / gcd; | |
this.denominator = Math.abs(denominator) / gcd; | |
} | |
/** Find GCD of two numbers */ | |
private static long gcd(long n, long d) { | |
long n1 = Math.abs(n); | |
long n2 = Math.abs(d); | |
int gcd = 1; | |
for (int k = 1; k <= n1 && k <= n2; k++) { | |
if (n1 % k == 0 && n2 % k == 0) | |
gcd = k; | |
} | |
return gcd; | |
} | |
/** Return numerator */ | |
public long getNumerator() { | |
return numerator; | |
} | |
/** Return denominator */ | |
public long getDenominator() { | |
return denominator; | |
} | |
/** Add a rational number to this rational */ | |
public Rational add(Rational secondRational) { | |
long n = numerator * secondRational.getDenominator() + | |
denominator * secondRational.getNumerator(); | |
long d = denominator * secondRational.getDenominator(); | |
return new Rational(n, d); | |
} | |
/** Subtract a rational number from this rational */ | |
public Rational subtract(Rational secondRational) { | |
long n = numerator * secondRational.getDenominator() | |
- denominator * secondRational.getNumerator(); | |
long d = denominator * secondRational.getDenominator(); | |
return new Rational(n, d); | |
} | |
/** Multiply a rational number to this rational */ | |
public Rational multiply(Rational secondRational) { | |
long n = numerator * secondRational.getNumerator(); | |
long d = denominator * secondRational.getDenominator(); | |
return new Rational(n, d); | |
} | |
/** Divide a rational number from this rational */ | |
public Rational divide(Rational secondRational) { | |
long n = numerator * secondRational.getDenominator(); | |
long d = denominator * secondRational.numerator; | |
return new Rational(n, d); | |
} | |
@Override | |
public String toString() { | |
if (denominator == 1) | |
return numerator + ""; | |
else | |
return numerator + "/" + denominator; | |
} | |
@Override // Override the equals method in the Object class | |
public boolean equals(Object other) { | |
if ((this.subtract((Rational)(other))).getNumerator() == 0) | |
return true; | |
else | |
return false; | |
} | |
@Override // Implement the abstract intValue method in Number | |
public int intValue() { | |
return (int)doubleValue(); | |
} | |
@Override // Implement the abstract floatValue method in Number | |
public float floatValue() { | |
return (float)doubleValue(); | |
} | |
@Override // Implement the doubleValue method in Number | |
public double doubleValue() { | |
return numerator * 1.0 / denominator; | |
} | |
@Override // Implement the abstract longValue method in Number | |
public long longValue() { | |
return (long)doubleValue(); | |
} | |
@Override // Implement the compareTo method in Comparable | |
public int compareTo(Rational o) { | |
if (this.subtract(o).getNumerator() > 0) | |
return 1; | |
else if (this.subtract(o).getNumerator() < 0) | |
return -1; | |
else | |
return 0; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Rectangle extends GeometricObject { | |
private double width; | |
private double height; | |
public Rectangle() { | |
} | |
public Rectangle(double width, double height) { | |
this.width = width; | |
this.height = height; | |
} | |
/** Return width */ | |
public double getWidth() { | |
return width; | |
} | |
/** Set a new width */ | |
public void setWidth(double width) { | |
this.width = width; | |
} | |
/** Return height */ | |
public double getHeight() { | |
return height; | |
} | |
/** Set a new height */ | |
public void setHeight(double height) { | |
this.height = height; | |
} | |
@Override /** Return area */ | |
public double getArea() { | |
return width * height; | |
} | |
@Override /** Return perimeter */ | |
public double getPerimeter() { | |
return 2 * (width + height); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.math.*; | |
public class SortComparableObjects { | |
public static void main(String[] args) { | |
String[] cities = {"Savannah", "Boston", "Atlanta", "Tampa"}; | |
java.util.Arrays.sort(cities); | |
for (String city: cities) | |
System.out.print(city + " "); | |
System.out.println(); | |
BigInteger[] hugeNumbers = {new BigInteger("2323231092923992"), | |
new BigInteger("432232323239292"), | |
new BigInteger("54623239292")}; | |
java.util.Arrays.sort(hugeNumbers); | |
for (BigInteger number: hugeNumbers) | |
System.out.print(number + " "); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class SortRectangles { | |
public static void main(String[] args) { | |
ComparableRectangle[] rectangles = { | |
new ComparableRectangle(3.4, 5.4), | |
new ComparableRectangle(13.24, 55.4), | |
new ComparableRectangle(7.4, 35.4), | |
new ComparableRectangle(1.4, 25.4)}; | |
java.util.Arrays.sort(rectangles); | |
for (Rectangle rectangle: rectangles) { | |
System.out.print(rectangle + " "); | |
System.out.println(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.*; | |
public class TestCalendar { | |
public static void main(String[] args) { | |
// Construct a Gregorian calendar for the current date and time | |
Calendar calendar = new GregorianCalendar(); | |
System.out.println("Current time is " + new Date()); | |
System.out.println("YEAR: " + calendar.get(Calendar.YEAR)); | |
System.out.println("MONTH: " + calendar.get(Calendar.MONTH)); | |
System.out.println("DATE: " + calendar.get(Calendar.DATE)); | |
System.out.println("HOUR: " + calendar.get(Calendar.HOUR)); | |
System.out.println("HOUR_OF_DAY: " + | |
calendar.get(Calendar.HOUR_OF_DAY)); | |
System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE)); | |
System.out.println("SECOND: " + calendar.get(Calendar.SECOND)); | |
System.out.println("DAY_OF_WEEK: " + | |
calendar.get(Calendar.DAY_OF_WEEK)); | |
System.out.println("DAY_OF_MONTH: " + | |
calendar.get(Calendar.DAY_OF_MONTH)); | |
System.out.println("DAY_OF_YEAR: " + | |
calendar.get(Calendar.DAY_OF_YEAR)); | |
System.out.println("WEEK_OF_MONTH: " + | |
calendar.get(Calendar.WEEK_OF_MONTH)); | |
System.out.println("WEEK_OF_YEAR: " + | |
calendar.get(Calendar.WEEK_OF_YEAR)); | |
System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM)); | |
// Construct a calendar for September 11, 2001 | |
Calendar calendar1 = new GregorianCalendar(2001, 8, 11); | |
String[] dayNameOfWeek = {"Sunday", "Monday", "Tuesday", "Wednesday", | |
"Thursday", "Friday", "Saturday"}; | |
System.out.println("September 11, 2001 is a " + | |
dayNameOfWeek[calendar1.get(Calendar.DAY_OF_WEEK) - 1]); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class TestEdible { | |
public static void main(String[] args) { | |
Object[] objects = {new Tiger(), new Chicken(), new Apple()}; | |
for (int i = 0; i < objects.length; i++) { | |
if (objects[i] instanceof Edible) | |
System.out.println(((Edible)objects[i]).howToEat()); | |
if (objects[i] instanceof Animal) { | |
System.out.println(((Animal)objects[i]).sound()); | |
} | |
} | |
} | |
} | |
abstract class Animal { | |
/** Return animal sound */ | |
public abstract String sound(); | |
} | |
class Chicken extends Animal implements Edible { | |
@Override | |
public String howToEat() { | |
return "Chicken: Fry it"; | |
} | |
@Override | |
public String sound() { | |
return "Chicken: cock-a-doodle-doo"; | |
} | |
} | |
class Tiger extends Animal { | |
@Override | |
public String sound() { | |
return "Tiger: RROOAARR"; | |
} | |
} | |
abstract class Fruit implements Edible { | |
// Data fields, constructors, and methods omitted here | |
} | |
class Apple extends Fruit { | |
@Override | |
public String howToEat() { | |
return "Apple: Make apple cider"; | |
} | |
} | |
class Orange extends Fruit { | |
@Override | |
public String howToEat() { | |
return "Orange: Make orange juice"; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class TestGeometricObject { | |
/** Main method */ | |
public static void main(String[] args) { | |
// Declare and initialize two geometric objects | |
GeometricObject geoObject1 = new Circle(5); | |
GeometricObject geoObject2 = new Rectangle(5, 3); | |
System.out.println("The two objects have the same area? " + | |
equalArea(geoObject1, geoObject2)); | |
// Display circle | |
displayGeometricObject(geoObject1); | |
// Display rectangle | |
displayGeometricObject(geoObject2); | |
} | |
/** A method for comparing the areas of two geometric objects */ | |
public static boolean equalArea(GeometricObject object1, | |
GeometricObject object2) { | |
return object1.getArea() == object2.getArea(); | |
} | |
/** A method for displaying a geometric object */ | |
public static void displayGeometricObject(GeometricObject object) { | |
System.out.println(); | |
System.out.println("The area is " + object.getArea()); | |
System.out.println("The perimeter is " + object.getPerimeter()); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class TestRationalClass { | |
/** Main method */ | |
public static void main(String[] args) { | |
// Create and initialize two rational numbers r1 and r2. | |
Rational r1 = new Rational(4, 2); | |
Rational r2 = new Rational(2, 3); | |
// Display results | |
System.out.println(r1 + " + " + r2 + " = " + r1.add(r2)); | |
System.out.println(r1 + " - " + r2 + " = " + r1.subtract(r2)); | |
System.out.println(r1 + " * " + r2 + " = " + r1.multiply(r2)); | |
System.out.println(r1 + " / " + r2 + " = " + r1.divide(r2)); | |
System.out.println(r2 + " is " + r2.doubleValue()); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
DAMNNNNNNNNN