Baixe o app para aproveitar ainda mais
Prévia do material em texto
Preparatório para Certificação JAVA - OCPJP Índice de Conteúdo Introdução o Sobre o Curso o Metodologia do Curso o Sobre o exame OCPJP o Blog do Autor o Por que ser um profissional certificado? o Certificações Oracle o Guia do Exame Fundamentos Java o Identificadores e classes o Interface e modificadores de acesso o Construtores e variáveis Orientação a Objetos o Sobrecarga e conversão o Interface e tipos de retorno Exercício 1 o Respostas do Exercício 1 Atributos o Array e Blocos o Wrapper e AutoBoxing o Ampliação e Sobrecarga de variáveis Operadores Controle de Fluxo Exercício 2 o Respostas do exercício 2 API - Tratamento Exceções /Assertivas o Assertivas API o Classe String o StringBuilder & StringBuffer o Manipulação de Arquivos o Serialização http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1504 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1486 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1555 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1484 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1478 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/3264 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1530 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/17671 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1488 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1517 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1518 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1729 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1519 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1764 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2084 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1544 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/3582 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1522 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2106 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2107 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2108 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1523 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2175 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1546 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1551 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2171 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2194 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2220 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2221 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2222 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2242 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2260 o Datas, Números e Moeda o Regex Subscrevendo Equals/hashCode Conjuntos o Interface Comparable e Comparator o Sets e PriorityQueue Genéricos Exercício 3 o Respostas do exercício 3 Classes Internas Threads o Estados e transições o Sincronização e iteração Desenvolvimento Simulado Considerações Finais Introdução O curso a seguir é destinado à quem pretente se tornar um OCPJP (antiga SCJP). Nos tópicos teremos acesso a algumas informações relevantes ao curso e ao exame. Sobre o Curso Este curso não tem por objetivo ensinar a tecnologia Java. São necessários bons conhecimentos básicos sobre a tecnologia. Afinal de contas, o aluno realizará um exame real que exige isso. Não é necessário ser um expert em JSE, JEE ou JME., mas é preciso algum envolvimento básico com Java, como: Saber o que é uma classe Java Atributos Java Tipos de métodos Conceito básico de Orientação a Objetos http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2276 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2295 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2309 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1524 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2547 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2559 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1525 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1547 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1554 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1526 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1527 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2389 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2390 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1528 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/1529 http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp/pagina/2530 Todos os códigos foram testados, desde os que compilam aos que não compilam e aos que lançam exceções. Muitas explicações foram inseridas dentro de comentários Java, a fim de prender a atenção do aluno na explicação e no entendimento do código de forma simultânea. O aluno encontrará neste curso: Explicação dos objetivos para o exame Exemplos através de códigos Alguns exercícios para revisar Simulado Metodologia do Curso Este curso é um pouco diferente de qualquer outro online, já que não segue um padrão de explicação (calma, não fique assustado. Vamos explicar mais adiante). Há capítulos em que a explicação está dentro dos comentários dos códigos, e outros em que ela se encontra na introdução do capítulo. É usada uma linguagem menos formal para as explanações. Mas qual a razão disso? No primeiro caso, o objetivo é forçar o aluno a entender o assunto através dos códigos que estão sendo apresentados, pois no exame real haverá muitas questões com códigos e perguntas referentes a eles. O exame não separa a teoria da prática - na verdade, ele as concatena. Ou seja, questões exclusivamente teóricas não são o forte do exame. Então, desde já, o aluno precisa estar acostumado a ler o código e associá-lo com a teoria. No segundo caso, será adotada uma linguagem menos formal, pelo fato de o instrutor acreditar que isso poderia ajudar no entendimento dos assuntos de uma forma menos técnica com relação ao português. A intenção é que o aluno se sinta em um bate-papo com um amigo, e não em um curso online. Às vezes será usada a primeira pessoa para explicar um assunto. Quando issoacontecer, o aluno deve refletir e pensar como se estivesse explicando o conteúdo para si mesmo. A intenção é que o aluno se lembre mais facilmente do material. Infelizmente, há partes no exame que será exigida a "decoreba". Sobre o exame OCPJP Como fazer o exame? Para fazer o exame você precisa ir no site da Oracle, solicitar o voucher e informar qual exame deseja. Após a solicitação, em alguns dias dias úteis você recebe um e-mail para efetuar o pagamento em boleto do voucher. O valor do voucher está sujeito alteração e você deve verificar com Oracle. Após a confirmação de pagamento a Oracle envia o voucher via e-mail. Fique atento para o endereço da Oracle não estar sendo filtrado pelo seu filtro de spam. Validade: Você tem até um ano para fazer a prova. Marcando o exame: após ter estudado bastante é hora de marcar a prova, e o processo é feito apenas on-line. O candidato deve marcar o exame de 10 a 15 dias antes da data que pretende fazer. Caso seja necessário cancelar o exame, você deve fazê-lo até três dias antes da data agendada. O exame Antes de iniciar o exame real, a Oracle vem com umas 10 perguntas apenas para saber o nível dos candidatos do exame. Ainda não é o exame real. A Oracle durante todo o tempo vai tentar tirar sua atenção, como por exemplo: protected class Teste1{ int z=10; public static void main(String ars[]){ int z=10; http://education.oracle.com/ http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky System.out.println(z); }} A – Compila e imprime 10 B – Não compila por que mudou o nome de args C – Lança uma exceção NullPointerException D – Não compila A resposta para essa questão é letra D. Devido o modificador protected não ser um modificador válido para classe pai. O que é mais cobrado no exame? Percebi que o exame é bem focado nos seguintes objetivos: fundamentos e OO. Porém entender OO de forma fluente é uma boa garantia de se passar no exame, mesmo que o programador não seja um expert em API, threads, etc. Como são cobrados os novos recursos Java 5? Os novos recursos Java 5 são cobrados a todo momento. Como as regras de Wrappers, generics, var-args as novas API. O exame está bem direto ao objetivo: “de ficar longe dos bits e mais próximo das API.” E o tempo é suficiente? Sim (são 180 minutos). Porém o candidato deve estar bem preparado para o exame. Caso contrário o tempo se esgota e o candidato vai marcar a última questão restando apenas 5 minutos. E isso aumenta o risco de ver a mensagem “fail". Estilo das questões do exame: total 60 questões (OCPJP) Múltipla escolha: é onde tem mais pegadinhas. Muita atenção a elas e desconfie daquelas que as respostas aparentam ser óbvias. Antes de responder, analise http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky sempre as respostas e o código. Veja se há quebra das regras de fundamentos, OO antes de marcar a opção que demonstra ser a mais óbvia. Drop: dizem por aí que são as questões mais complicadas no exame. Na minha opinião, considero um “certo mito”, pois são as questões que o candidato tem certeza que: uma das opções dadas tem que preencher as lacunas em branco e, que o código ali está correto. Não há pegadinhas nessas questões. Porém exige que o futuro programador tenha praticado, e muito, durante a fase de preparação, já que esse tipo de questão está bem próxima das questões mais práticas. Mais de uma opção correta/errada: Essas questões também tem pegadinhas como as de múltipla escolha. Porém a diferença aqui é que o exame informa quantas opções você deve marcar. Se o exame mencionar duas corretas/erradas, localize as duas respostas. Táctica de ser um bom administrador de tempo no exame Primeiro: fazer todas as questões do exame normalmente. Quando a questão for muito longa e tiver uma sintaxe com mais de 30 linhas, marque para revisar. As drop não faça logo de cara. Apenas abra a questão, olhe as opções, anote o número da questão e, do lado coloque a resposta que achou válida (essas questões consomem muito tempo). Após ter feito todas as questões simples, você vai estar no final do exame e, o mesmo vai te informar que algumas questões não foram respondidas, ou seja, estão em branco. Claro que você sabe, são as de drop (no meu caso apareceram apenas 10 questões desse tipo). Então, agora é hora de resolvê-las! Agora com mais calma e, nessa altura, sua ansiedade de saber quais as próximas questões, não existe mais. Agora restam as questões marcadas para revisar e analisar. Havia questões com códigos com 45 linhas. Pronto! Agora vamos estar há aproximadamente 1h20 do término do exame. Pode dar uma relaxada (se espreguiçar, beber uma água). Em seguida comece a fazer o simulado novamente, revisando a primeira questão e perguntando por quê? As outras alternativas não são verdadeiras? Exceto aquelas que estavam claras que realmente não compilava (onde você já identificou isso na primeira fase). Terminada a revisão, ainda devem restar uns minutos para o final do exame. Ou você finaliza o exame, ou revisa mais uma questão. No meu caso finalizei, pois comecei a sentir uma leve dor de cabeça. Na revisão é normal identificar as pegadinhas, e as possíveis questões que você estaria perdendo, por uma pequena falta de atenção. Um dica: não revise as questões de drop. Se tentar, o exame vai apagar a sua resposta anterior. Além de que, tentando novamente, o exame emite uma mensagem a respeito. Esse foi um dos motivos pelo qual deixei por último as de drop. Tempo nas questões Não demore mais de 3 min em uma questão seja ela qual for. Assim você ganha tempo na revisão. Aprovação Para ser aprovado você precisa atingir 58.33% Não há diferença entre a quantidade e percentual de aprovação entre o exame para Java 5 ou 6. São os mesmos. Qual fazer OCPJP 5 ou 6? Sempre recebo e-mails com essa pergunta. E sempre aconselho, que o candidato deve fazer o exame que ele se sente mais preparado em realizar, porque as diferenças entre um exame e outro são pouquissimas. Falo isso para quem já vem se preparando para OCPJP 5 e não quer ter migrar para OCPJP 6. Porém, se você vai começar o estudo hoje, recomendaria já iniciar os estudos a partir da OCPJP 6. O mercado aceita as duas versões igualmente, não existe diferenciação quanto a isso. E o nosso curso, cobre qual exame? Eu diria que aborda os dois exames. Uma vez que a parte mais cobrada e talvez a mais díficil nos iremos cobrir. O que foi adicionado no exame OCPJP 6, de fato não merece nem que você compre um livro ou faça um curso especifico, pois abordagem do assunto está dentro do Java doc. São algumas novas APIs adicionadas apenas. Blog do Autor No blog do autor, há posts interessantes sobre o assunto na categoria Certificações. Portanto não deixe de acessar. Acesse: www.camilolopes.com.br Por que ser um profissional certificado? A certificação é um selo de qualidade, um atestado de competência e um diferencial na carreira profissional. Um bom caminho é ter Experiência + Certificação. Tanto a certificação quanto a experiência são assuntos bastante polêmicos em fóruns, comunidades, nos corredores das universidades etc. O que deve ficar claro para o profissional de TI é que a certificação e a experiência andam juntas e devem ser somadas na carreira profissional. A certificação é um meio para o profissional testar seu conhecimento ou aprender de forma disciplinada uma determinada tecnologia (por exemplo, Java). Uma certificação tem diversas vantagens para um profissional, entre elas: Melhor posicionamento no mercado; Testar o conhecimento sobre a tecnologia; Procura das empresas por profissionais certificados. http://blog.camilolopes.com.br/?page_id=1312 Certificações OracleA Oracle possui várias certificações. Para entender cada uma delas há um link no site da Oracle Education com o caminho que o certificado OCPJP pode seguir após obter a certificação, confira: Oracle Education Um artigo publicado no iMasters tem informações mais detalhadas sobre as certificações Oracle. Certificações Oracle Guia do Exame Guia do Exame SCJP http://education.oracle.com/ http://imasters.com.br/artigo/2547/oracle/certificacoes_oracle/ http://static.imasters.com.br/img/curso/45932.jpg É um livro que surgiu com base minha necessidade de ter um livro focado nas "pegadinhas" do exame. Durante a minha preparação sentir falta de um livro assim: curto, rápido,objetivo e focado do exame. Como não tinha tive que ir trilhando meu caminho. E no final de tudo, surgiu ele. :) Então se após o curso ou durante você precisa de um livro que o ajude revisar os conceitos chaves para o exame e de quebra as pegadinhas, o Guia do Exame SCJP é para você. Nota: Apesar do livro levar a sigla SCJP, pois em 2010 quando foi lançado a Oracle ainda não tinha comprado a Sun. Mas, eu diria que o conteúdo do livro é válido quanto para versão 5 ou 6 da prova. Para comprar o livro 30% de desconto, basta ir no site da editora www.lcm.com.br e realizar a compra usando o código a seguir V00014. Dúvidas? Só enviar. http://www.lcm.com.br/ http://static.imasters.com.br/img/curso/45932.jpg Fundamentos Java Neste tópico serão tratados os fundamentos Java, que você vai precisar conhecer para todo o exame. É um dos tópicos mais importantes, pois os demais assuntos dependem daqueles abordados aqui. Alguns assuntos podem ser mostrados de maneira superficial pelo fato de não ter chegado o momento de abordá-los. Tudo tem seu tempo exato. Identificadores e classes Este primeiro tópico tratará dos fundamentos básicos da tecnologia Java. Alguns tópicos podem ser considerados muito básicos para quem já passou pelo Java Básico. Mas é prudente citar e revisar para evitar esquecimentos. Identificadores Legais Os identificadores legais em Java só podem começar por letra, $ ou _. Qualquer outra forma colocada impede a compilação do código. O uso das palavras-chave não é permitido. Convenção da Oracle É apenas uma forma organizada de você desenvolver sua sintaxe, porém nada obriga a usar algo diferente. Lembrando que a convenção é a mais utilizada por todos os bons programadores Java. Veja o seguinte: Constantes: as variáveis declaradas como final, static e do tipo enum devem estar em maiúsculo. Variáveis: devem iniciar com letras minúsculas. No caso de nome composto, a primeira letra será em maiúsculo. Métodos: a primeira letra deve ser minúscula e seguir o padrão JavaBeans,onde este diz que para obter algo de um método você usa get, e para fazer algo usamos set Classes/Interface: as primeiras letras devem ser maiúsculas e as demais minúsculas. Se formarem um nome composto, o início de cada nome deve ser com letra maiúscula. Java Bean Nomeação A nomeação foi criada para ajudar desenvolvedores a criar componentes Java de fácil interpretação para outros programadores. Boolean: is ou get Chamada: set devem usar argumentos ou não e devem retornar um tipo void Obter: get - não pode ter argumentos, deve retornar um tipo e ser um método public (set e get) Classes Uma class declarada como padrão (default) pertence apenas àquele pacote (pasta, diretório) onde foi criada. Não é possível acessar uma default class de um pacote diferente, mesmo que ele tenha um import: package p; class Ave{} package A; import p.Ave; class Galo extends Ave{} O código acima não compila devido ao fato de a class Ave ser padrão daquele pacote - ela é dele, e ninguém pode usar. A solução para isso é declarar a class Ave como public, assim ela estaria disponível para o mundo, ou seja, para qualquer pacote. Quando class é public, é possível importá-la para outro pacote diferente. package cap1.Fornecedor; class Dept { } package cap1.Produto; import cap1.Fornecedor.Dept; public class Prod { public static void main(String[] args) { System.out.println("Produto fornecedor"); }} Esse código não compila, pois a Class Dept é default, então não pode ser importada para outro package, a não ser aquele onde foi declarada. Esse tópico é alvo de pegadinha em simulados. Class abstract As class abstratas nunca podem ser declaradas como FINAL, pois devem ter alguém que as estenda. As regras abaixo não podem ser esquecidas: Jamais usar FINAL e ABSTRACT juntos, tanto para classes quanto para método abstract. Uma class abstrata pode ter um ou nenhum método abstrato, porém se uma class concreta tiver um método abstrato, ela deve ser declarada como abstract. Para clarear o conceito de class abstract: seria aquilo que não é real, como um veículo (moto, carro, avião). Por isso não se cria instância new de objetos de uma classe abstrata, ou seja, de um veículo. É criada uma instância de uma class quando é algo real, algo concreto em que posso tocar, como uma galinha ou um carro. abstract class Galinha{ void setIdade(int d); http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky } package cap1.Carros; public abstract class Celta { } package cap1.cliente; import cap1.Carros.Celta; class Cli extends Celta{ public static void main(String args[]){ System.out.println("ok"); }} Observe que importei uma class de outro pacote devido ao modificador public que ela possui. Isso aqui é uma má implementação, porque estou dizendo que Cli é um Celta, mas, no exame, você será testado com nomes estranhos, que não usaria na vida real. O objetivo dos examinadores é tentar tirar sua atenção com apenas uma nomeação. Se você aluno é “esperto” o suficiente, vai saber que um nome não apropriado não quer dizer que a classe não compila. Vejamos mais exemplos: package cap1.Produto; import cap1.Fornecedor.*; public class Prod { http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky public static void main(String[] args) { System.out.println("Produto fornecedor"); }} Esse código funciona. Observe que coloquei * (asterisco) na importação da classe. Assim estamos dizendo que é para importar todas todas as classes visíveis daquele pacote. Pegadinha para o exame: class Bike{ void cor(); } class Boy extends Bike{ void cor(){} public static void main(String ar[]){ new Boy().cor(); } } Esse código não compila, pois o método da class Bike não é abstract. O fato de colocar ; (ponto e vírgula) não é suficiente para afirmar que um método é abstract. Interface e modificadores de acesso Interface É apenas um contrato feito entre a class e a interface que ela vai implementar. As interfaces servem para o caso seguinte: http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky Minha class Ferrari, ou seja meu carro Ferrari, vai ser o único, entre outros 10 carros de luxo, que vai ter efeitos especiais no painel. Então fazemos um contrato com a interface que vai prestar esse serviço à minha Ferrari, e a class Ferrari vai cumprir todas as regras da Interface. interface Efeitos{ void setPiscar(); void setFarol(); } class Ferrari implements Efeitos{ void setPiscar(){} //não compila ométodo deve ser declarado como public void setFarol(){} } Uma interface é 100% abstrata e não pode ter, de maneira alguma, o modificador FINAL em nenhum dos seus métodos. A diferença entre interfaces e class abstrata é que, nas interfaces, não pode haver, em momento algum, um método que não seja abstrato. Mas podemos ter variáveis, desde que sejam constantes. O que você precisa saber e jamais esquecer: As constantes são public static e final As interfaces são sempre abstract implicitamente A classe que implementa a interface deve declarar explicitamente como public os métodos implementados, senão gera o erro de compilação O valor de uma constante, após a definição, não pode ser alterado - é o mesmo que se trancar em um quarto e mandar jogar a chave fora Não temos interface com o acesso default. Os métodos de uma interface são: public e abstract. E as variáveis: public static e final Interfaces não implementam outras, apenas extendem (extends) à outra interface Interfaces são implementadas por classes A única coisa que interface faz é extender a outra e ser implementada por uma class concreta Class abstrata pode passar a implementação de uma interface para a próxima class concreta Vejamos alguns exemplos: package cap1; public interface Veiculo { int x=10; } package cap1; public class Carro implements Veiculo{ public void setNome(String n){ n="celta"; System.out.println(n); } public void setPlaca(int p){ p=2568; System.out.println(p); } public static void main(String[] args) { System.out.println(x);//10 new Carro().setNome("celta"); http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky new Carro().setPlaca(25); } } Observe que implementei os métodos e acessei minha variável x - public static e final. O código abaixo não compila. Coloquei minha interface com default e tentei acessá-la em outro pacote. Veja: package cap1.inter; interface Moda { String r = "roupa"; } package cap1; public class Loja implements Moda{ public static void main(String args[]){ System.out.println(r); }} Recebemos este erro do compilador: Exception in thread "main" java.lang.Error: Unresolved compilation problem: cannot be resolved Para resolver esse problema, devemos fazer isto: package cap1.inter; public interface Moda { String r = "roupa"; http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Aexception+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Aerror+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky } package cap1; import cap1.inter.Moda; public class Loja implements Moda{ public static void main(String args[]){ System.out.println(r); }} Fique atento às regras e saiba como resolver o problema quando encontrar um código que não compila. Há questões em que a Sun vai afirmar que não compila, e o futuro programador certificado deve saber a solução. Como falamos no tópico anterior sobre modificadores de acesso, vamos aproveitar e entrar no assunto. Modificadores de acesso Eles controlam o nível de acesso entre os membros de uma class. Podem ser: public, default, private e protect. Importante deixar claro que uma classe só pode ser default ou public. O importante está no nível da class. Se ela está disponível para outra class visualizá-la, então seus membros (métodos e variáveis) estão disponíveis também para ela. Claro, apenas os que forem marcados. //a class B não tem acesso aos membros da class A, // se declaradas em package diferentes class A{ public int a=10; } class B{ A i = new A(); i.a; http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky } Observe que as duas têm acesso padrão, mas nenhuma conhece a outra. A nem sabe que B existe (lembrando que elas estão em package diferentes). No exame pode aparecer uma questão perguntando qual modificador é apropriado para que um determinado código compile. Temos as seguintes opções: Quando um membro é declarado com public, todas as classes têm acesso a ele, mesmo fora do package (não se esqueça de importar). Lembrando que a class deve ser public; caso contrário, nada feito. Os private pertencem àquela mesma classe, ou seja, ninguém poderá ver a não ser que seja da class o qual foi declarado. Pense nisso quando vir algo declarado em uma class private. O capital na sua conta bancária é private, então somente você tem acesso, certo? Mas outros membros da classe Banco podem saber o valor na sua conta, como o gerente, o sub-gerente, etc. class Conta{ private double real = 1000.0000.000; } protected e default: São bastante parecidos e confudem muito na hora do exame. protected: Você pode ter acesso ao membro de uma class mesmo que ela esteja fora do pacote atual, através de herança. default: Não é possível ter acesso ao membro de outro pacote. Default = = membro é desse pacote e ninguém vai usá-lo, se quiser que entre no pacote. Mesmo com uma class public, se o membro for default, ele não pode ser usado em outra classe de outros pacotes. Para um protected não faz diferença se o membro declarado como protected está fora do pacote, pois ele é acessado da mesma forma, através da herança. Exemplo: package cert; public class Ot{ protected int x=9; int z = 10; } package oth; import cert.*; class Her extends Ot{ System.out.println(x); } Lembrando que variáveis de pacotes diferentes (marcadas como protected) não são herdadas, mas a subclass visualiza o membro de uma class que está em outro pacote. Mas o membro z não é visualizado; na verdade, ele nem existe para class Her. As variáveis locais não recebem nenhum modificador de acesso além de FINAL. Isso acontece porque se elas são locais apenas naquele método ou bloco onde foram declaradas, então não faz sentido receberem qualquer outro modificador. Um exemplo são as variáveis usadas em uma instrução for. Elas existem enquanto o for retorna true. Depois disso elas são destruídas. Observe o exemplo abaixo, que as classes estão no mesmo pacote e a variável foi “herdada”. package cap1; public class Mem { static int a=10; } package cap1; public class MemTest extends Mem { http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky public static void main(String[] args) { System.out.println(a); }} Pacotes diferentes, e a variável não foi herdada, porque não está com protected. package cap1.Other; public class Vava { static int e=20;//sou apenas deste pacote. } package cap1.inter; import cap1.Other.Vava; public class Vv extends Vava{ public static void main(String[] args) { System.out.println(e); }} O código acima compila? Recomendamos escrever a resposta em um papel e depois implementare ver o resultado. Analise a situação a seguir: package cap1; public class Defau { static int x = 10; } http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky /*minha class é public disponivel para todos, porém o membro so pode ser visto nesse pacote*/ package cap1.Carros; import cap1.Defau; public class Fau extends Defau{ public static void main(String[] args) { System.out.println(x); } } Exception in thread "main" java.lang.Error: Unresolved compilation problem: The field Defaut.x is not visible A class é importada porque ela é public, porém não é possível acessar o membro de um pacote diferente, somente onde ele foi declarado e por isso que o código não compila. As variáveis locais não podem ter modificadores de acesso. package cap1; public class VarLoca { public static void main(String[] args) { private int x=10; public int z=20; http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Aexception+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Aerror+java.sun.com&btnI=I%27m%20Feeling%20Lucky System.out.println(x + z); }} Não compila: as variáveis locais. Pertencem somente àquele escopo aonde foi declarada; então não se pode usar nenhum tipo de modificador de acesso. Variável local final As variáveis locais somente podem receber um modificador, que é final, pois ele não é de acesso, e sim um modificador de classe. package cap1; public class VarComp { public static void main(String[] args) { final int x = 10; System.out.println(x); } } A classe acima compila e imprime o resultado. Por quê? Métodos final O que for declarado como final é uma constante e não pode ter o valor alterado. No caso de métodos, eles não podem ser subscritos em uma subclass. package cap1; class F{ public final void setF(){System.out.println("final");} } public class Fin extends F{ http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky public void setF(){} public static void main(String[] args) { Fin fi = new Fin(); fi.setF(); }} Esse código não compila, pois tentou-se subscrever um método final. Uma variável declarada como final não pode ter o valor alterado. Veja: package cap1; public class TentARg { public void muda(final int num){ num=50; System.out.println(num); } public static void main(String[] args) { new TentARg().muda(22); } } Esse código não compila, pois a variável no argumento do método não pode ser alterada por ter sido declarada com o modificador final. Métodos abstract São métodos que foram declarados, mas que não possuem implementações. Devem ser implementados pela primeira class concreta que extends a class abstract do método Devem existir em uma class abstract São subscritos e não sobrecarregados http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky Uma class abstract pode ter um ou nenhum método abstrato Se a class tiver pelo menos 1 método abstrato, é obrigatório ela ser abstract package cap1; public abstract class Abt { public void noAbt(){} public static void main(String[] args) { }} O código acima compila normalmente. É uma class abstract, porém sem nenhum método, e não há problema nenhum aqui. package cap1; public class Noabt { public abstract void chama(); public static void main(String[] args) { }} Já esse código não compila, pois não pode existir método abstract em uma class concreta. Abstract X Static Método abstratos não podem ser static. Essa é a regra. package cap1; public abstract class StaticAbt { abstract static void setA(); http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky public static void main(String[] args) { } } O código acima não compila. Abstract somente para métodos e class - nada de usá-lo em variáveis. O código abaixo não compila. package cap1; public class Varabt { abstract String s = "camilo"; public static void main(String[] args) { }} Outros modificadores que você precisa saber onde usar, exceto o synchronized, que vamos usar na aula sobre Threads: Métodos synchronized - são usados para sincronização de métodos e bloco de códigos. Métodos nativos - são usados apenas para métodos. Lembrando que se trata de um modificador. Métodos strictfp - forçam os pontos flutuantes no padrão IEEE 754. Esse modificador é usado em classes e em métodos. Construtores e variáveis Construtores http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky Os construtores são sempre chamados quando um objeto é construído. Eles não possuem nenhum tipo de retorno e devem ter o mesmo nome da class. Regras que precisam ser conhecidas: Não podem ser marcados como static, final ou abstract. Podem receber um modificador de acesso como protected. Analisando o código abaixo: class C{ C(String s){} } class D extends C{ public static void main(){} } O código acima não compila, pois o compilador chama super() implicitamente, porém ela não encontra o construtor da super sem argumentos. Mais alguns exemplos: class C{ C(String s){} } class D extends C{ public static void main(){ D(){ super("S"); }}} http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky Não compila, pois o construtor está sendo chamado dentro do método. A classe a seguir compila, já que temos um construtor válido na super classe: class C{ C(String s){} } class D extends C{ D(){ super("S"); } public static void main(){ }} Variáveis Primitivas: são as tradicionais, como int, float, double, etc. Uma vez declarado seu tipo, jamais pode ser modificado. Variáveis de referência: são usadas para se referirem a um objeto e seu tipo nunca pode ser modificado. Lembrando que podem se referir a um objeto que passa no teste É-um. Exemplo: Cachorro extends Animal{} posso referenciar minha variável de referência para Cachorro e para Animal já que cachorro passa no teste É-UM. Class Animal{} Class Cachorro extends Animal{} Animal s = new Cachorro(); // minha variavel de referencia s, É-UM objeto cachorro do tipo Animal. http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky Não se preocupe, se não entendeu o código acima, ainda vamos explicar esse tipo de relacionamento nas próximas aulas. Variáveis de instância: Elas estão dentrode uma class, porém fora de qualquer método e são inicializadas com o valor padrão. Arrays: São nada mais que objetos de um tipo que armazena elementos de um determinado tipo, mas no fundo sempre são objetos. //instancie meu array que vai receber elemento do tipo int int array[] = new int[3]; int []outro;//aqui é declaração e não cria o array propriamente dito. Variáveis transient: a variável é ignorada para serialização do objeto. Transient = = ignore essa variável. Somente aplicadas a variáveis de instância. Variáveis volatile: aplicadas também somente a variáveis de instância. Métodos e variáveis static São usados quando se criam variáveis para serem usadas independentemente de se ter uma instância dessa class. Var-args Permite receber inúmeros valores via parâmetro de um tipo declarado. void x(int...g){} //Posso receber inúmeros parâmetros do tipo int Argumento: é aquilo que é passado explicitamente: void setI(10) Parâmetro: passo o tipo do que pode receber: void setD(int a) Na lista de parâmetros, o var-args deve estar sempre por último. Enum É um tipo especial de class. O que você precisa saber sobre enum: Os membros de uma enum são constantes Pode ser declarado tanto fora quanto dentro da class Não é valido declarar uma enum dentro de um método As enums são static e final Veja algumas implementações com enum: enum Coffe{BIG,HUGE} class Cafe{ public static void main(String args[]){ Coffe c = Coffe.BIG; //a forma de declaracao é crucial System.out.println(c); }} Não existe o new na instanciação da variável enum class EnuClass{ enum Tam{M(10),P(20),G(30); Tam(int a){ tam=a; }//fim do construtor private int tam; public int getTam(){ return tam; } }//fim da class especial do tipo enum public static void main(String args[]){ Tam t = Tam.P; System.out.println(t+" "+t.getTam());//exibe P 20 }} http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky Código enum um pouco mais complexo: import java.util.Scanner; class ModaLoja{ enum idade{INFANTIL(1),ADULTO(2),JOVEM(3); idade(int a){ cod=a; } private int cod; public int getSec(){ return cod; }} public static void main(String args[]){ Scanner dados = new Scanner(System.in); idade id= idade.ADULTO; System.out.println("Escolha a secao 1 - INFANTIL 2 -ADULTO 3 - JOVEM"); int sec = dados.nextInt(); if(sec==id.getSec()){//se for 2 System.out.println("Voce esta na secao de " + idade.ADULTO); }}}/* bem complexo esse, mas bem interessante*/ Algumas questões sobre enum são teóricas e envolvem códigos longos. Então, esteja certo de que consegue entender o código acima. Recomendamos implementar o código acima. Assim, poderá compreender melhor como enum funciona. http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky Acreditamos que esse foi um dos maiores tópicos, pois não poderíamos deixar nada passar, já que "fundamentos Java" é a base para que você possa dominar qualquer outro assunto com fluência. Orientação a Objetos Herança A herança acontece quando usamos a palavra-chave extends ou a implements. Abaixo algumas informações que você precisa saber sobre herança: promove a reutilização de códigos permite o uso de polimorfismo códigos mais claros previne a duplicação do código Por exemplo: em alguns programas, para realizar a modificação em um lugar, seria necessário rastrear os outros pontos para alterar também. Com herança isso é quebrado. Toda subclasse(+ especializada) herda os métodos da superclass. Codificando para aprender: class Game{ public void inicio(){ System.out.println("comecou o jogo"); }} class Mortal extends Game{ public void sub(){ System.out.println("jogo mortal"); }} http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky class GameTest{ public static void main(String args[]){ Mortal jogador = new Mortal(); jogador.inicio(); jogador.sub(); }} São impressos os dois métodos, porém o ponto-chave aqui é que a subclasse herdou o método da superclasse implicitamente. Relacionamento É-UM Conceito baseado na herança de classes ou na implementação de interfaces. Exemplo: carro É UM veículo (carro é um tipo de veículo). Ferrari É UM carro (Ferrari é um tipo de carro). No conceito de herança, sempre vamos usar o relacionamento É-UM. Na sintaxe que vimos anteriormente, vimos que a class Mortal É-UM jogo da class mãe Game. class Fami{ public void setF(){System.out.println("Minha familia ");} public static void main (String adas[]){ Tio t = new Tio(); t.setF(); }} class Sob extends Fami{} class Tio extends Sob{/*ele herda tb os métodos da super da super*/} Exceções: Private: pertence à classe. Final: quer dizer que não pode ser subcrito, porém é herdado. http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky Static: não são herdados,porém estão visíveis para subclass. Polimorfismo – “muitas formas” É quando uma mesma mensagem é enviada para um ou vários objetos, porém os resultados são diferentes. Sabemos que todos os animais correm, porém cada um de uma maneira diferente. Essa é uma forma de fazer uma analogia e tornar a compreensão do conceito mais fácil. Polimorfismo X Interface Interface – não faz parte da hierarquia de classe, ou seja, uma class não pode extends a uma interface, mas pode implementá-la. Polimorfismo - faz parte da hierarquia de classe. Uma classe pode herdar atributos da classe mãe e pode implementar os métodos (marcados como abstract). class Fabrica { public void setF() { System.out.println("Fabrica"); } public static void setFa(){ System.out.println("fabrica static"); } } class Pc extends Fabrica { public static void setFa() { System.out.println("fabrica static sub"); http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky } public static void main(String args[]){ Fabrica f = new Pc(); f.setFa(); } } Observe que métodos static não são herdados. Métodos subscritos Motivo: definir um comportamento específico para determinado tipo de subclasse. Os métodos abstratos são os mesmos métodos subscritos, porém nunca sobrecarregados. Só é possível referenciar a objetos do tipo que a super classe conheça. Exemplo: class Animal{ public void eat(){ System.out.println("class generic"); } } public class Cavalo extends Animal{ public void eat(){System.out.println("raça mangalarga"); } http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky } class AnimalTest{ public static void main(String args[]){ Animal a = new Animal(); Animal b = new Cavalo(); a.eat();//class generic b.eat();//raça mangalarga } } O código acima imprime os dois métodos, porém, primeiro, ele imprime um que é do tipo animal, que é um objeto da classe animal. O segundo é do tipo animal, porém é um objeto da classe Cavalo. O segundo método é executado, e estamos dizendo também que a class Cavalo É- UM Animal, ou seja, ela recebe todas as características da classe Animal. No código abaixo, temos um trecho que foi comentado. Caso esse comentário fosse removido teríamos problemas na compilação, pois foi definido um método do tipo Animal, sendo que a class não possui esse método. Veja: public class Animal { public void printYour(){ System.out.println("chamei a super class"); }} class Horse extends Animal{ public void printYour(){ super.printYour();// chama a superclass } http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky public void buck(){} } public class TestAnimal { public static void main(String args[]){ Animal a = new Animal(); Animal b = new Horse();//referencia animal, mais é um objeto horse Animal c = new Horse(); a.eat();//chamo o método da classe referente b.eat(); //dar erro porque a class animal não tem o método buck e sim a class horse. //c é um objeto horse mais não referente a classe animal. //c.buck(); // esse método não temos no tipo da class animal } } Recomendamos analisar com atenção esse código. http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky Regras que você precisa saber: O novo método (nível de acesso) pode ser alterado desde que seja menos restritivo do que substituto Não é possível trocar um public para umprotected, porém o inverso é permitido (protected public) O tipo de retorno dever ser o mesmo; A lista de argumentos deve ser igual à do método subscrito, senão gera uma sobrecarga Métodos estáticos não podem ser subscritos, mas são redefinidos em tempo de execução. Chamando de método da superclasse. Super() é uma referência à superclasse; O método subscrito pode ou não lançar uma exceção menos restrita que a da superclasse. O código a seguir não compila o método subcrito, ele está lançando uma nova Exceção mais abragente. Implicitamente, o método da super lança uma exceção não verificada - RuntimeException class DuvS{ public static void main(String args[]){ aviao b = new boing(); b.gol(); }} //super class aviao{ void gol(){ System.out.println("gol");} } http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky //subclass class boing extends aviao{ void gol() throws Exception{} } Não se preocupe, se você não sabe nada sobre exceções. Explicarei mais na frente. Para static isso também é válido, veja: o código abaixo também não compila. class DuvS{ public static void main(String args[]){ aviao b = new boing(); b.gol(); }} class aviao{ static void gol(){ System.out.println("gol");} } class boing extends aviao{ static void gol() throws Exception{} } Sobrecarga e conversão Métodos sobrecarregados http://www.google.com/search?hl=en&q=allinurl%3Aexception+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Aexception+java.sun.com&btnI=I%27m%20Feeling%20Lucky Possibilitam usar o nome de um método em uma classe várias vezes, porém com argumentos diferentes. Exemplo: posso ter dois arquivos com mesmo nome, porém de tipos diferentes em formato. (.doc, .txt, .pdf). Os métodos sobrecarregados podem: alterar o tipo de retorno alterar o modificador de acesso (private, protected) ser sobrecarregado na mesma classe ou subclasse O tipo a que o objeto é referenciado determina qual método será sobrecarregado. Animal cavalo = new horse(); // objeto horse, mas uma referencia a class animal. O subscrito é o tipo de objeto que chama o método subscrito. class TV{ public void setMs(TV t){System.out.println("TV");} } class Us extends TV{ //realizando sobrecarga public void setMs(Us u) {System.out.println("usuario tv sobrecarregado");} } class LojaTv{ public static void main(String args[]){ TV t = new TV(); t.setMs(t); http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky TV t1 = new Us(); t1.setMs(t1); //ele chama TV //na sobrecarga o que vale é o tipo e não objeto criado do //tipo Us }} Para chamar a versão sobrecarregada, é preciso criar uma variável de referência do tipo Us. Outro exemplo que pode confundir: class Teclado{ public void cor(){System.out.println("preto - teclado");} public void cor(String a){System.out.println("teclado " + a);} public static void main(String args[]){ Teclado t = new Teclado(); t.cor(); Teclado c = new Mouse(); c.cor(); //apesar de ter ocorrido uma sobrecarga ele chama o do //objeto ja que o método sobrecarregado foi ?subscrito? na //super class Teclado cc = new Mouse(); cc.cor("Verde"); }} http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky class Mouse extends Teclado{ public void cor(){System.out.println("Azul - mouse");} public void cor(String a){System.out.println("mouse "+ a);} } Entendendo o código acima: - ele herda tudo da superclass - método cor sobrecarregado na superclass - método cor subcrito na subclass Mais um código para análise: package cap1; public class Shop { public void setInfo(){System.out.println("Secao de infomatica");} public void setInfo(String secao){System.out.println("Secao " +secao);} public static void main(String[] args) { Shop s = new Shop(); s.setInfo(); s.setInfo("Eletronicos"); Shop sp = new CliInfo(); sp.setInfo("Roupa"); }} class CliInfo extends Shop{ public void setInfo(){System.out.println("cliente esta subscrito");} public void setInfo(String s){System.out.println("novo met " + s);} http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Luckyhttp://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky } Observe que alterei o nome da variável do objeto e não houve problema. Isso é válido, mas não podemos alterar o tipo, senão é uma sobrecarga. Conversão de variáveis de referência A melhor forma para explicar esse assunto é através de códigos e de blocos de comentários em cada um. Então, espere encontrar o uso de conversão de variáveis de referência dentro de códigos Java. O conceito básico aqui é o relacionamento É-UM. Usamos a conversão quando queremos fazer um cast para ter acesso mais específico à classe. class Faunabr{} class Gira extends Faunabr{} class FaunaTest{ public static void main(String args[]){ Faunabr fb = new Faunabr(); Faunabr f = (Gira)fb; }} Esse código compila, mas lança uma exceção. Compila, porque temos classes na mesma árvore de herança (relacionamento É-UM). Mas não posso dizer que uma fauna é um Gira (podemos chamar de girafa). Mais um exemplo para esclarecer: class Pais{} class Brasil extends Pais{} class PaisT{ public static void main(String args[]){ http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky Pais pb = new Brasil(); Pais p = (Brasil)pb; //isso compila ja que pb é um objeto Brasil }} Lembre-se de que o que pode ser alterado é o objeto, e não o tipo dele. Já que pb é o tipo País e referencia a um objeto Brasil. Posso converter explicitamente pb para Brasil. Não compila se o tipo não fizer parte da árvore de herança. E lança uma exceção quando tento converter algo impossível. Ex: País em Brasil. Pais pb = new Pais(); Pais p = (Brasil)pb; Compila porque os tipos na árvore de herança, mas na hora da conversão, a JVM não consegue converter os tipos e lança uma exceção ClassCastException. Exemplos Código que não compila e lança exceções: public class Cidade { public void setName(){System.out.println("Cidade ");} public static void main(String[] args) { Cidade cd = new Cidade(); cd.setName(); //isso compila normal Cidade cd1 = (Valenca)cd; //compila porém é lançada uma exceção /*uma cidade não pode ser Valenca,lembrar que não posso alterar o tipo de referencia*/ http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky cd1.setName(); } //o fato de compilar é que faz parte da mesma arvore de herança } class Valenca extends Cidade{ public void setIdade(){ System.out.println("Mais de 450 anos");} public void setName(){System.out.println("Cidade Valenca");}} public class Cidade2 { public void setName(){System.out.println("Cidade ");} public static void main(String[] args) { Cidade2 cd = new Cidade2(); Cidade2 cd2 = (Feira)cd; /*compilar vai... ja que Feira, e Cidade2 estão na mesma arvore de herança porém uma exceção é lançada em tempo de execucao não posso converter uma Cidade em Feira*/ }} class Feira extends Cidade2{ public void setIdade(){ System.out.println("Mais de 450 anos");} public void setName(){System.out.println("Cidade Feira");}} Esse código lança Exception in thread "main" java.lang.ClassCastException http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky Interface e tipos de retorno Interface Fazemos um contrato com a JVM para que todos os métodos válidos definidos na interface devam ser implementados Fornecer implementação concreta para todos métodos da interface marcados como abstract Seguir as regras de sobrecarga Manter assinatura e o mesmo tipo de retorno (regra de subscrito) Se a classe que implementa for abstrata, ela não tem obrigação de implementar todos os métodos da interface. Exemplo: leve em conta que após implements sejam interfaces. class venda implements Loja, comissão{} Lembre-se sempre disso: Uma interface jamais vai implementar outra Uma interface jamais vai implementar uma class Interface não extends a class Exemplo prático de uso: interface empregado{ public void setNome(); public String getNome(); } abstract class Venda implements empregado{ string nome; public void setNome(){ http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky nome = "camilo";}} interface coca{ void setN(); } interface fanta{ void setN(); } class Clic implements coca,fanta{ public void setN(){System.out.println("Fanta");} public void setN(){System.out.println("Conta");} public static void main(String args[]){ }} Isso não compila, devido ao fato de as duas interfaces terem métodos iguais, e quando a class Clic herda apenas uma, já não podemos ter dois métodos iguais na mesma class. As interfaces não possuem construtores por não fazerem parte das árvores de herança de classes. Tipos de retorno Quando alteramos uma lista de argumentos de um método estamos sobrecarregando, portanto o tipo de retorno é valido, mas não com a super classe. Array é um tipo valido de retorno, veja: public String []go(){ return new String[]{?Camilo?,?lu?}; } http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky void: não pode retornar nenhum tipo de retorno Retorno a objetos: em um método que tenha um tipo de retorno, a referência a um objeto pode retornar qualquer tipo de objeto public Animal getAnimal(){ return new horse(); // desde que horse extends a Animal. Perceba a diferença nos próximos códigos abaixo: O primeiro não compila, porque não posso dizer que short É-UM int, ele pode ser convertido implicitamente para um int. Agora nós podemos dizer que uma subclass É-UM subtipo da superclass. A sacada no tipo de retorno funciona para objetos do método, porém, para primitivos, apenas no return. class VarRetur{ int inte(){ return (short)127; }} class vvv extends VarRetur{ short inte(){ return 7; }} /* não compila isso short não É-UM int, é apenas convertido*/ //aqui compila tranqüilo... class VarRetur{ VarRetur inte(){ return newVarRetur(); }} class vvv extends VarRetur{ vvv inte(){ return new vvv();}} Construtores Servem para inicializar o estado das variáveis de instância. Toda class possui um construtor. Os construtores podem usar qualquer modificador de acesso, até o private . Nos construtores privados (private), somente os códigos dessa class podem utilizá-lo. class PrivateConst{ private PrivateConst(){ } } class PvtC extends PrivateConst{ PvtC(){} } Não compila, pois a subclasse está chamando implicitamente(super()) um construtor que ela não deveria nem conhecer, por ser private. Construtores sobrecarregados Construtores são chamados apenas por outros construtores, jamais por um método. Lembre-se: eles não são herdados por uma subclasse. Servem para fornecer alternativas do estado inicial e uma variável de instância. Por exemplo: o cliente pode fornecer o nome do cachorro ou o programa pode sugerir um. Isso acontece muito quando vamos criar um e-mail e no ato do cadastro, o sistema oferece uma sugestão para e-mail. Alguns códigos: class Cotr{ Cotr(){ } } class Cot extends Cotr{ Cot(int z){} } /*implicitamente super() - código compila normalmente*/ Já o código abaixo não está tão feliz... class Cotr{ Cotr(int z){ } } class Cot extends Cotr{ Cot(int z){} } Há uma chamada implícita super(), mas a superclass não tem nenhum construtor sem argumento. Esse código não compila. Estáticos - static Já falamos sobre static no início do curso, mas apenas superficialmente, como um comentário. Agora, entraremos nos detalhes. Garante que somente haverá uma referência a determinada variável na memória. Static não quer dizer que a variável, ou o método, não pode ter seu valor alterado (no caso como final). O static permite acessar algo diretamente, sem a necessidade de instanciar um objeto. Quando os métodos ou variáveis não são static, é necessário criar objetos da classe, ou seja, instanciar (usar o new). Exemplo: criando uma instância. Empresa funcionário = new Empresa(); // criei um objeto funcionário da classe empresa. Exemplo 2: class Hip{ static void doSt(){System.out.println("a");}} class Jaca extends Hip{ static void doSt(){System.out.println("b");} public static void main(String arg[]){ Jaca.doSt(); Hip j = new Jaca(); //é chamado da superclass j.doSt();}} Os métodos static não são subscritos, eles são redefinidos. Coesão e Acomplamento A coesão acontece quando temos uma classe bem definida e focada. Ou seja, quando uma classe tem um único objetivo e uma única função, e não uma multitarefa. Desejável: alta coesão. public class RelatorioEstoque { public void dataEntrada(){} public void DtSaida(){} /* aqui temos a alta coesao * onde a class é bem focada * em seu objetivo de relatorio de * estoque */} http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky Indesejável: baixa coesão – quando a class é multitarefa. public class CadCliente { public void cadCliente(){} public void relatorioCliente(){} public void vendasClente(){} /* aqui temos a baixa coesao, observe que * a class faz varias tarefas onde quebra * a ideia de reutilização e flexibilidade */} Acomplamento: é a relação entre as APIs das classes. Desejável: baixo acomplamento – quando a alteração em uma API não afeta erros em outra API. public class BaixoAc { private static Acp ac; public static void main(String args[]){ ac.met(); }} /* observe que aqui eu acesso * um método de uma class realizo alteracao * porém nada sei sobre api da class ap * so conheço os métodos disponiveis */ class Acp{ http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky public void met(){}} Indesejável: alto acoplamento – quando uma classe conhece demais sobre a API da outra classe. public class AltoAcom { atcom at; public void met(){ at.a=8;} } /* observe que minha class AltoAcom sabe demais sobre minha class atcom */ class atcom{ int a=10; public void ss(){} } Eu desejo a alta coesão e o baixo acomplamento. Não se esqueça de que Orientação à Objetos estará em mais que 50% das questões do exame real. Exercício 1 Neste tópico, você vai encontrar alguns exercícios para poder exercitar seu conhecimento. Para dificultar um pouco, as questões não serão de múltipla escolha como no exame. Você deve ser capaz de olhar o código e saber a resposta. Não queira passar por cima dos exercícios, tentado responder qualquer coisa. Analise com cuidado, veja os detalhes e anote a resposta. Antes de ver a resposta, revise todas as questões e esteja certo da sua resposta anterior. É válido, neste exercício, fazer uma revisão nos assuntos já vistos, porém tente não ver a resposta logo após a primeira tentativa. Não se preocupe, se neste momento, demorar muito para responder. Agora é o momento de aprender e saber o porque das coisas. Guarde as energias de cronometrar o tempo de resposta para cada questão, nos simulados. Qual o resultado de cada questão abaixo? Questão 1 package p; class Ave{} package A; import p.Ave; class Galo extends Ave{} Questão 2 package cap1.Fornecedor; class Dept {} package cap1.Produto; import cap1.Fornecedor.Dept; public class Prod { public static void main(String[] args) { System.out.println("Produto fornecedor"); }} Questão 3 package cap1.y; http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky private class Priv { public static void main(String[] args) { }} Questão 4 package cap1.x; public final class Pai { } class filho extends Pai{} Questão 5 package cap1.x; public abstract class Notcomp { void setName(); public static void main(String[] args) { System.out.println("zomm"); }} Questão 6 package cap1.x; public abstract class Problem { private abstract void setNN(); http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky Questão 7 package cap1.x; abstract class ProFin { final abstract void setnn(); public static void main(String[] args) { }} Questão 8 package cap1.y; public interface Dados { int z =10; void num(); } package cap1.y; class joga implements Dados { public void num() { } public static void main(String[] args) { System.out.println(z); http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky }} Questão 9 interface Corp { void seta(){} Respostas do Exercício 1 Aqui você encontrará as respostas do exercício anterior. Algumas respostas estarão dentro dos comentários. Questão 1 package p; class Ave{} package A; import p.Ave; class Galo extends Ave{} Esse código não compila devido ao fato de a class Ave ser padrão daquele pacote. Questão 2 package cap1.Fornecedor; class Dept {} package cap1.Produto; import cap1.Fornecedor.Dept; publicclass Prod { public static void main(String[] args) { System.out.println("Produto fornecedor"); http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky }} Esse código não compila pois a Class Dept é default, portanto não pode ser importada para outro package, a não ser para aquele onde foi declarada. Os simulados estão cheios de "pegadinhas" desse tipo. Questão 3 package cap1.y; private class Priv { public static void main(String[] args) { }} Exception in thread "main" java.lang.Error: Unresolved compilation problem: at cap1.y.Priv.main(Priv.java:3) É valido usar private para classes. Por isso não compila. Questão 4 package cap1.x; public final class Pai { } class filho extends Pai{} /* isso não compila a class Pai não pode ter filho questão de genetica http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Aexception+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Aerror+java.sun.com&btnI=I%27m%20Feeling%20Lucky */ Questão 5 package cap1.x; public abstract class Notcomp { void setName(); // não compila o modificador abstract não tem public static void main(String[] args) { /* não posso ter instancia de classes abstract */ Notcomp nt = new Notcomp(); System.out.println("zomm"); }} Questão 6 package cap1.x; public abstract class Problem { private abstract void setNN(); /* código não compila abstract and private jamais abstract e final também não */ } Questão 7 package cap1.x; abstract class ProFin { /* também não compila * http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky */ final abstract void setnn(); public static void main(String[] args) { }} Questão 8 package cap1.y; public interface Dados { int z =10; void num(); } package cap1.y; class joga implements Dados { /* código compila normal implementei meu método * e imprimir o valor da interface */ public void num() { } //método implementado public static void main(String[] args) { System.out.println(z); }} http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky Questão 9 interface Corp { void seta(){} /* não posso ter métodos com chaves em uma interface * pois os métodos sao implicitamente abstract aqui */} Atributos Conversão de tipos primitivos A conversão permite a transformação de valores primitivos de um tipo para outro, de modo explícito ou implícito. Explicito: é necessário que o programador informe ao compilador Implícito: você não precisa informar nada ao compilador Ex.: posso converter um int em long pois potencialmente long aceita um int, mas o inverso deve ser feito de forma explícita (cast). Você pode colocar na caixa de uma TV de 20’’, uma de 20’’ ou uma menor, mas jamais uma acima de 20’’ (29’’, 32’’ etc). Uso das variáveis Em Java, temos a opção de inicializar uma variável local ou deixá-la sem inicializar, porém depende do tipo dessa variável. Variáveis locais: antes de serem utilizadas, devem possuir um valor de acordo com o seu tipo. Variáveis de instância: elas pertencem a toda classe e podem ser utilizadas com o valor padrão adquirido pelo tipo da mesma. As variáveis de instância referem-se a um objeto que recebe um valor padrão do tipo da variável. NULL= significa que a variável de referência não foi atribuída a nenhum objeto na pilha. Podemos criar variáveis locais e não inicializar, e o programa não emitirá nenhum erro na compilação, desde que a variável local não seja utilizada no escopo da declaração. Referências de objetos locais Quando duas variáveis referem-se ao mesmo objeto, a alteração em um dos dois vai refletir na outra variável. class ReferObjt{ public static void main(String args[]){ Integer i = new Integer(10); Integer j=i; System.out.println(i); System.out.println(j); i+=20; //sera que j ta referenciado ao novo valor de i? System.out.println(i);//imprime 30 System.out.println(j);//imprime o valor 10 }} O fato aqui é que wrapper(Integer, Short etc.) éfinal . Apenas usamos o recurso de autoboxing, que na linha i+=20 cria outro objeto wrapper, para referenciar a esse novo valor. Não se preocupe, mais na frente iremos conhecer como Wrapper trabalha. Objetos string Os objetos String são inalteráveis. Com strings, quando se tem duas variáveis apontando para o mesmo objeto, a JVM atualizará apenas a variável de referência. http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Ainteger+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Ainteger+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Ainteger+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky String a = "Camilo"; String d=a; Se uma alteração ocorrer, apenas a vai sofrer alteração, e d, não. Uma variável de referência significa que está se passando uma cópia dos bits. Passar por valor significa passar uma cópia da variável. O método chamado NÃO pode alterar a variável que a chamou. Variáveis de referência de objetos: o método chamado pode alterar o objeto da variável de referência. class DuvObjtRe{ int array[] = new int[2]; static void go(int [] a){ a[1]=5;} public static void main(String ar[]){ go(new DuvObjtRe().array); for(int z:new DuvObjtRe().array) System.out.println(z); }} O código acima Imprime 0,0 devido ao fato de ser acessado por uma NEW(nova) instância da class e não por uma instância que foi passada para método. class DuvObjtRe{ int array[] = new int[2]; static void go(int [] a){ a[1]=5;} public static void main(String ar[]){ DuvObjtRe b =new DuvObjtRe(); go(b.array); http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky for(int z:b.array) System.out.println(z); }} Agora imprime, devido à alteração no objeto original. Atenção neste ponto para não errar, pois esses detalhes são facilmente esquecidos. Array São objetos que armazenam diversas variáveis do mesmo tipo. Podem ser primitivos ou de objeto. Mas um array sempre será um objeto na PILHA. Podem ser criados: int[] array; int array[]; Para definir o tamanho do array, o objeto deve ser instanciado (criado - new) na pilha. Inválido: int[5] array ; Válido: int[] array = new
Compartilhar