package Lecture12; class Student { public Student(String fName, String lName) { firstName= fName; lastName= lName;} public void printData() { System.out.println(firstName + " " + lastName);} private String firstName; private String lastName; } class Undergrad extends Student { public Undergrad(String fName, String lName, double rate, double hours) { super(fName, lName); UnderWage= rate; UnderHours= hours; } public double getPay() { return UnderWage * UnderHours; } public void printData() { super.printData(); System.out.println("Paga semanal: $" + UnderWage * UnderHours); } private double UnderWage; private double UnderHours; } class Grad extends Student { public Grad(String fName, String lName, double salary) { super(fName, lName); GradSalary= salary; } public double getPay() { return GradSalary; } public void printData() { super.printData(); System.out.println("Salario mensual: $" + GradSalary); } private double GradSalary; } class SpecGrad extends Grad { public SpecGrad(String fName, String lName, double stipend) { super(fName, lName, 0.0); // Zero salary SpecStipend= stipend; } public double getPay() { return SpecStipend; } public void printData() { super.printData(); System.out.println("Remuneración semestral: $" + getPay()); } // ˇEs peligroso! Si se define una subclase, ésta invocará a su propio getPay. private double SpecStipend; } public class Student2 { public static void main(String[] args) { Undergrad Ferd= new Undergrad("Ferd", "Smith", 12.00, 8.0); Ferd.printData(); Grad Ann= new Grad("Ann", "Brown", 1500.00); Ann.printData(); SpecGrad Mary= new SpecGrad("Mary", "Barrett", 2000.00); Mary.printData(); System.out.println("\n"); Student[] team= new Student[3]; team[0]= Ferd; team[1]= Ann; team[2]= Mary; for (int i=0; i < 3; i++) team[i].printData(); } }