Академический Документы
Профессиональный Документы
Культура Документы
Básicas
Vamos ser obrigados em alguns momentos colocar métodos e classes antes mesmo
de explicar o que significam. Por isto, se vocês não sabem o que significa uma classe ou um
método e nem sabe para que servem, ignore-os durante os capitulo I e II. É suficiente saber
apenas que os programas são executados nestas estruturas. A classe serve para guardar
dados e métodos e métodos operam sobre estes dados. A classe está sempre identificada
pelo comando "class" e método terá ao lado "()". O importante, por enquanto, é saber o
que acontece dentro das chaves "{}" de um método.
Tabela 1
Observação 1:
Se você tem a opção de usar o tipo "long" porque você vai usar o tipo "byte"? A razão é
simples, o tipo byte economiza memória e tempo de processamento. Pode ser muito útil em
operações binárias em simulações que tomam muito tempo processamento como no caso
de algoritmos genéticos. Cada tipo seja "byte", "short", "int" ou "long" lhe darão a opção
entre consumir mais memória e a extensão dos números.
Observação 2:
Na prática, o Java, hoje em dia, não é muito usado para resolver modelos computacionais,
científicos e matemáticos que exigem alto grau de desempenho e otimização (como a
linguagem C). O uso mais difundido do Java é para resolver problemas relacionados a
Web, por isto, geralmente se usa mais a primitiva "int" que engloba uma boa extensão de
números, sem ser excessivamente extenso como "long".
float x= 3.45F;
double y= 6.45D;
Observação 1:
Os Números Reais são considerados tipos maiores que os tipos de Números Inteiros.
Observação 2:
Na prática, o tipo "double" é mais usado do que o tipo "float", porque o primeiro (double)
tem um grau de precisão maior e isto faz a diferença em calculos matemáticos que envolva
números fracinados.
Observação 3:
O nome "double" (dobro) vem do fato de que este tipo usa duas vezes mais memória que o
tipo "float".
Observação:
Na prática o tipo "char" é pouco usado, sendo mais usado o tipo String, apesar de este
último não ser um tipo primitivo.
1.1.5 - String
"String", diferentemente dos tipos primitivos, é uma classe por isto começa com letra
maúscula. Todavia, ela para um programador, que a veja de maneira superficial, se semelha
a primitiva, dá um tipo de uma variável. "String" dá o tipo de uma variável que armazena
um conjuto de caracteres, é como se fosse um agrupamento de "char" :
float d=7.8f;
short c=13;
long a=5L;
int r=10;
r=(int)a;
System.out.println(r); // Resultado é 5
r=(int)c;
System.out.println(r); // Resultado é 13
r=(int)d;
System.out.println(r); // Resultado é 7
Repare que diferentes tipos foram convertidos para ser adequado a variável "r" do tipo
"int". Repare também que no último resultado foi simplesmente desprezado as casais
decimais de 7.8f, pois "long" é um tipo inteiro que não aceita "." , entretanto não é preciso
fazer esta conversão explicitamente quando se faz de uma variável de um tipo menor para
um tipo maior.
1.2 - Operadores
Tabela 2
Estes operadores são muito usados em controle de fluxo e laços ("while", "for", "do while",
"if"), exemplo:
if (x<=4) {
System.out.println("entrou no if");
}
while(x<10){
System.out.println(entrou no while);
x++;
}
}
Observação muito Importante:
Um cuidado importante, não confundir "==" com "=".
"==" dá como resultado: "true" ou "false",
"=" faz atribuição é correspondente ao operador matemático "←" não existente no
Java. Portanto, x==4 é diferente de x=4.
Exemplo:
&& - AND (também conhecido como "E"), equivalente a Intercessão. Terá que ter todos
os valores verdadeiros ("true") para expressão ser verdadeira, caso contrário a expressão
será falsa. Ou seja, basta somente um valor ser falso, para a expressão inteira ser falsa
também.
|| - OR (também conhecido como "OU"), equivale a União. Terá que ter todos os valores
falsos ("false") para expressão ser falsa, caso contrário a expressão será verdadeira. Ou seja,
basta somente um valor ser verdadeira, para a expressão inteira ser verdadeira também.
! - NOT, equivale a Negação. Todo valor ou expressão que for false ("false") vira
verdadeira ("true") e vice-versa. Ou seja, todo valor ou expressão que for "true" vira
"false".
^ - XOR, equivale ao OR exclusivo ou OU exclusivo. A expressão será verdadeira se dois
valores lógicos forem diferentes: falso ("false") e outro verdadeiro("true"). Caso contrário,
será falso. Ou seja, se ambos os valores ou expressões forem falsas o resultado será falso,
se ambos os valores forem verdadeiras o resultado será falso.
Exemplo:
Observação 1:
O operador de "xor" dado por " ^ " é válido tanto para expressões envolvendo "true" e
"false", como para operações binárias, envolvendo "0" e "1".
Observação 2:
Na prática, o operador " ^ " é pouco usado com variáveis "true" ou "false", sendo mais
usado para operações binárias.
Observação 3:
O uso da palavra "expressão" não é a mais adequada em termos de lógica, o certo seria
proposição ou sentença. Todavia, achamos melhor usar o termo "expressão" por ser mais
familiar ao leitor e facilitar o entendimento.
Atribuir é mesmo que dar novo valor a variável. O operador de atribuição tanto no Java
quanto C e C++ pode ser abreviado: em vez de escrever: "i=i+1", escreve-se: "i++".
int x=1;
int y=1;
System.out.println("x++ é " + (x++));
System.out.println("++y é " + (++y));
}
Resultado:
x++ é 1
++y é 2
Outras atribuições
Introdução à
Linguagem Java
por Christian Cleber Masdeval Braz
pag. 13 / 52_Java
1.3.1 - Saída
A forma mais usada para saída de dados no Java Local é "System.out.println (expressão);".
Quando se deseja escrever algum texto basta colocá-lo entre aspas: " ". As expressões são
separadas por '+'.
Exemplo 1:
Resultado:
a+b=7
O operador ' + ' é usado tanto para juntar expressões como para realizar somas. No
exemplo 1 Se não fosse colocados os parênteses, o compilador iria imprimir invidualmente
os valores de "a" e "b"
Resultado:
a + b = 34 // não é o que realmente queríamos!
O compilador entendeu que o programador queria que os valores fossem exibidos literal e
individualmente.
Se todavia, forem tirados "a+b", o compilador entenderá que é uma soma:
Resultado:
7
-------------------------
Exemplo 1:
System.out.print(a);
System.out.print(b);
System.out.print(c);
System.out.print(d);
System.out.print(e);
Nele, percebemos que as palavras todas foram colocadas na mesma linha como se é
esperado para "System.out.print()".
Exemplo 2:
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
A única coisa
que eu sei
é que nada sei.
Frase de Sócrates,
filósofo grego.
Observação:
Ignore o que significa "public void mostra1()" e "public void mostra2()" por enquanto. É
suficiente apenas dizer que são métodos e que todas aperações acontecem dentro dele.
Concentre-se na execução do fragmento de código entre chaves.
1.3.2 - Entrada
A forma de entrada mais comum no Java Local usa a classe "Scanner" é dada pela
expressão:
"Scanner input = new Scanner(System.in); " seguida vem uma atribuição a uma variável
advinda de um método:
Mas antes de fazer isto tudo deve-se colocar: import java.util.Scanner; que possibilitará o
uso da classe Scanner.
Exemplo:
int numero_inteiro;
double numero_real;
String nome;
Scanner input = new Scanner(System.in);
Professor David
Coloque o número inteiro:
7
Coloque o número real (tipo double):
8,3
Você digitou respectivamente: Professor David 7 8.3
Observação:
Repare que foi digitado 8,3 e saída foi de 8.3 . A razão desta diferença é que a entrada de
dados (representada pela classe Scanner) deve usar o padrão brasileiro que usa " , "
vírgula para separar casas decimais, enquanto a de saída usa normas americanas que usa
"." .
São estruturas que impõem condições para executar instruções. As condições são
avaliadas apenas uma vez e a estrutura não retorna para início da estrutura para ser repetida
como nos laços ou nos loops.
2.1.1 - if ----else
"if" (significa "se" em inglês) é estrutura básica de decisão. Executa os comandos caso a
expressão que estiver em parêntese for "verdadeiro". Caso contrário, executa o "else".
if( verdadeiro){
executa estes comandos;
}else{
não executa estes comandos;
}
------------
if( falso){
não executa estes comandos;
}else{
executa estes comandos;
}
------------------------------------------------------------------------
public void comparacao() {
if (n1>n2)
System.out.println (n1 + " é maior que " + n2); // Se houver apenas um comando, não
precisa de colocar chaves "{}"
else if (n2>n1)
System.out.println (n2 + " é maior que " + n1);
else
System.out.println (n1 + " é igual a " + n2);
}
Resultado:
Coloque o valor de n1:
10
Coloque o valor de n2:
8
10 é maior que 8
2.1.2 - switch
É usado para avaliar uma expressão com vários resultados possíveis. Só aceita variáveis de
tipo "char", "byte", "short" ou "int". O valor é procurado nas declarações "case" que vem
declarado no switch e dento dos "cases" os comandos são executados.
switch ( expressão ) {
case valor1:
executa comandos1; // se a "expressão"=="valor1";
break;
case valor2 :
executa comandos2; // se a "expressão"=="valor2";
break;
...
Exemplo:
switch (numero){
case 0: System.out.println(“Comando 0”);
break;
case 1: System.out.println(“Comando 1”);
break;
case 2: System.out.println(“Comando 2”);
break;
default: System.out.println(“Comando 3”);
}
}
Um resultado possível:
Um resultado possível:
2.2.1 - while
"while(expressão)" executa os comandos enquanto a expressão dentro do parêntese for
verdadeira.
O laço não necessariamente é executado. Isto acontece se a expressão entre parênteses for
falsa.
while ( i <5 ){ // as instruções abaixo são executadas até o valor de "i" ser igual a 5.
x = x * 2;
System.out.println("O valor de i é " + i );
System.out.println("O valor de x é " + x );
i++;
}
while(i<5){ // nenhuma instrução será executada, pois "i" já é 5 e "5<5" é falso portanto
não entra sequer no loop.
y = y* 2;
System.out.println("O valor de i é " + i );
System.out.println("O valor de y é " + y );
i++;
}
}
Resultado:
O valor de i é 1
O valor de x é 2
O valor de i é 2
O valor de x é 4
O valor de i é 3
O valor de x é 8
O valor de i é 4
O valor de x é 16
Repare que sequer o segundo "while" é executado, porque "i" é igual a 5 e "5<5" é falso.
2.2.2 - do - while
O laço é executado pelo menos uma vez. O loop é executado enquanto a expressão dentro
do "while(expressão)" seja verdadeira.
int x=1;
int i=0;
do {
// se "i" for maior que 10, este laço vai ser executado somente uma vez.
x = x * 2;
i++;
}while ( i < 10 );
2.2.3 - for
O "for" tradicional do Java (pois há um outro nas versões mais novas do Java) tem as
condições definidas para seu funcionamento dentro dos parênteses em ordem ternária, ou
melhor, são colocados três tipos de expressões dentro do parentese em ordem, primeiro são
inciadas as variáveis, segundo são colocadas as condições "booleanas" ou lógicas e terceiro
são colocados os incrementos ou decrementos.
int x=1;
int y=1;
for (int i = 0; i < 3; i++){
x=x*2;
System.out.println("O valor de i é " + i );
System.out.println("O valor de x é " + x );
}
for (int i = 3; i > 0; i--){
y=y*2;
System.out.println("O valor de i é " + i );
System.out.println("O valor de y é " + y );
}
}
Resultado:
O valor de i é 0
O valor de x é 2
O valor de i é 1
O valor de x é 4
O valor de i é 2
O valor de x é 8
O valor de i é 3
O valor de y é 2
O valor de i é 2
O valor de y é 4
O valor de i é 1
O valor de y é 8
Observação: Nos casos do "for", "while" e do "do-while", o termo usado expressão não é
o termo mais correto em termos de lógica, o certo seria "sentenção lógica" ou
"proposição". Todavia, usou-se aqui como "expressão", pois é um termo mais familiar ao
aluno e de mais fácil entendimento.
74_java
Definições
public class A {
Esta classe acima é uma classe que não faz nada, mas ainda assim uma classe. Podemos ter
classes mais complexa como está aqui abaixo:
----------------------------------------------------------------------------
A classe pode ser mais complexa como esta:
}
out.print("<br><a href=index.jsp>Voltar</a>");
out.close();
}
---------------------------------------------------------------------------------------------------
Em resumo: atributos fornecem e armazenam os dados e os métodos resolvem
problemas específicos. Todos eles têm objetivos em comum ficam agregados numa
estrutura chamada classe. Geralmente a classe recebe o nome do objetivo ou a categoria de
objetivo a ser alcançada com ela.
Vamos daqui por diante usar um programa de referência para entender os conceitos
relacionados orientação a objeto.
package primeiro;
public class Main { // classe Main que chama as demais classes
public static void main(String[] args) { // método main que chama os demais métodos
Calcula calcula=new Calcula(); // cria um objeto
calcula.calcula_media1(); // chama o método calcula_media1()
System.out.println(calcula.calcula_media2(30, 40)); // chama o método
calcula_media2(double c, double d) e dá o valor do método ao final da operação
}
public Main() {
}
}
--------------------------------------
package primeiro;
public class Calculo {
3.3 - Atributos
Os Atributos são também denominadas de variáveis de instância. São
armazenadores de dados do programa. São variáveis que podem ser utilizadas em qualquer
lugar da classe, ao contrário das variáveis locais que são utilizáveis somente dentro do
corpo (ou melhor, entre as chaves) dos métodos. São exemplo de atributos no programa de
referência acima:
double a=70;
double b=90;
double media;
Repare que não passam de variáveis, mas que são "visíveis", ou melhor, podem ser
manipuladas em toda a classe. Estas variáveis recebem valores iniciais, como nos atributos
"a" e "b" ou ficam apenas declaradas sem receber valores como no atributo "media", mas na
espectativa de receber valor no futuro. Os atributos não necessariamente são double, podem
ter qualquer tipo como, no exemplo, retirado de um fragmento de código do professor
Edson Belém:
// Eis exemplo de atributos acima. O atributo sempre tem um tipo: "byte", "short" , "int"
etc.
// o tipo é: byte, short, int etc. O atributo em si neste caso é "n1", "n2", "idade" etc.
public Tipos() {
}
52_Java
3.3 - Método
Métodos são equivalentes a uma subroutina ou programa em linguagens
estruturadas. No C e C++, são semelhantes a Função, no Pascal ao Procedimento
(Procedure) e Função. Ele é responsável pelas operações dentro da classe. Estas operações
podem ser operações matemática mesmo como "soma", multiplicação" etc. ou podem ser
operações de outro tipo, como as que possibilitam a consulta de um banco de dados ou que
escrevem mensagens ou criam arquivos etc. Método é o responsável por realizar as tarefas,
ou melhor, praticar as ações, ou melhor ainda,"fazer acontecer", pegando os dados que ele
tem (advindos ou não de atributos) para fazer realizar alguma tarefa de desejo do
programador. Mas geralmente são tarefas específicas.
Exemplo:
Desejo calcular área de um triangulo, então criamos um método para isso, você
pode criar o nome de "area_triangulo()" que realiza as tarefas de calculo do triangulo
para o programador. Mas se desejamos calcular área de vários tipos de figuras
geométricas, teremos que criar um método para cada forma geométrica diferente: um para
área da circunferência, outro para área de um quadrilátero, outro para um pentágono e
assim por diante e poderiam ser assim os métodos: "area_circunferencia()",
"area_quadrilatero()", "area_pentagono()". É fácil reconhecer um método, ele sempre vem
acompanhado de parânteses "()", sejam eles estando vazios ou com algo dentro: "(double
x, float y, String z, etc)" .
Busquemos o programa de referência. Precisamos calcular a média de "a" e "b",
o que devemos fazer? Você terá que recorrer ao método, pois você precisa dele para fazer
operações, lembra? e neste caso pode ser "calcula_media1()". Há um método alternativo
semelhante é "calcula_media2(double c, double d)" realizam a mesma tarefa: fazer
média. Uma diferença é que no "calcula_media2(double c, double d)" há uma passagem de
parâmetros, ou seja, são mandados valores as variáveis entre parêntese, "c" recebe algum
valor e "d" recebe algum outro valor. E de onde vem estes valores? Vem de:
"calcula.calcula_media2(30, 40)" da classe Main e método "public static void
main(String[] args)".
Outra diferença de "calcula_media1()" e "calcula_media2(double c, double d)" é
que o primeiro não retorna valor e o segundo retorna. "public void calcula_media1()"
por não retornar nada é que este método recebe o qualificador "void"(significa vazio).
"public void calcula_media1()" é equivalente ao Procedimento no Pascal. Ao contrário
de uma função no pascal, ele não recebe nenhum valor no final da operação (é o que
chamamos de "não retornar valor").
"public void calcula_media2(double c, double d)" é equivalente a Função no
Pascal. Ele retorna valor. Quando falo em retornar valor, estou dizendo que
"calcula_media2(double c, double d)" terá algum valor (podendo ser número ou uma
"string" ou um número "booleano") depois que for feita a obtenção da média: "media =
(c+d)/2;". Voltando ao método:
media = (30+40)/2= 35 , no final, este valor é atribuído a função. Seria como se fosse:
"calcula_media2(double c=30, double d=40) =35"; (Mas não tentem escrever este código
desta maneira, pois ele dará erro no compilador) , tanto isto é verdade que você pode
colocar o método na instrução de saída: "System.out.println(calcula.calcula_media2(30,
40))" o resultado desta operação é: 35. Já se você tentar fazer o mesmo com um método
"void" que não tem retorno, haverá erro:
"System.out.println(calcula.calcula_media1())" // Não Tentem fazer isto, pois dará
erro!
Pelo fato de "calcula_media2(double c, double d)" receber um valor, o método
tem que receber um "tipo", neste caso foi "double": double calcula_media2(double c,
double d) equivale a dizer "calcula_media2(double c, double d)" é um real. Mas em vez
de "double", poderia ser "float", "long", "boolean" ou qualquer outro tipo desde que
seja o tipo válido no Java e esteja condizente com a lógica do que se quer do programa. Os
valores passados por parâmetro(os valores dentro dos parênteses) também tiveram que
receber um tipo, é que em java todo o valor deve receber um tipo. "c" e "d" recebem
valores por isto, devem ter um tipo e neste caso é double.
Observação Importante 1:
Aqui demos exemplo de um método que faz passagem parâmetro e dá retorno e outra do
tipo "void" que não retorna valor e nem faz passagem de parâmetro. Poderia acontecer o
contrário, um método retornar e não passar parâmetro e um método ser do tipo "void"
(sem retorno) e passar parâmetro:
double m=40;
double n=80;
double media;
Observação Importante 2:
Você não precisa criar uma nova variável para calcular a média, simplesmente basta fazer
o cálculo na impressão("System.out.println") ou no retorno "return". O código passaria
a ficar assim:
double m=40;
double n=80;
double media;
package primeiro;
public class Main {
public static void main(String[] args) {
Calcula calcula=new Calcula();
calcula.calcula_media1();
System.out.println(calcula.calcula_media2(30, 40));
}
public Main() {
}
}
Repare que dentro método "main" não é realizado nenhuma operação de cálculo. As
operações de calculo ou de banco de dados etc. podem ser feitas sim na main, mas NÃO
devem, pois quebraria o modelo de orientação a objeto. Por esta diretriz, deve haver um
número pequeno de instruções, se possível estas instruções devem se limitar a chamada de
métodos de outras classes.
Lembrete: Lembre-se que Java é "case sensive", ou seja, o fato de a letra ser
maúscula e minúscula faz diferença. "Main" e "main" são coisas distintas, o primeiro é
classe principal e o segundo método principal.
3.4 - Objeto
Um objeto é como se fosse um clone ou uma cópia da classe (veja Observação 1).
No programa de referência veja as seguintes instruções:"Calcula calcula=new Calcula()".
O "new" (novo, se refere a um novo objeto) faz a chamada do construtor "Calcula()" ao
mesmo tempo em que cria um objeto baseado na classe Calcula. Tudo o que você precisa
entender é que "calcula" como se fosse uma cópia da classe "Calcula" (veja Observação
2) e, portanto, "calcula" tem todos atributos e métodos advindos da classe Calcula. Veja o
fragmento de código advindo do programa referência:
Por que usamos a cópia da classe e não a classe propriamente dita? É porque a
classe é como se fosse um molde que não pode ser mexido:
Vamos supor um livro que tenha espaços em branco para serem preenchidos.
Ninguém vai usar o livro original até porque fazer um livro original dá muito trabalho, por
isto, vai para prensa o molde original para fazer cópias. O livro original escrito
diretamente pelo autor é a classe, a cópia é objeto. Se o livro cópia, como é o caso, tem
espaços em branco para serem preenchidos pelos alunos, cada exemplar poderá assumir
uma forma diferente, pois diferentes alunos preencherão os espaços em branco (como se
cada cópia assumisse um novo estado) e cada aluno fará o que quiser com seu exemplar,
desde que o livro original ofereça este recurso, pode-se ler somente os capitulos que lhe
interessa e fazer os exercícios que estão dispuníveis. Assim também é o objeto, teve uma
forma original advinda da classe, mas pode ser usado como quiser pelo usuário.
Observação 1:
A definição mais correta de objeto é: o local da memória onde é armazenado o Estado da
Classe. Todavia, entendemos que esta definição é pouco assimilável para um aluno
iniciante em Java. Caso fique mais fácil entender por esta definição ou por outra
definição, fique a vontade.
Observação 2:
"calcula" (repare que está em letra minúscula) é a variável de referência que aponta para
o objeto, ou melhor, detem o endereço de memória do objeto propriamente dito. Mas
facilita o entendimento pensar em "calcula" como se fosse o objeto em si e como uma
cópia da classe "Calcula". Seria como estivéssemos usando a própria classe em si.
Observação 3:
Como é padrão, a SUN recomenda que a variável referência (que estamos chamando de
objeto por uma questão de simplicidade) deve ter o nome da classe, mas com a primeira
letra minúscula. Na prática, podemos chamar a variável de referência do que quisermos.
Em vez de "calcula" podemos dar o nome de "c" substituindo por exemplo:
"calcula.calcula_media1()" por "c.calcula_media1()".
Vamos pegar um exemplo um atributo e ver como foi feito o encapsulamento dele:
int num1;
Para fazer que "num1" seja visível fora da classe temos que criar um método, ele
terá que começar com a palavra "get" e primeira letra deverá depois desta palavra deve ser
maúscula. O método ficará assim: "getNum1()", ele terá que ter o mesmo tipo de "num1"
e terá que ter o mesmo valor dele. Para isto, criamos um método de retorno:
return num1;
Como foi dito quando falamos anteriormente sobre métodos, o método de retorno,
recebe o valor que estiver no comando "return". Neste caso, "retun num1" seria como se
atribuíssemos um valor ao método: "getNum1() = num1", mas não tentem fazer isto pois
dará erro. Como sabemos que "num1" tem o valor inicial de 10, "getNum1()" passa a ter
o mesmo valor.
Se por outro lado, passarmos valores para dentro do parentese do "setNum1()" em verdade
estaremos atribuindo o valor de dentro do parêntese ao num1.
3.6 - Herança
Herança é o mecanismo pelo qual uma classe obtém características (métodos e
atributos) de outra classe. A classe "filho" que recebe estas características é chamada de
"subclasse" e a classe "pai" que passa estas características são chamadas de "superclasse".
vejamos o exemplo do Código 1:
public class Ser_Humano {
String classe_de_animal = "mamífero";
String geracao_de_energia="metabolismo";
String alimentacao_infantil="leite";
String animal = "Ser Humano";
String alimentacao_adulta="onivora";
int espectativa_de_vida=70;
double velocidade_maxima=30;
public void metodo_mamifero(){
System.out.println("A temperatura corporal é regulada pelo " + geracao_de_energia);
System.out.println("A alimentação na infância é o " + alimentacao_infantil);
}
public void metodo_Ser_Humano(){
System.out.println("Este animal é um " + animal);
System.out.println(animal + " é um " + classe_de_animal);
System.out.println("Tem espectativa de vida de " + espectativa_de_vida +" anos");
System.out.println("E chega a uma velocidade de " + velocidade_maxima+" km/h");
}
}
Obvervando a classe, verificamos que ela fala das características do ser humano.
Entre as características estão as que se relacionam esclusivamente com a espécie humana:
espectativa de vida, forma de alimentação durante a fase adulta, velocidade máxima que ele
pode atingir. Há também características comuns a outros mamíferos como: alimentação
infantil e geração de energia. Há um pequeno problema, vamos supor que queiramos fazer
classes para outros animais também mamíferos como a Zebra e o Guepardo. As
características do mamífero não podem ser aproveitadas nestas outras classes (Zebra e
Guepardo). Mas justamente reaproveitamento de código é a chave da orientação a objeto,
economiza tempo ao evitar-se de ter que reescrever o código a cada vez que façamos uma
classe de um animal mamífero. Por isso, vamos retirar da classe Ser_Humano todo o
código que se referir ao Mamífero e, em seguida, vamos criar uma classe só para mamífero
que será Mamifero:
O Código 2 ficaria assim:
package mamifero;
public class Mamifero{
String classe_de_animal = "mamífero";
String geracao_de_energia="metabolismo";
String alimentacao_infantil="leite";
public void metodo_mamifero(){
System.out.println("A temperatura corporal é regulada pelo " + geracao_de_energia);
System.out.println("A alimentação na infância é o " + alimentacao_infantil);
}
}
----------------------------
package mamifero;
public class Ser_Humano extends Mamifero{
// é como se todas as carcterísticas da Classe "Mamifero" fossem colocadas na classe
"Ser_Humano"
String animal = "Ser Humano";
String alimentacao_adulta="onivora";
int espectativa_de_vida=70;
double velocidade_maxima=30;
public void metodo_Ser_Humano(){
System.out.println("Este animal é um " + animal);
System.out.println(animal + " é um " + classe_de_animal);
System.out.println("Tem espectativa de vida de " + espectativa_de_vida +" anos");
System.out.println("E chega a uma velocidade de " + velocidade_maxima+" km/h");
}
}
Os códigos referentes ao mamífero foram retirados da classe "Ser_Humano" e
passaram a ter uma classe só para eles, a classe "Mamífero". A Classe Ser_Humano não
perdeu nada com esta retirada de código de seu escopo (entre as chaves ou o corpo da
classe). Ao contrário, além de ter ficado um código mais "claro", menor, mais "limpo", ele
ainda herda da classe Mamífero todas as características, como o tipo de alimentação na
infância e a geração de energia. Agora só falta acrescentar a classe "Main" com o método
"main" para chamar e executar os métodos da classe "Ser_Humano":
---------------------------------
package mamifero;
public class Main {
public static void main(String[] args) {
Ser_Humano homem = new Ser_Humano();
homem.metodo_mamifero();
homem.metodo_Ser_Humano();
}
}
------------------------------------------------------
O resultado deste programa será:
Este animal é um Ser Humano
Ser Humano é um mamífero
Tem espectativa de vida de 70 anos
E chega a uma velocidade de 30.0 km/h
A temperatura corporal é regulada pelo metabolismo
A alimentação na infância é o leite
---------------------------------------------------------
O ser humano herda características comuns a todo o mamífero como alimentação
por leite e energia corporal produzida por metabolismo (diferentemente dos répteis que
usam a energia solar). Fizemos exatamente a mesma relação entre a classe "Ser_Humano"
e a "Mamífero". A instrução "extends" permite que seja feita esta relação de herança.
"Ser_Humano extends Mamífero" significa literalmente: a classe "Ser_Humano" herda
ou recebe atributos e métodos da classe "Mamífero" . Todavia nem sempre se herda todos
os atributos e métodos, os privados a classe (são aqueles com modificadores de acesso:
"private") não o são (não colocamos nenhum atributo ou método privado neste exemplo).
Agora que criamos a classe "Mamifero", as características de mamífero podem ser
reaproveitada para as classes "Zebra" e "Guepardo". Como no fragmento de código a
seguir:
package mamifero;
public class Zebra extends Mamifero{
String animal = "Zebra";
String alimentacao_adulta="herbivora";
float espectativa_de_vida=30;
double velocidade_maxima=65;
package mamifero;
public Mamifero(){
-----------------------------------------------------------
package mamifero;
public class Ser_Humano extends Mamifero{
String animal = "Ser Humano";
String alimentacao_adulta="onivora";
int espectativa_de_vida=70;
double velocidade_maxima=30;
Observação 1:
Métodos abstratos sempre terminam com ";" já que são apenas declarações e não
executam nada. Ao contrário dos métodos concretos comum que sempre terão que ter
chaves "{ }".
Observação 2:
A classe abstrata não é necessariamente composta de métodos abstratas.
Observação 3:
O método que será executado é o da classe filho. O processo em que o método da classe
filho se impõe sobre o da superclasse é chamado de sobrescrita.
3.9 - Interface:
É semelhante a uma classe abstrata com algumas diferenças. Uma classe pode
herdar apenas uma classe abstrata ou concreta, mas pode implementar várias interfaces.
Outra diferença é que a interface só tem métodos abstratos, isto obriga a classe que
implementa a interface a ter os métodos correspontes de mesmo nome e com os mesmos
parâmetros. Aliás, a finalidade de uma interface é esta mesma, obrigar a criação de
métodos com as mesmas características definidas na interface.
Eis aqui um exemplo de uso da interface baseado no programa criado em sala de
aula pelo professor Belém no dia 12/03/2008. Vamos supor que o O Arquiteto do projeto
queira que os demais programadores criem um pequeno cadastro de cliente. Mas ele quer
amarrar o programa de forma que os programadores não deixem de colocar nome, telefone
e e-mail do cliente. Ele fará obrigando a criar métodos de atributos encapsulados:
"getNome()", "getEmail()" e "getTel()". Ele também quer que seu auxliar crie também
métodos de leitura para "nome", "email" e "telefone" pois entende que ficaria padronizado
segundo o modelo que ele tem nada cabeça. Então ele quer obrigar também que seja criado
os seguintes métodos: "public void lerNome()", "public void lerTel()" e "public void
lerEmail()". Para que isto tudo aconteça, ele cria seguinte interface:
Por sua vez, o programador que realizar o projeto terá que implementar método por
método. É como se fosse um projeto de programa que o auxliar é obrigado a implementar.
Veja o programa que o auxiliar criou.
-----------------------------------------------------------------
package projeto3a;
import java.util.Scanner;
}----------------------------------------------------------------------------
Resultado possível:
Nome :
Professor David
E-mail :
David@coti.com.br
Telefone :
23232323
Professor David
David@coti.com.br
23232323
------------------------------------------------------------------------------------------------------------
package engenharia;
double getQtde_cimento();
double getQtde_concreto();
int getQtde_viga();
int getQtde_operario();
}
---------------------------------------------------------
O programador sabe que baseado na interface, ele deve criar outra classe que no mínimo
deve ficar assim:
package engenharia;
public Edificil() {
}
}
-----------------------------------------------
Quanto ao que fazer com estes métodos, é uma outra estória. O que se sabe é que no
mínimo o programa deve ter este métodos e que eles dêem um resultado útil para que o
programador não seja mandado embora. O engenheiro mostra as fórmulas e diz para que
servem e fala para o programador, "te vira" e "tchau".
3.10 - Polimorfismo
Polimorfismo vem do grego e significa muitas formas. Em programação está
relacionado a técnica de colocar métodos diferentes com o mesmo nome para realizar
tarefas semelhantes em princípio (se for mau programado podem fazer coisas
completamente distintas). O polimorfismo é dividido em Polimorfismo Estático e
Dinâmico.
package mamifero;
public abstract class Mamifero{
public Mamifero(){
-----------------------------------------------------------
package mamifero;
Observação:
É chamado de polimorfismo dinâmico porque é em tempo de execução que a JVM decide
que método deve ser implementado.
3.10.2 - Polimorfismo Estático (Sobrecarga)
Sobrecarga é o processo em que métodos distintos tem o mesmo nome, mas se
diferenciam pelo tipo de parâmetros passados, ou melhor, o tipo de variáveis entre os
parênteses é que vai diferenciar um método e outro. O compilador vai decidir quais os
parâmetros são mais adequados e assim, vai escolher o método a ser executado.
package sobrecarga;
return 0;
}
public float metodo_sobrecarregado(int a){ // passa uma variável inteira
return 0;
}
}
Ao serem chamados estes métodos, a Java VM procura o método com o parâmetro
correspondente a chamada:
-----------------------------------------------------------------------------------------
package sobrecarga;
public class Main {
public Main() {
}
}
------------------------------------------------------------------------------------
Resultado:
método sobrecarregado 3
método sobrecarregado 1
método sobrecarregado 4
-------------------------------------------------------------------------------------
Há ainda o tipo "default" que é um modificador de acesso padrão. Sempre que não
for colocado nenhum modificador de acesso, a JVM (Java Virtual Machine) o colocará para
você, mas não ficará visível para o programador (ele fica implícito). O modificador
"default" permite a classe ser acessada somente por classes do mesmo pacote. Vejamos
como exemplo o programa desenvolvido pelo professor Belém em sala de aula no dia
05/03/2008 :
package rede;
public class Administrador extends Acesso {
public Administrador() {
}
public void mostraPerfil(){ // método que é chamado no método "main()" na "classe
Main" no comando "a.mostraPerfil();"
System.out.println("Estamos na classe Administrador: ");
------------------------------------------
package rede;
public Acesso() {
}
protected void perfil1(){ // Este é um método protegido, ele somente é acessível dentro da
classe e
// dentro das classes "filhos" da classe "Acesso", neste caso é a classe
Administrador.
public void perfil2(){ // Este é um método público, ele é acessível em qualquer classe.
// Sendo que fora da classe "Acesso" e das classes "filhos"
// o acesso é possível criando objeto por meio da chamada de um
construtor, usando "new".
private void perfil4(){ // Não permite acesso fora desta classe. Nem mesmo as classes
filhos têm acesso a esta classe.
System.out.println("Acesso ao perfil do usuario somente dentro desta classe");
}
}
---------------------------------------------
package local;
import rede.*; // Como a classe "Usuario" está em pacote diferente da classe "Acesso" é
necessário
// importar o pacote de "Acesso" que é "rede".
-----------------------------------------------------------------------------------------------
projeto Rede
---------------------------------
package rede;
3.12 - Construtor
É muito parecido com o método, mas tem propriedades que o diferencia dele (que
serão vistas somente mais adiante em um curso mais avançado). O construtor possibilita o
acesso a informações da classe e a criação de um objeto. O construtor pode estar explícito
ou implícito na classe, ou seja, vc pode ver ou não na classe, mas ele sempre estará lá! No
programa de referência, você vai encontrá-lo no fragmento de código:
public Main() {
}
public Calculo() {
Ao contrário do método, o construtor não retorna valor nunca. Ele pode realizar
tarefas, como operações matemática, por exemplo, de dentro de seu escopo (o lugar entre as
chaves { }) como um método normal. É fácil reconhecer um construtor, ele é parecido com
o método, tem um parêntese ao lado (com ou sem parâmetros dentro dele) e seu escopo é
delimitado por {} como no método. Todavia tem o mesmo nome da classe e começa com
letra maúscula. Como método comum, ele pode fazer passagem de parâmetros comum.
Veja o exemplo deste código em que o construtor é usado como se fosse um método
comum no programa do professor Belém feito em aula no dia 05/03/2008 :
package oobasico3;
public Main() {
}
------------------------------------------------------------------------------------------
package oobasico3;
public Classe1(String n, int i) { // o construtor aqui é usado como se fosse um método comum.
nome = n;
idade = i;
}
public String getNome(){// o retorno pode ser feito de 2 formas ou get ou toString
return nome;
}
-----------------------------------------------------------------------------------------------------------------------
Resultado:
Jorge
23
Recomendações:
1 - Não trabalhar com variáveis fora das classes, somente trabalhe com métodos set/get
correspondentes as variáveis. Faça, portanto, encapsulamento, caso os dados sejam usados
fora da classe. Os atributos devem ser privados (usando private) e os métodos com
set/get deverão fazer o papel dos atributos.
2 - Não criar métodos dentro da classe "Main" todas as operações deverão ser realizadas
em métodos de outras classes criadas para as tarefas específicas. Lembre-se o método
main(), assim como a classe Main são como se fossem chefes, eles não realizam tarefas
em si, eles só mandam os outros realizar as tarefas.
3 - Usar somente uma classe por arquivo, ela deve ser pública e começar com letra
maúscula.
4 - Usar uma classe por categoria de tarefas e um método por tarefa a ser executada.
5 - Classes devem começar por letras maúscula. Métodos e Variáveis devem escritos com
letras minúsculas. Constantes devem ser escritas em caixa alta e dentro de "interface".
Capítulo IV - Funcionalidades
Importantes
4.1 - Vetor
Vetor agrupa elementos com mesmo tipo(String, double, int etc.), sendo que cada
elemento fica em uma posição correspondente a índice, exemplo:
Suponhamos que eu tenha guardado no vetor "v[ ]" números na seguinte ordem
{7,5,9,8,5,9}. Se quisermos exibir elementos do vetor teremos que colocar valores no
índice. O vetor começa com a posição "0" nesta posição ficará o número "7", na posição
"1" ficará o valor "5", na posição "2" ficará "9" e assim por diante. Se quisermos, por
exemplo, ver o que há na posição na posição, teremos que colocar o valor da posição entre
as chaves "[ ]" e imprimir o resultado: "System.out.println(v[3])". Será mostrado como
resultado, o valor: "8".
Para atribuirmos os valores listados em {7,5,9,8,5,9}ao vetor podemos fazer variar o índice
do vetor:
v[0]=7;
v[1]=5;
v[2]=9;
v[3]=8;
v[4]=5;
v[5]=9;
Só que fazer isto dá muito trabalho, imagina fazer isto para um vetor que tenha tamanho de
"1000"! uma forma de diminuir nosso trabalho é colocar todos estes valores de uma só vez.
for(int k=0;k<6;k++){
v2[k]=input.nextInt();
<tipo> pode ser String, double, int etc. <nome do vetor> é arbitrário depende da
conveniência do usuário. [Tamanho do vetor] deve ser o tamanho máximo que um vetor
pode atingir. Exibir:
-----------------------------------------------------------------
package teste;
String v2[]={"A","B","C"};
String v3[]=new String[3];
v3[0]="F";
v3[1]="G";
v3[2]="H";
for(int k=0;k<3;k++){
v1[k]=2*k;
}
for(int i=0;i<3;i++){
-----------------------------------------------------------------------------------
package teste;
public Main() {
}
---------------------------------------------------------------------------------------
Resultado:
no vetor v1 na posição 0 o valor do vetor é 0.0
no vetor v2 na posição 0 o valor do vetor é A
no vetor v3 na posição 0 o valor do vetor é F
no vetor v1 na posição 1 o valor do vetor é 2.0
no vetor v2 na posição 1 o valor do vetor é B
no vetor v3 na posição 1 o valor do vetor é G
no vetor v1 na posição 2 o valor do vetor é 4.0
no vetor v2 na posição 2 o valor do vetor é C
no vetor v3 na posição 2 o valor do vetor é H
4.2 - Lista
Lista é semelhante a um vetor, só que não tem tamanho determinado e os valores
são alocados sem necessidade de se saber sua posição ou índice.
A Lista em Java é feita sem a necessidade de uso de ponteiro de maneira explícita. Para
criar a Lista é necessário a criação de objeto: "List nome_da_lista = new ArrayList()".
Há a adição de um novo elemento na lista por meio do método 'add("expressão")'. Se
fizermos por exemplo:
A lista é: [A, B, C]
--------------------------------------------------------------------------------------------------------------
-----------------------------
Na posição 0 está: A
Na posição 1 está: B
Na posição 2 está: C
--------------------------------------------------------------------------
Eis aqui um exemplo de um programa completo feito pelo professor Edson Belém em aula
no dia 25/04/2008.
package array;
public Main() {
}
---------------------------------------------------------------------------------------------------
package array;
}
-------------------------------------------------------------------------------------------------------
package array;
import java.util.ArrayList;
import java.util.List;
public Array1() {
}
--------------------------------------------------------------------------------------------------------------
--------------
package array;
import java.util.ArrayList;
import java.util.List;
public Array2() {
}
}
----------------------------------------
Terá o seguinte resultado:
[28.0, adsfsdsd]
[Ewerton, Thiago, Gustavo, Antony]
Antony
O "try" faz tentativa de execução das instruções. É usado para os casos em que há
risco grande de os comandos não serem executados. "try" terá que estar acompanhado de
um dos dois comandos: "catch" ou "finally" ou de ambos, caso isto não aconteça a JVM
"reclamará". Ele interromperá a instrução de onde há um erro e dará um salto para o
"catch" (caso este exista) ou para "finally"(caso este exista). O comando "catch" tem
como finalidade mostrar uma mensagem de erro caso a operação não seja feita. "finally" é
executado havendo erro ou não durante a execução.
package tentativa;
import java.util.Scanner;
try{
System.out.println("Ponha o primeiro número: ");
double num1=input.nextDouble();
System.out.println("Ponha o segundo número: ");
double num2=input.nextDouble();
}catch(Exception e){
System.out.println("");
System.out.println("Alguma falha ocorreu durante a execução.");
} finally{
System.out.println("Obrigado pela preferência do nosso serviço, volte sempre!");
}
}
}
-------------------
Se eu digitar "15" e "3" depois da mensagem "Ponha o primeiro número: " e "Ponha o
segundo número:" respectivamente teremos o seguinte resultado:
Por que é tão arriscado assim fazer esta conta matemática? Afinal, é apenas uma divisão
simples entre dois números (num1/num2).
Em verdade, muita coisa pode dar errado. Vamos supor que por distração coloquemos um
caracter em vez de número quando for solicitado. Teremos o seguinte resultado:
package tentativa;
import java.util.Scanner;
}catch(Exception e){
System.out.println("");
System.out.println("Alguma falha ocorreu durante a execução");
} finally{
}
------------------------------------------------------------------------------
package tentativa;
public Main() {
}
}
---------------------------------------------------------------------
A divisão não foi executada e nossa mensagem de erro apareceu! Para que isto
ocorresse foi acrescentado a linha de comonado:
'if(num2==0) throw new Throwable("Erro! Divisão por Zero")' esta linha diz a JVM
se "num2" for igual a zero desvie a execução para a mensagem de erro: '("Erro! Divisão
por Zero")' e não execute mais nada! E nada mais foi executado. Inclusive sequer entrou
na estrutura do "catch". Throwable é responsável pelo tratamento de excessões, ou melhor,
de erro. Tratar erro significa simplesmente identificar onde está ocorrendo o erro, parar
execução e mandar uma mensagem se possível identificando que erro ocorreu. Repare
também que foi colocado também o comando: throws Throwable no método. É para dizer
que dentro deste método haverá um tratamento de erro advindo Throwable.
-------------------------------------------------------------------------------------
4.4 - Arquivos
Há algumas classes muito úteis para criação e gravação em arquivos, entre elas
estão: PrintWriter e RandomAccessFile. Em baixo, no próprio cometário está explicado
como trabalha as funcionalidades. Trabalhar com arquivos é sempre uma operação
arriscada pois o arquivo ou diretório podem não estar acessíveis ou impossibilitados de
serem criados. Por isto, é sempre necessário o uso de "try" toda vez que lidamos com
gravação, criação de arquivos ou qualquer operação com arquivos. As seguintes chamadas:
"PrintWriter p = new PrintWriter (new FileWriter("c:/banco.txt"));" e
"RandomAccessFile rw=new RandomAccessFile("c:/banco1.txt","rw");" criam
respectivamente os arquivos vazios "banco.txt" e "banco1.txt". Para gravar nos arquivos
foram usados "p.print(nome)" e "rw.writeBytes("próxima
frase:"+"\n"+nome+"\n")", sem estes comandos o arquivos continuariam vazios.
package oobasico1;
import java.io.*;
import java.util.Scanner;
package banco;
public Main() {
}
gb.consultaTabela();
}
----------------------------------------------------------------------------------------------------------
package banco;
import java.util.Scanner;
----------------------------------------------------------------------------------------------------------
package banco;
import java.sql.Connection; // Biblioteca necessaria para mysql
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/banco3","root","coti
");
// Con recebe dados de conexão. root é o login e coti é a senha.
}catch(Exception e){
}
}
public void insereTabela(Aluno alu){
try{
PreparedStatement stmt=con.prepareStatement("insert into aluno values(?,?)");
// prepareStatement prepara a conexão para receber comandos sql
// insert into aluno values(?,?), são comandos sql para inserir dados na tabela
// aluno. As interrogas pedem os comandos abaixo, no primeiro ? entra
// "alu.getNome()" e no segundo ? entra "alu.getIdade()"
stmt.setString(1,alu.getNome()); // 1 indica que "alu.getNome()" está na primeira "?"
// setString é usado para atribuir valores inteiros
stmt.setInt(2,alu.getIdade()); // 2 indica que "getIdade()" está na segunda "?"
// setInt é usado para atribuir valores inteiros
stmt.execute(); // executa os comandos sql
stmt.close(); // fecha a execução.
System.out.println("Dados Gravados");
}catch(Exception e){
}
}
public void consultaTabela(){
try{
PreparedStatement stmt= con.prepareStatement("select * from aluno");
// prepara o comando para obter a tabela
ResultSet rs = stmt.executeQuery();
// executa a consulta
while (rs.next()){
//percorre do inicio ao fim (do primeiro registro ao ultimo da tabela)
System.out.println("Nome" + rs.getString("nome"));
System.out.println("Idade" + rs.getInt("idade"));
System.out.println("----------------------");
}
rs.close();
stmt.close();
System.out.println("Consulta Realizada");
}catch(Exception e){
}
}
public BancoAluno() {
}
}
--------------------------------------------------------------------------------------------------------------
/////////Startar o mySQL///////{
1º Clica em iniciar>executar e digita services.msc
2º Na aba Serviços (local) escolha MySQL
}
//Cria o banco
mysql> create database banco3;
//conecta o banco
mysql> use banco3
Database changed
//Cria a tabela
mysql> create table aluno(nome varchar (35), idade int);
//Descrição da tabela
mysql> desc aluno;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| nome | varchar(35) | YES | | NULL | |
| idade | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
//Atualiza a tabela aluno mudando o nome para thiago quando a idade for 15
update aluno set nome='Thiago' where idade=15
//Update e delete estão sempre em condição.
Apendice A
As palavras reservadas já tem uma função pré-definida no java e não podem ser usadas em
outra coisa, senão nas funções originalmente
definidas pela SUN (criadora do Java).
Aqui eu darei uma receita de bolo para se criar uma classe. Ainda está em construção
Receita de bolo: