Prof. Rodrigo Noll @ IFRS Canoas
int idades[] = new int[10];
idades[5] = 10;
ÍNDICE | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
VALOR | 0 | 0 | 0 | 0 | 0 | 10 | 0 | 0 | 0 | 0 |
public class MeuArray {
public static void main(String[] args) {
int idades[] = new int[10];
idades[5] = 10;
System.out.println(idades[5]);
idades[10] = 10;
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at br.edu.ifrs.canoas.java.arrays.MeuArray.main(MeuArray.java:9)
public class ContaTest {
Conta minhasContas[];
@Before
public void setup() {
minhasContas = new Conta[10];
}
@Test
public void testaArrayDeContas() {
minhasContas[0] = new Conta();
//Até aqui só um objeto foi criado do array de 10.
//Todos os outros espaços são null
minhasContas[0].saldo = 100;
minhasContas[0].deposita(50);
assertEquals("O saldo deve ser 100+50=150",
150, minhasContas[0].saldo,0);
}
}
public class AlgumaClasse {
public static void main(String[] args) {
int[] idades = new int[10];
System.out.println("Preenchendo da forma convencional");
for (int i = 0; i < idades.length; i++) {
idades[i] = i * 10;
}
System.out.println("Imprimindo com enhanced-for: foreach");
for (int idade : idades) {
System.out.println(idade);
}
}
}
class Conta {
private double saldo;
private double limite; //Só é relevante para conta
// ...
}
Os atributos de Conta são apenas visíveis apenas pelos objetos da Conta.
Mais ninguém pode modificar seus atributos.
Private | Default | Protected | Public | |
---|---|---|---|---|
Mesma classe | sim | sim | sim | sim |
Subclasse mesmo pacote | não | sim | sim | sim |
Classe mesmo pacote | não | sim | sim | sim |
Subclasse pacote diferente | não | não | sim | sim |
Classe pacote diferente | não | não | não | sim |
class Cliente {
private String nome;
private String endereco;
private String cpf;
private int idade;
public void mudaCPF(String cpf) {
if (validaCPF(cpf))
this.cpf = cpf;
}
private boolean validaCPF(String cpf) {
// série de regras aqui, falha caso não seja válido
}
// ..
}
Se alguém tentar criar um Cliente e não usar o mudaCPF para alterar um cpf diretamente, vai receber um erro de compilação, já que o atributo CPF é privado
public class Conta {
private double saldo;
private double limite;
private Cliente titular;
public double getSaldo() {
return this.saldo;
}
public void setSaldo(double saldo) {
this.saldo = saldo;
}
public double getLimite() {
return this.limite;
}
public void setLimite(double limite) {
this.limite = limite;
}
public Cliente getTitular() {
return this.titular;
}
public void setTitular(Cliente titular) {
this.titular = titular;
}
public double getSaldo() {
return this.saldo + this.limite;
}
}
class Conta {
int numero;
Cliente titular;
double saldo;
double limite;
// construtor
public Conta(Cliente titular) {
this.titular = titular;
System.out.println("Construindo uma conta.");
}
public Conta (int numero, Cliente titular) {
this(titular); // chama o construtor que foi declarado acima
this.numero = numero;
}
// ..
}
Cliente rodrigo = new Cliente();
rodrigo.nome = ”Rodrigo";
Conta c = new Conta(rodrigo);
System.out.println(c.titular.nome);
Construtor não retorna nada, nem void
class Conta {
private int totalDeContas;
//...
Conta() {
this.totalDeContas = this.totalDeContas + 1;
}
}
private static int totalDeContas;
class Conta {
private static int totalDeContas;
//...
Conta() {
Conta.totalDeContas = Conta.totalDeContas + 1;
}
}
public static int getTotalDeContas() {
return Conta.totalDeContas;
}
int total = Conta.getTotalDeContas();
class Funcionario {
String nome;
String cpf;
double salario;
//outros métodos
}
class Gerente {
String nome;
String cpf;
double salario;
int senha;
int numeroDeFuncionariosGerenciados;
public boolean autentica(int senha) {
if (this.senha == senha) {
return true;
} else {
return false;
}
}
// outros métodos
}
class Gerente extends Funcionario {
int senha;
int numeroDeFuncionariosGerenciados;
public boolean autentica(int senha) {
if (this.senha == senha) {
return true;
} else {
return false;
}
}
// setter da senha omitido
}
public String getNome() {
return "Gerente " + nome;
}
class Funcionario {
protected String nome;
protected String cpf;
protected double salario;
public double getBonificacao() {
return this.salario * 0.10;
}
// métodos
}
Da forma como está, o gerente, herdando o método de funcionário, terá a bonificação de 10%.
@Test
public void testBonificacao() {
gerente.setSalario(1000);
assertEquals("Com o salario de 1000, a bonificacao eh 100",
100, gerente.getBonificacao(),0);
}
Da forma como está, o gerente, herdando o método de funcionário, terá a bonificação de 10%.
class Gerente extends Funcionario {
int senha;
int numeroDeFuncionariosGerenciados;
public double getBonificacao() {
return this.salario * 0.15;
}
// ...
}
Não se esqueça de alterar a visibilidade do atributo salario (protected)
Funcionario funcionario1 = new Funcionario ();
Funcionario funcionario2 = new Gerente ();
Funcionario funcionario3 = new Desenvolvedor ();
funcionario1.calcularSalario();
funcionario2.calcularSalario();
funcionario3.calcularSalario();
Cálculo padrão...
Cálculo padrão...
Cálculo com horas extras...
public abstract class nomeClasse { ... }
Podem conter:
public class abstract Funcionario {
protected String nome;
protected String cpf;
protected double salario;
public Funcionario(){};
public Funcionario(String nome, String cpf, double salario){
this.nome = nome;
this.cpf = cpf;
this.salario = salario;
}
public abstract void exibirDados();
public abstract void calcularPagamento();
public void setNome(String nome){
this.nome = nome;
}
public String getNome(String nome){
return this.nome;
}
}
public interface Tributavel {
void calculaTributos();
default void log(String str){
System.out.println("Log:"+str);
}
}
Podemos ter métodos concretos em interfaces a partir do Java 8 usando o modificador default. Eles serão "herdados" por todos que implementarem essa interface.
Esse recurso, chamado default method, permite evoluir uma interface sem quebrar compatibilidade.