[quote=GilsonNunes][quote=Rodnei] :shock: credo que coisa horrorosa é essa ?
pelo codigo será impresso 17, mas …
este codigo ñ ajuda ninguem a compreender nada.
ta muito confuso.
demita seu prof ou jogue fora o livro q estiver lendo.
[/quote]
eu creio q o intuito do código não era ensinar programar, mas “testar” a interpretação.
por isso a complicação.
[/quote]
até concordo com vc GilsonNunes, mas este codigo ñ tem padrão, e utilizar exceções para fazer trabalho de if
acaba por gerar mais confusão do que ajudar no estudo e na interpretação.
se a intenção é o estudo de exceções existem exemplos muito mais esplicativos, praticos e objetivos.
se a questão for interpretação nada melhor que algoritimo e teste de mesa.
public void imprime() {
System.out.println(nome);
}
}[/code]
[code]public class Filho extends Pai {
String nome = “Filho”;
public void imprime() {
System.out.println(nome);
}
}[/code]
public class Heranca {
public static void main(String[] args) {
Filho filho = new Filho();
System.out.println(filho.nome);
filho.imprime();
Pai pai = filho;
System.out.println(pai.nome);
pai.imprime();
}
}
public class Heranca {
public static void main(String[] args) {
Filho filho = new Filho();
System.out.println(filho.nome); //imprime o atributo nome de filho
filho.imprime(); //chama o metodo imprime que imprime o atributo de filho
Pai pai = filho; // cria um novo objeto pai do tipo Pai e carrega com o objeto filho instacia de Filho
System.out.println(pai.nome); //imprime o atributo de pai
pai.imprime(); //chama o metodo imprime de pai que imprime o atributo de filho
}
}
Eu não entendi o a e variável x, como ela é private a classe a qual a variavel, é que fiquei bem confuso com os tratamentos de erros que ainda não entendo tão bem. Se entendi a variável x pode ser vista e acessada por todos, pois está dentro da classe principal onde ela foi criada, menos a classe q01 onde está o main. O resto é tudo public. Outra coisa que não entendi foi a classe teste, ela não é superclasse, então como as outras funções tratam a variável x?
É horroroso mesmo! Vou estudar melhor esta parte para poder entender o melhor, principalmente exceções e os métodos. Fico confuso, pois posso aplicar modificadores a variáveis. métodos, classes, objetos, etc. E piora quando são aninhados ou tem uma superclasse. Ai que eu me dano todo.
Valeu pela ajuda Guj Ranger, entendi que é um péssimo exemplo, arrrghhh. Espero que na próxima não caia um exercício deste tipo na prova. Vou fazer a prova do TJ e do TRF. As duas pedem java.
[quote=Rodnei]
public class Heranca {
public static void main(String[] args) {
Filho filho = new Filho();
System.out.println(filho.nome); //imprime o atributo nome de filho
filho.imprime(); //chama o metodo imprime que imprime o atributo de filho
Pai pai = filho; // cria um novo objeto pai do tipo Pai e carrega com o objeto filho instacia de Filho
System.out.println(pai.nome); //imprime o atributo de pai
pai.imprime(); //chama o metodo imprime de pai que imprime o atributo de filho
}
}
logo a resposta é
(a)Filho
Filho
Pai
Filho[/quote]
public class Heranca {
public static void main(String[] args) {
Filho filho = new Filho();
System.out.println(filho.nome); //imprime o atributo nome de filho
filho.imprime(); //chama o metodo imprime que imprime o atributo de filho
Pai pai = filho; // var pai RECEBE a referencia de filho;
System.out.println(pai.nome); //imprime o atributo de pai
pai.imprime(); //chama o metodo imprime [b]sobrescrito[/b] em filho //polimorfismo é exatamente isso. não?
}
}
Eu consegui entender o comportamento do Java.
Mas achei estranho, porque a classe Filho não tem diretiva de Override (Acho que isso nem é utilizado no java, tem annotation @Override mas é outra história).
No Pascal e .Net o override tem que ser explicito, precedido de um modificador virtual na classe Pai.
[quote=brunog3]Eu consegui entender o comportamento do Java.
Mas achei estranho, porque a classe Filho não tem diretiva de Override (Acho que isso nem é utilizado no java, tem annotation @Override mas é outra história).
No Pascal e .Net o override tem que ser explicito, precedido de um modificador virtual na classe Pai. [/quote]
na realidade o @Override não é apenas um annotation, é vc “explicitando” o override.
eu particularmente prefiro ele explicito.
pq se vc errar o nome do metodo a ser sobrescrito, com o @override, vai gerar um erro de compilação.
e sem ele, simplesmente entenderia como um outro metodo.
e não pense q não é comum o erro de digitação, esses dias mesmo teve um caso aki no guj q o prob era exatamente o nome do metodo errado e, por isso, não fazia o override.
[quote=GilsonNunes][quote=Rodnei]
public class Heranca {
public static void main(String[] args) {
Filho filho = new Filho();
System.out.println(filho.nome); //imprime o atributo nome de filho
filho.imprime(); //chama o metodo imprime que imprime o atributo de filho
Pai pai = filho; // cria um novo objeto pai do tipo Pai e carrega com o objeto filho instacia de Filho
System.out.println(pai.nome); //imprime o atributo de pai
pai.imprime(); //chama o metodo imprime de pai que imprime o atributo de filho
}
}
logo a resposta é
(a)Filho
Filho
Pai
Filho[/quote]
public class Heranca {
public static void main(String[] args) {
Filho filho = new Filho();
System.out.println(filho.nome); //imprime o atributo nome de filho
filho.imprime(); //chama o metodo imprime que imprime o atributo de filho
Pai pai = filho; // var pai RECEBE a referencia de filho;
System.out.println(pai.nome); //imprime o atributo de pai
pai.imprime(); //chama o metodo imprime [b]sobrescrito[/b] em filho //polimorfismo é exatamente isso. não?
}
}
Acho que ele não quer as respostas mas entender a proposta do exercício.
Pessoalmente, acho este tipo de construção ridículo, só serve para atrapalhar e demonstrar maus exemplos.
O exercício começa no Main:
public class Q01 {
public static void main(String[] args){
Teste t=new Teste(1,2); //Cria a classe teste onde x = 1 + 2 --> 3
t.m1(5); //chama método m
System.out.println(t.getX()); //Obtém o valor de x que foi iniciado no construtor e transformado no método m.
}
}
Até aqui, acho que está tranquilo.
O problema é o método m!
[code]public void m1(int a) {
int p;
try { //INICIA O BLOCO TRY - CATCH
p = x % a;
if (p < 4)
throw new Exc01(); // DISPARA UMA NOVA EXCEÇÃO
} catch (Exc01 e) {
x += 5;
return;
} catch (Exception e) {
x += 7;
return;
} finally {
x += 9;
}
return;
}[/code]
O trecho: if (p < 4)
throw new Exc01(); // DISPARA UMA NOVA EXCEÇÃO
dispara a exceção, porém a mesma está dentro de um bloco try-catch, ou seja, será tratada pela mesma. Caso as clausulas catch não se responsabilizem pelo tratamento é que a exceção seria encaminhada para fora do método. Mas a exceção é tratada: } catch (Exc01 e) {
x += 5;
return;
} e tem um return terminando o método. Mas o método só é realmente terminado após passar pelo finally (opcional no bloco try-catch, mas quando presente sempre é chamado): } finally {
x += 9;
}
Aqui, a exceção é usada como se fosse um if (por isso considero essa construção ridicula e um péssimo exemplo.