Herança
Herança A idéia é criar novas Classes construindo-as sobre outras existentes Ao herdar de uma classe, reusamos (herdamos) seus métodos E podemos adicionar novos métodos e campos para adaptar a nova classe para novas situações
Classes, Superclasses e Subclasses Vamos aprimorar nosso exemplo de classe Employee, adicionando uma nova classe Manager Um gerente é um empregado [também] possui salário, tem uma data de contratação, um nome Mas, adicionalmente, pode ter um bônus no salário
Classes, Superclasses e Subclasses Vamos aprimorar nosso exemplo de classe Employee, adicionando uma nova classe Manager Um gerente é um empregado [também] possui salário, tem uma data de contratação, um nome Mas, adicionalmente, pode ter um bônus no salário Tudo o que foi implementado em Employee (atributos, métodos) é preservado public class Manager extends Employee // métodos e atributos adicionados
Classes, Superclasses e Subclasses Ao usar extends, indicamos que estamos criando uma nova classe que deriva de uma classe existente a classe existente é chamada superclasse, classe base ou classe pai a nova classe é chamada subclasse, classe derivada ou classe filha public class Manager extends Employee // métodos e atributos adicionados
Classes, Superclasses e Subclasses Apesar da denominação talvez dar a entender o contrário, a superclasse não é superior à subclasse. O contrário que é verdade, uma vez que a subclasse herda tudo que a superclasse possui e Ao usar extends, indicamos que estamos criando uma nova classe que deriva de uma classe existente adiciona novas funcionalidades. a classe existente é chamada superclasse, classe base ou classe pai a nova classe é chamada subclasse, classe derivada ou classe filha public class Manager extends Employee // métodos e atributos adicionados
public class Manager extends Employee private double bonus; // outros atributos e métodos public void setbonus(double b) bonus = b;
public class Manager extends Employee private double bonus; // outros atributos e métodos public void setbonus(double b) bonus = b; //se temos um objeto do tipo Manager Manager boss =...; boss.setbonus(5000);
public class Manager extends Employee private double bonus; // outros atributos e métodos public void setbonus(double b) bonus = b; //se temos um objeto do tipo Manager Manager boss =...; boss.setbonus(5000); //se temos um objeto do tipo Employee Employee emp =...; emp.setbonus(5000); //ERRO!! O método não existe
public class Manager extends Employee private double bonus; // outros atributos e métodos public void setbonus(double b) bonus = b; //se temos um objeto do tipo Manager Manager boss =...; boss.setbonus(5000); boss.getname(); boss.getsalary(); boss.gethireday();
public class Employee private String name; private double salary; private Date hireday; public class Manager extends Employee private double bonus; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); public String getname() return name; n, double s, int year, int month, int calendar = new GregorianCalendar(year, // outros atributos e métodos public void setbonus(double b) bonus = b; public double getsalary() return salary; public Date gethireday() return hireday; public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; Além de poder usar os métodos da superclasse, todos os campos em Employee também existem em Manager. Ou seja, todos os objetos do tipo Manager têm 4 atributos: name, salary, hireday e bonus.
public class Employee private String name; private double salary; private Date hireday; public class Manager extends Employee private double bonus; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); public String getname() return name; n, double s, int year, int month, int calendar = new GregorianCalendar(year, // outros atributos e métodos public void setbonus(double b) bonus = b; public double getsalary() return salary; public Date gethireday() return hireday; public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; Ao criar uma subclasse, herdamos tudo e apenas indicamos (implementamos) as diferenças entre elas. Uma ação comum de refatorção de código em Orientação à Objetos é justamente criar superclasses mais genéricas com código comum.
public class Employee private String name; private double salary; private Date hireday; public class Manager extends Employee private double bonus; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); public String getname() return name; n, double s, int year, int month, int calendar = new GregorianCalendar(year, // outros atributos e métodos public void setbonus(double b) bonus = b; public double getsalary() return salary; public Date gethireday() return hireday; esse método funciona adequadamente para um Manager? public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise;
public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; // outros atributos e métodos public double getsalary() return salary + bonus; //não! public String getname() return name; public double getsalary() return salary; public void setbonus(double b) bonus = b; public Date gethireday() return hireday; sobreposição (override) public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise;
public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; // outros atributos e métodos public double getsalary() return salary + bonus; //não! public String getname() return name; public double getsalary() return salary; public void setbonus(double b) bonus = b; public Date gethireday() return hireday; subclasses não podem acessar os atributos privados da superclasse! public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise;
public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; // outros atributos e métodos public double getsalary() return getsalary() + bonus;// ainda n! public String getname() return name; public double getsalary() return salary; public void setbonus(double b) bonus = b; public Date gethireday() return hireday; subclasses podem acessar os atributos e métodos públicos da superclasse! public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise;
public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; // outros atributos e métodos public double getsalary() return getsalary() + bonus;// ainda n! public String getname() return name; public double getsalary() return salary; public Date gethireday() return hireday; public void setbonus(double b) bonus = b; public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise;
public class Employee private String name; private double salary; private Date hireday; public class Manager extends Employee private double bonus; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); public String getname() return name; public double getsalary() return salary; n, double s, int year, int month, int calendar = new GregorianCalendar(year, // outros atributos e métodos public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; public void setbonus(double b) bonus = b; public Date gethireday() return hireday; indicação que desejamos acessarum método sobreposto da superclasse public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise;
public class Employee private String name; private double salary; private Date hireday; public class Manager extends Employee private double bonus; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); public String getname() return name; public double getsalary() return salary; public Date gethireday() return hireday; n, double s, int year, int month, int calendar = new GregorianCalendar(year, public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; // outros atributos e métodos public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; public void setbonus(double b) bonus = b; Ao criar uma subclasse, herdamos tudo e apenas indicamos (implementamos) as diferenças entre elas. Podemos adicionar adicionar atributos e adicionar ou sobrepor métodos mas nunca podemos remover atributos ou métodos!
public class Employee private String name; private double salary; private Date hireday; public class Manager extends Employee private double bonus; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); public String getname() return name; public double getsalary() return salary; public Date gethireday() return hireday; n, double s, int year, int month, int calendar = new GregorianCalendar(year, public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; // outros atributos e métodos public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; public void setbonus(double b) bonus = b; Ao criar uma subclasse, herdamos tudo e apenas indicamos (implementamos) as diferenças entre elas. Podemos adicionar adicionar atributos e adicionar ou sobrepor métodos mas nunca podemos remover atributos ou métodos!
public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; public Manager(String n, double s, int year, int month, int day) super(n, s, year, month, day); bonus = 0; public String getname() return name; public double getsalary() return salary; public Date gethireday() return hireday; public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; public void setbonus(double b) bonus = b;
public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; public Manager(String n, double s, int year, int month, int day) super(n, s, year, month, day); bonus = 0; public String getname() return name; public double getsalary() return salary; public Date gethireday() return hireday; public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; public void setbonus(double b) bonus = b; chama o construtor da superclasse única forma de inicializar os atributos privados herdados da superclasse
public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; public Manager(String n, double s, int year, int month, int day) super(n, s, year, month, day); bonus = 0; public String getname() return name; public double getsalary() return salary; public Date gethireday() return hireday; public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; Se nenhum construtor public voidda setbonus(double superclasse b) é chamado explícitamente, o construtor padrão é chamado automaticamente. bonus Caso= b; não exista o construtor padrão é gerado um erro de compilação. As mesmas regras gerais sobre construtores também se aplicam as subclasses.
// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary());
// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); // saída do programa name=carl Cracker,salary=85000.0 name=harry Hacker,salary=50000.0 name=tommy Tester,salary=40000.0
// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); é sempre executado o método correto// de acordo saídacom do o tipo programa do objeto name=carl Cracker,salary=85000.0 name=harry Hacker,salary=50000.0 name=tommy Tester,salary=40000.0
// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); O fato de uma variável objeto poder referenciar múltiplos tipos reais diferentes é chamado polimorfismo. O fato de automaticamente chamar os metodos corretos, de acordo com o tipo real de um objeto, é chamado ligação dinâmica.
Hierarquia da Herança Podemos adionar muitas outras subclasses em Manager Por exemplo: Executive A coleção de todas as classes que herdam de uma superclasse comum é chamada de hierarquia da herança O caminho de uma subclasse em particular pelos seus ancestrais é chamado de cadeia hierárquica
Polimorfismo Uma regra simples para ajudar na decisão de usar ou não herança é a regra do é um Todo gerente é um empregado, mas nem todo empregado é gerente Outro é o princípio da substituição Indica que você pode usar um objeto da subclasse quando o programa espera um da superclasse Toda variável objeto em Java é polimórfica!
Polimorfismo Uma regra simples para ajudar na decisão de usar ou não herança é a regra do é um Um gerente é um empregado, mas nem todo empregado é gerente Outro é o princípio da substituição Indica que você pode usar um objeto da subclasse quando o programa espera um da superclasse Toda variável objeto em Java é polimórfica! Employee e; e = new Employee("João", 1000, 2015, Calendar.OCTOBER, 20); e = new Manager("João", 1000, 2015, Calendar.OCTOBER, 20); Manager boss = new Manager("Carl Cracker, 80000, 1987, 12, 15); Employee[] staff = new Employee[3]; staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); se referem ao mesmo objeto
// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); boss.setbonus(5000); // OK staff[0].setbonus(5000); // Erro! Manager m = staff[0]; // Erro!
Prevenindo a Herança Classes e métodos finais com o modificador final Pode ser útil quando você não quer que alguma subclasse mude a semântica de um método Ou ainda quando existe um método importante e complexo que você nãoquerqueumasubclasse faça alguma besteira vocêassume toda a responsabilidade por esse método
Prevenindo a Herança Classes e métodos finais com o modificador final public class Employee nenhuma subclasse pode sobrepôr public Employee(String n, double s, int year, int month, int day) name = n; salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public final String getname() return name;
Prevenindo a Herança Classes e métodos finais com o modificador final public final class Employee nenhuma subclasse pode ser criada public Employee(String n, double s, int year, int month, int day) name = n; salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getname() return name;
// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); // Coerção Manager m = (Manager) staff[0]; // OK Manager m = (Manager) staff[1]; // Erro!
// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); // Coerção if (staff[1] instanceof Manager) boss = (Manager) staff[1];
Classes Abstratas Uma superclasse pode ser tão genérica que pode se tornar apenas uma base (ou modelo) e não uma classe que poderia gerar instâncias utilizáveis Pode possuirmétodos quesó permitam implementaçõesem uma subclasse Por exemplo, adicionando uma classe Person como super classe de Employee e Manager
public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; faz sentido para toda pessoa (empregado, gerente ) public String getname() return name;
public abstract class Person public abstract String getdescription(); private String name; public Person(String n) como descrever uma pessoa (nome, salário) se não sabemos qual função dela? name = n; public String getname() return name;
public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; define método como abstrato sem implementação
public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; a classe também deve ser abstrata
public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; pode possuir atributos e métodos concretos!
public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; Person p = new Person("João"); // Erro! Person p = new Employee("Harry Hacker", 50000, 1989, 10, 1); // OK public class Employee extends Person private double salary; private Date hireday; public Employee(String n, double s, int year, int month, int day) super(n); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //...
public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; public class Student extends Person private String major; public Student(String n, String m) super(n); major = m; public class Employee extends Person private double salary; private Date hireday; public Employee(String n, double s, int year, int month, int day) super(n); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //... public String getdescription() return "a student majoring in " + major;
public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; public class Student extends Person private String major; public Student(String n, String m) super(n); major = m; public String getdescription() return "a student majoring in " + major; public class Employee extends Person private double salary; private Date hireday; public Employee(String n, double s, int year, int month, int day) super(n); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //... Person[] people = new Person[2]; people[0] = new Employee("Harry Hacker", 50000, 1989, 10, 1); people[1] = new Student("Maria Morris", "computer science"); for (Person p : people) System.out.println(p.getName() + ", " + p.getdescription());
public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; public class Employee extends Person private double salary; private Date hireday; public Employee(String n, double s, int year, int month, int day) super(n); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() Person[] people = new Person[2]; return String.format("an employee with public class Student extends people[0] Person= new Employee("Harry Hacker", a salary 50000, of $%.2f", 1989, 10, salary); 1); people[1] = new Student("Maria Morris", "computer science"); private String major; public Student(Stringfor n, (Person String m) p : people) super(n); major = m; //... System.out.println(p.getName() + ", " + p.getdescription()); // saída do programa public String getdescription() return "a student majoring in " + major; Harry Hacker, an employee with a salary of $50000,00 Maria Morris, a student majoring in computer science
public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; public class Student extends Person private String major; public Student(String n, String m) super(n); major = m; public String getdescription() return "a student majoring in " + major; public class Employee extends Person private double salary; private Date hireday; public Employee(String n, double s, int year, int month, int day) super(n); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //... só é possível chamar em Pessoa por ter declarado como abstrato, não baster ser implementado nas subclasses Person[] people = new Person[2]; people[0] = new Employee("Harry Hacker", 50000, 1989, 10, 1); people[1] = new Student("Maria Morris", "computer science"); for (Person p : people) System.out.println(p.getName() + ", " + p.getdescription());
public abstract class Person private String name; private int age = -1; public class Employee extends Person private double salary; private Date hireday; public Person(String n) name = n; public String getname() return name; public int getage() return age; protected void setage(int anage) age = anage; public abstract String getdescription(); public Employee(String n, double s, int year, int month, int day) super(n); setage(25); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //...
public abstract class Person private String name; private int age = -1; public class Employee extends Person private double salary; private Date hireday; public Person(String n) name = n; public String getname() return name; public int getage() return age; protected void setage(int anage) age = anage; public abstract String getdescription(); pode chamar public Employee(String n, double s, int year, int month, int day) super(n); setage(25); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //...
public abstract class Person private String name; private int age = -1; public Person(String n) name = n; public String getname() return name; public int getage() return age; protected void setage(int anage) age = anage; public abstract String getdescription(); não pode chamar public class Employee extends Person private double salary; private Date hireday; public Employee(String n, double s, int year, int month, int day) super(n); setage(25); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //... Person[] people = new Person[2]; people[0] = new Employee("Harry Hacker", 50000, 1989, 10, 1); people[1] = new Student("Maria Morris", "computer science"); for (Person p : people) p.setage(21);
Modificadores de Acesso Modificador public protected private padrão (nenhummodificador) Visibilidade Para o mundo Para o pacote e todas subclasses Apenas para a classe Para o pacote
A Classe Object Todo objeto em Java herda dessa classe mesmo que não explicitamente Alguns métodos são úteis boolean equals(object obj) int hashcode() String tostring()
public class ArrayListTest public static void main(string[] args) ArrayList<Employee> staff = new ArrayList<Employee>(); staff.add(new Employee("Carl Cracker", 75000, 1987, 12, 15)); staff.add(new Employee("Harry Hacker", 50000, 1989, 10, 1)); staff.add(new Employee("Tony Tester", 40000, 1990, 3, 15)); for (Employee e : staff) e.raisesalary(5); staff.get(0); staff.remove(1); Employee joao = new Employee("João", 45000, 2001, 2, 1); staff.remove(joao);
public class Manager extends Employee private double bonus; public Manager(String n, double s, int year, int month, int day) super(n, s, year, month, day); bonus = 0; public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; public void setbonus(double... somebonus) bonus = 0; for (double b : somebonus) bonus += b; Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000, 4000, 1000);
name = "java.lang.string"; Class cl = Class.forName(name); Class supercl = cl.getsuperclass(); String modifiers = Modifier.toString(cl.getModifiers()); if (modifiers.length() > 0) System.out.print(modifiers + " "); System.out.print("class " + name); if (supercl!= null && supercl!= Object.class) System.out.print(" extends " + supercl.getname()); System.out.print("\n\n"); printconstructors(cl); System.out.println(); printmethods(cl); System.out.println(); printfields(cl); System.out.println(""); public static void printmethods(class cl) Method[] methods = cl.getdeclaredmethods(); for (Method m : methods) Class rettype = m.getreturntype(); String name = m.getname(); System.out.print(" "); // print modifiers, return type and method name String modifiers = Modifier.toString(m.getModifiers()); if (modifiers.length() > 0) System.out.print(modifiers + " " System.out.print(retType.getName() + " " + name + "("); // print parameter types Class[] paramtypes = m.getparametertypes(); for (int j = 0; j < paramtypes.length; j++) if (j > 0) System.out.print(", "); System.out.print(paramTypes[j].getName()); System.out.println(");");
name = "java.lang.string"; Class cl = Class.forName(name); Class supercl = cl.getsuperclass(); String modifiers = Modifier.toString(cl.getModifiers()); if (modifiers.length() > 0) System.out.print(modifiers + " "); System.out.print("class " + name); if (supercl!= null && supercl!= Object.class) System.out.print(" extends " + supercl.getname()); System.out.print("\n\n"); printconstructors(cl); System.out.println(); printmethods(cl); System.out.println(); printfields(cl); System.out.println(""); // saída do programa public static void printmethods(class cl) Method[] methods = cl.getdeclaredmethods(); for (Method m : methods) Class rettype = m.getreturntype(); String name = m.getname(); System.out.print(" "); // print modifiers, return type and method name String modifiers = Modifier.toString(m.getModifiers()); if (modifiers.length() > 0) System.out.print(modifiers + " " System.out.print(retType.getName() + " " + name + "("); // print parameter types Class[] paramtypes = m.getparametertypes(); for (int j = 0; j < paramtypes.length; j++) if (j > 0) System.out.print(", "); System.out.print(paramTypes[j].getName()); System.out.println(");"); public boolean equals(java.lang.object); public java.lang.string tostring(); public int hashcode(); public int compareto(java.lang.string); public volatile int compareto(java.lang.object); public int indexof(int); public int indexof(java.lang.string);