Duvidas básicas e teoricas

8 respostas
A

Estava lendo dois livros, Java como Programar 4 e Core Servlet JSP e me apareceu algumas dúvidas básicas…
primeiro:
eu li la que quando vc declara um Objeto String ele não pode alterar o valor, exemplo

String a = new String("Teste");

caso vc queria alterar o valor usa-se o StringBuffer, até ae tudo bem…se eu fiz

String a = new String("Teste");
a = "testando string";

o valor de a não vai mudar e vai sempre ser Teste???

outra coisa. quando vc faz
String a = new String(“Teste”); em
String a -> eu declarei a variavel a do tipo String certo?
a = new String(“Teste”); -> estou criando o Objeto a da classe String, certo?

entao quando tem

String a = "teste";

onde está sendo declarado o objeto aqui??

a segunda é sobre um comando que eu vi
comando assim

enumeration parametro = request.getParameterNames();
String valor = (String) parametro.element.Next();

o que significa esse (String) entre parenteses??

Obrigado

8 Respostas

Leandro

Meu… tem caras nesse Forum que poderiam escrever um livro inteiro sobre seu tópico… vou tentar ser breve que depois eles vão vir com certeza… hehehe

Antes de mais nada, o Java Core 2 Volume I te ajudaria bastante com conceitos desse tipo…

String a = new String("Teste");

Você declarou um objeto String chamado a, com o valor “Teste” que foi passado no construtor (do objeto), um construtor geralmente serve para iniciar um objeto com suas propriedades básicas, para que você economize linha…

a = "Testando...";

Você alterou seu objeto, e agora ele terá o valor de “Testando…”, não terá mais o valor de “Teste”…

No outro caso, você fez o que chamamos de “casting”, transformou um objeto que você sabia que era uma String (de acordo com o exemplo), num objeto String… Pois para a classe “Enumeration” tudo é objeto, genéricos, você que trata os tipos deles…

Essa foi uma explanassão rápida, com o tempo vc pega o jeito… (ou lendo os textos enormes que devem seguir… huahuahuahua)

rarondini

String em java é um objeto, portanto, qq. variavel do tipo String e apenas uma referencia para um endereço de memoria que contenha um objeto String.

String é chamado de tipo imutável, ou seja, quando vc. cria uma String esse não é mais alterado.
O que acontece na sua duvida é o seguinte:

[code] String x = new String("teste");
é a mesma coisa que
[code] String x = "teste";

ambos estão criando uma variavel x que APONTA para um endereço de memoria que cujo conteudo é a palavra "teste".
se voce fizer:
[code] x = "teste denovo";
voce tera uma nova instancia de um objeto String onde a variavel x APONTA para essa nova instancia.

Nesse momento, em memoria, voce vai continuar tendo um objeto com o conteudo "teste" e um outro com o conteudo "teste denovo", porem, a variavel x estara apontando apenas para o ultimo. O espaço em memoria com o conteúdo "teste" nao esta sendo referenciado por mais nenhuma variavel, portanto este sera, em algum momento da execução do programa, excluído da memoria.... (isso fica a cargo do java - pra nao entrar em detalhes sobre garbage collection).

RESUMINDO:
No exemplo acima, a variavel x NUNCA vai ter o valor "teste" ou "teste denovo", ela vai ter uma REFERENCIA para um endereço de memoria cujo conteudo seja 'teste' ou 'teste denovo'....

Quanto ao comando
[code]
enumeration parametro = request.getParameterNames();
String valor = (String) parametro.element.Next();
[/code]

o (String) significa uma conversão de tipos, chamado de CAST no java.
o comando [code]parametro.element.Next(); [code]
retorna valores do tipo Object e para se atribuir a tipos String é necessario fazer um cast.

Em livros e tutoriais de java vc. encontra topicos exclusivos sobre CAST, String e principalmente Orientação a Objetos...

Convem vc. dar uma olhada nos fundamentos da linguagem JAVA primeiro.

claudio

Pessoal eu montei um artigo sobre Strings e ja mandei, e deve sair aqui no GUJ essa semana, acredito que na Quinta.

Abraco.

Gerson

Olá.

Já que estamos falando de conceitos, vamos esclarecer melhor o que é cada coisa, já que essa base é fundamental para iniciar em Java.
Bons artigos sobre isso é o que não falta na internet!

Cuidado! “a”, na verdade, não é o próprio objeto, e sim uma variavel-referencia (um “ponteiro” controlado) que aponta para um objeto String alocado na memória. Um construtor deve ser usado para inicializar um objeto com um estado consistente.

O que foi alterado é a referencia (endereço) para onde “a” guardava (“apontava”), isto é, o objeto String que tinha o valor “Teste” deixou de ser referenciado pela variavel “a”. Agora “a” está “apontando” um outro objeto String (detalhe: do pool de Strings).

Um objeto String ser imutável significa que o conteúdo dela (a sequencia de caracteres) não pode ser alterada. Se uma string tem que ser modificada muitas vezes (ex.: ir concatenando strings, não-literais, dentro de um loop), use StringBuffer!

Gerson K.

A

valeu pela ajuda…
a parte de String eu entendi perfeitamente…

sobre o CAST…
CAST seria atribuir um conteudo de um objeto para outro?
no caso String a = (String)parametro.elementNext(), eu atribui no objeto a um atributo do objeto parametro certo???

entao por exemplo

Integer inteiro = 10
String a = String.valueOf(inteiro);

aqui o objeto ae esta pegando o valor do objeto inteiro, entao é um CASTING também??

eu poderia fazer assim
String a = (String)inteiro;
ou só posso fazer Cast para Object com String???

desculpa as duvidas básicas, mas estou lendo alguns livros e os que eu vi não explicou bem essa parte, por isso venho pedir a ajuda de voces que sao experientes nesse mundo fantastico do Java

Bani

Cast tem a ver com a conversão do tipo.
A enumeration te retorma um objeto do tipo Object, mas você sabe que na verdade aquele objeto é mais especificamente um String (subclasse de Object), e você quer utilizá-lo como String. Para isso, faz essa “conversão” de Object para String através do cast.
Note que se o objeto não fosse uma String, ocorreria uma exception. Por isso é sempre mais seguro utilizar o operador instanceof antes de fazer cast.
Além de cast para classes (sempre obedecendo a regra do objeto ter que ser da classe ou de uma subclasse), existe também o cast de primitivos, que é utilizado para informar o compilador que você não se importa com a possível perda de precisão ao jogar um número que era de uma variável “grande” em uma variável menor, por exemplo convertendo de double para int.
Tudo isso é necessário porque Java é uma linguagem “strong typed”, você realmente tem que estar sempre usando os tipos certinhos para não dar erro de compilação.

A

obrigado pela ajuda, mas uma coisa e nao entendi
por exemplo o Codigo.

String A;
A = new String(“Teste”);

A primeira Linha eu falo que a Variavel A vai ser do tipo String, correto?
A segunda linha eu crio o Objeto A da classe String passando um parametro Teste, correto???

Agora aqui
String A = “Teste”;

Aqui eu consigo enxergar que a Variavel A vai ser do Tipo String, mas onde eu declarei que o A vai ser Objeto String se nao tem a Linha new String(… ??

obrigado

smota

Quando você faz:
String a = “Nova String”;

O compilador vai criar no seu código um new String(“Nova String”) em tempo de compilação e então atribuir sua referência (end de memória) à variável a, isso foi feito apenas para facilitar (ou não, sou meio contra esse negócio) a vida do programador.
No fim das contas eu acho que esse negócio de strings em Java atrapalham pois o pessoal sai usando a torto e a direito sem pensar em memória (além do espaço tem a chateção de alocar e desalocar).

Se mais tarde você tiver:

String b = Nova String;

Você não terá dois objetos string mas sim duas referências para o mesmo objeto! (concorda que  que a string é a mesma e strings são imutáveis não teria razão o compilador alocar mais memória?)

Aguarde o tutorial do camarada aqui no GUJ ou procure, existem muitos topicos sobre String x Performance.

Criado 15 de abril de 2003
Ultima resposta 17 de abr. de 2003
Respostas 8
Participantes 7