• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Sir Pereira

Condição?

8 mensagens neste tópico

Boas mais uma vez, hoje já devem tar fartos de mim :-[ mas é o que dá, aprender linguagem nova trás muitas dúvidas  :cheesygrin:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication1;
import java.util.Scanner;
/**
*
* @author Ivo
*/

public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.print("|''''''''''''''''''''''''''''''''''''''''''''|\n");
        System.out.print("|-----------Powered by: Ivo Pereira----------|\n");
        System.out.print("|''''''''''''''''''''''''''''''''''''''''''''|\n");
        System.out.print("|                                            |\n");
        System.out.print("|              My first Java app             |\n");
        System.out.print("|            Made in Netbeans IDE            |\n");
        System.out.print("|____________________________________________|\n");
        System.out.print("Digite o seu nome: \n");
        String nome = s.nextLine();
        System.out.print("Digite a sua idade: \n");
        int idade = s.nextInt();
        s.nextLine();
        System.out.print("Digita a sua localidade: \n");
        String localidade = s.nextLine();

        System.out.print("Nome: " + nome + "\nIdade: " + idade + " anos\nLocalidade: " + localidade + "\n");
        
        if (localidade=="Beja") {
            System.out.print("Fixe és de beja também ");
        } else {
            System.out.print(localidade + " deve ser um sítio giro ");
        }
    }

}

Ora bem, ao digitar Beja para a string localidade, ele emite-me a condição alternativa else, em vez de supostamente me emitir a condição se o conteúdo da String localidade for igual a "Beja".

Cumps and ty

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

As strings em Java não se comparam com '=='. Tens de usar o método equals.

if (localidade.equals("Beja"))

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

As strings em Java não se comparam com '=='. Tens de usar o método equals.

if (localidade.equals("Beja"))

OK thanks. Tava habituado a fazer como fazia em VB.net.

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication1;
import java.util.Scanner;
/**
*
* @author Ivo
*/

public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.print("|''''''''''''''''''''''''''''''''''''''''''''|\n");
        System.out.print("|-----------Powered by: Ivo Pereira----------|\n");
        System.out.print("|''''''''''''''''''''''''''''''''''''''''''''|\n");
        System.out.print("|                                            |\n");
        System.out.print("|              My first Java app             |\n");
        System.out.print("|            Made in Netbeans IDE            |\n");
        System.out.print("|____________________________________________|\n");
        System.out.print("Digite o seu nome: \n");
        String nome = s.nextLine();
        System.out.print("Digite a sua idade: \n");
        int idade = s.nextInt();
        s.nextLine();
        System.out.print("Digita a sua localidade: \n");
        String localidade = s.nextLine();

        System.out.print("Nome: " + nome + "\nIdade: " + idade + " anos\nLocalidade: " + localidade + "\n");
        
        if (localidade.equals("Beja") || localidade.equals("beja")) {
            System.out.print("Fixe és de beja também ");
        } else {
            System.out.print(localidade + " deve ser um sítio giro ");
        }
    }

}

Já agora, por exemplo eu aqui fiz para verificar se "Beja" começava com maiúsculas ou não, não dava para fazer isso em vez de pôr as duas alternativas como eu pus ("Beja" e "beja")?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em Java qualquer objecto tem de ser comparado com o método equals ou compareTo, isto porque se usares os dois sinais de igual vais comparar referências e não objectos. Imagina que uma referência é um endereço de memória, ao comparares com dois sinais de igual estás a comparar esses endereços. Com objectos essa comparação só é verdadeira se estiveres a comparar um objecto com ele próprio, dado que duas referencias só são iguais se forem a mesma referencia.

Para piorar o caso, em Java as Strings são objectos imutáveis, isto é, uma vez criados nunca podem ser modificados. Portanto, se tentares comparar duas strings usando o seguinte código:

 "ola" == "ola"

essas strings nunca seriam iguais, além de serem objectos com referencias diferentes.

Com tipos primitivos essa comparação já funciona, ex: int, double, char, float, boolean

Nem todos os objectos implementam o método equals ou o compareTo, dado que Java é uma linguagem orientada a objectos, caso um objecto não implemente um método o Java vai subindo na hierarquia à procura do método pedido, só quando não encontrar é que dá erro. O problema é que a classe de topo da hierarquia, a classe Object, implementa esses métodos da forma mais simples, por exemplo no caso do método equals, a classe Object implementa uma comparação de referências, usa os dois sinais de igual. Assim se invocares o método equals num objecto que não redefine correctamente esse método, o resultado é a comparação de referências e não a compração correcta dos valores.

Por sorte a classe String implementa todos os métodos necessários e mais alguns :), assim para comparares duas strings sem te preocupares com a capitalização podes usar o método compareToIgnoreCase(), que compara duas strings sem se preocupar com as diferentes capitalizações das letras.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para piorar o caso, em Java as Strings são objectos imutáveis, isto é, uma vez criados nunca podem ser modificados. Portanto, se tentares comparar duas strings usando o seguinte código:

 "ola" == "ola"

essas strings nunca seriam iguais, além de serem objectos com referencias diferentes.

Pois, mas precisamente devido ao facto das strings em Java serem objectos especiais, esse exemplo que deste, até deve dar true...

Não só nesse caso, mas também em:

String s1="ola";
String s2="ola";

... s1==s2 ...

Sendo as strings imutáveis, o Java pode usar a mesma referência para as duas.

Tal já não aconteceria se se usasse o construtor (new String("ola")).

É claro que o resultado só é true, porque mesmo sendo duas variáveis diferentes, a referência é a mesma. E obviamente que a forma correcta de comparar strings é com o equals.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, mas precisamente devido ao facto das strings em Java serem objectos especiais, esse exemplo que deste, até deve true...

Realmente poderia, mas esse comportamento já é dependente da JVM. Já vi casos em que a essa comparação funcionava e que noutras máquinas virtuais falhava. O mais seguro é mesmo usar os métodos, é por isso que eles estão redefinidos.

Mas sim, na verdade era possível que a comparação com dois sinais de iguais funcionasse, mas aí acho que também entraríamos na questão de não ser possível redefinir operadores em Java, que é basicamente o que essa situação representa, uma redefinição do operador quando se usa strings.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm ok, thanks pessoal. Explicação conjunta de 5* :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora