Várias perguntas sobre Java

Boa noite a todos

Estou estudando Java a partir de alguns Livros e algumas apostilas…estou no começo dos meus estudos, estou sentindo bastante dificuldade na parte de OO, mas cada vez entendo mais os conceitos

Mas ao se estudar sozinho surge dúvidas que necessitaria da ajuda de alguém para nos responder, por isso vim aqui para que talvez alguem pudesse me ajudar ^^
Vou fazer algumas perguntas , e também algumas informaçoes que gostaria de voces me dissesem se esta correta ou nao.
Obrigado desde já:

  1. A função Lenght serve para medir o tamanho de um Array. Consequentemente lenght serve para medir o tamano de um String, pq uma String é um “array” de chars.
  2. Set , Get e Is são usados apenas quando as variaveis de classe sao declaradas como Private, caso isso nao for verdade os metodos podem ser acessados e consultados de “modo normal”.
  3. Se eu deixar de definir algum metodo na minha classe, automaticamente ela se torna uma classe abstrata?
  4. Interfaces sao apenas “metodos” sem implementaçoes que podem servir para varios classes diferentes e esses por suas vez que “implementam” esses metodos? (se for isso interfaces sao especies de classes abstratas?)
  5. Por que devo usar protected nas variaveis de superclasses?
  6. O import é para quando quero importar um ou mais objetos de outros pacotes.
  7. O que eh mais interessante nessa caso:

Quero criar um programa que cadastre autodromos de corrida, eh mais interessante:
Definir uma classe autodromo e cada pista ser um objeto da mesma ou
Definir uma superclasse autodromo com as principais caracteristicas de um autodromo e classificar as pistas como subclasses ?

Obrigado desde já

E o que você acha?

E o que você já fez do programa?

eu ainda nao fiz, exatamente por ter essa duvida

Length é um método, não uma função. Num array, ele dirá a quantidade de elementos que o array tem. Na string, ele dirá a quantidade de chars que a string tem. Num Java2D.Line irá dizer o comprimento do segmento de reta. A String é uma classe e não necessariamente precisa ser representado por um array de chars (na verdade, a representação da string também envolve um encoding, que descreve como esses chars são traduzidos em letras). Para mais informações: http://www.guj.com.br/posts/list/32457.java#592987

Não, são usados quando as variáveis da classe não são public. Ou seja, se forem protected ou package private elas também não serão acessíveis. Entretanto, podem haver formas melhores de se manipular atributos do que os gets e sets.

Não, você também precisa declarar essa classe como abstract. E detalhe, uma classe abstrata pode ter todos os métodos definidos.

Sim, são apenas definições métodos, sem implementação. Mas elas não são classes abstratas pois elas apenas definem um contrato, um comportamento e não um tipo de dado. Essa diferença é sutil, mas por hora, apenas tenha em mente que a relação de uma classe com uma interface é muito mais leve do que a de uma classe com uma classe abstrata. Com a interface, você tem a certeza de que não existe e nunca existirá uma implementação. Além disso, você pode implementar mais de uma interface, enquanto é restrito a apenas uma única classe abstrata.

Para que elas sejam visíveis nas subclasses, como se fossem public. Outra alternativa é deixar as variáveis private e criar para ela métodos protected que as manipulam de maneira mais direta ou insegura.

Certo

[quote=thiago_258_]Definir uma classe autodromo e cada pista ser um objeto da mesma ou
Definir uma superclasse autodromo com as principais caracteristicas de um autodromo e classificar as pistas como subclasses ?[/quote]

Definir uma classe pista, e fazer com que um autodromo tenha um array de pistas.

Humm, obrigado

Mas então, qual a vantagem de se usar interfaces se sempre voce tem que ficar implementando os metodos?

http://www.guj.com.br/posts/list/51866.java#273117
http://www.guj.com.br/posts/list/55387.java#290673

Ahh, acho que entendi, entao uma interface digamos, que sirva para “padronizar” o modo de certas classes “trabalharem”(serem implementadas)?

E outra pergunta nao muito haver com inferfaces…no Pascal quando eu queria que o laço de repetição fosse mais “devagar”, de modo que eu pudesse “ver” as iteraçoes, eu usava a palavra sleep para isso, em java há algo semelhante?

Obrigado pela ajuda Vini!

Sim. Em java você usa o seguinte comando:

try { Thread.sleep(tempoEmMilisegundos); } catch (InterruptedException e) {}

Certo[/quote]
Eu usaria classe ao invés de objeto. É importante ressaltar que existe um diferença entre as duas coisas e o entendimento disso é fundamental no estudo de OO.

Na realidade o import também se aplica a interfaces, enums, e até métodos ou atributos (com o import static introduzido no Java 1.5).

length em arrays e length em String são coisas diferentes. Em arrays, length é uma constante public e estática. Não é um método. Ele contém o numero de elementos de array. Se o array for vazio, ou seja, sem nenhum elemento, este numero é zero.
Em string length é um método que retornar o numero de char na string. String não é um array de char. Cuidado com isso. String é um conjunto de codePoints. Para o alfabeto português dá quase no mesmo, mas não é verdade para todos os alfabetos.

Além disso “length” não é algo genérico que vc pode aplicar ao objeto x ou y como se fazia em VB 6. Todas as classes têm os seus métodos e o fato do nome ser igual não necessáriamente significa que é a mesma coisa.

Não. Os prefixo , set/get/is são usado para marcar propriedades. Propriedades são atributos da classe , mas nem todos os atributos são propriedades. Decidir se algo é propriedade ou não é que é o real desafio.
Internamente as propriedades podem ser guardas em variáveis privadas. Embora isso seja comum, isso não é obrigatório. Vc poderia usar uma mapa, por exemplo, para guardar esses dados.

Conceptualmente sim, no codigo não. No código vc tem que definir o método e colocar a palavra abstract na declaração. Se a classe tem pelo menos 1 método abstrato ela tem que ser definida com a plavra abstract tb. Contudo, uma classe pode ser declara abstract sem que tenha nenhum método abstrato.

Interfaces são contratos definidos pela assinatura dos métodos que se encontram nesse contrato (é um protocolo).
Interfaces são não especies de classes abstratas. Embora pareça que o efeito a nivel de codigo, compilação ,etc, é semelhante, conceptualmente são muito diferentes. Usar uma em vez da outra pode levar ao desastre.

Humm? Na realidade não deve usar protected em variáveis em lugar algum. Atributos devem sempre ser variáveis privadas.
portanto a sua pergunta não se justifica.

Não. O import é apenas para vc escrever menos. É uma ajuda para vc escrever apenas List e String em vez de java.util.List e java.lang.String a toda a hora. Import não é um mecanismo de importação, é apenas uma declaração das classes que está usado para que possa omitir os nomes dos pacotes.
Repare que se vc tiver duas classes com o mesmo nome, vc será obrigado a usar os nomes completos. Por exemplo java.awt.List e java.util.List

As duas opções não são excludentes. Na primeira vc está perguntando se Pist deve ter uma referencia ao autodromo, na segunda está perguntando como classificar pistas e definir propriedades do autodromo. Refaça a sua pergunta, porque assim não foi coerente.

[quote=ViniGodoy]Sim. Em java você usa o seguinte comando:

try { Thread.sleep(tempoEmMilisegundos); } catch (InterruptedException e) {}

[/quote]

Show!

Length é um método, não uma função. Num array, ele dirá a quantidade de elementos que o array tem. Na string, ele dirá a quantidade de chars que a string tem. Num Java2D.Line irá dizer o comprimento do segmento de reta. A String é uma classe e não necessariamente precisa ser representado por um array de chars (na verdade, a representação da string também envolve um encoding, que descreve como esses chars são traduzidos em letras). Para mais informações: http://www.guj.com.br/posts/list/32457.java#592987

Não, são usados quando as variáveis da classe não são public. Ou seja, se forem protected ou package private elas também não serão acessíveis. Entretanto, podem haver formas melhores de se manipular atributos do que os gets e sets.

Não, você também precisa declarar essa classe como abstract. E detalhe, uma classe abstrata pode ter todos os métodos definidos.

Sim, são apenas definições métodos, sem implementação. Mas elas não são classes abstratas pois elas apenas definem um contrato, um comportamento e não um tipo de dado. Essa diferença é sutil, mas por hora, apenas tenha em mente que a relação de uma classe com uma interface é muito mais leve do que a de uma classe com uma classe abstrata. Com a interface, você tem a certeza de que não existe e nunca existirá uma implementação. Além disso, você pode implementar mais de uma interface, enquanto é restrito a apenas uma única classe abstrata.

Para que elas sejam visíveis nas subclasses, como se fossem public. Outra alternativa é deixar as variáveis private e criar para ela métodos protected que as manipulam de maneira mais direta ou insegura.

Certo

[quote=thiago_258_]Definir uma classe autodromo e cada pista ser um objeto da mesma ou
Definir uma superclasse autodromo com as principais caracteristicas de um autodromo e classificar as pistas como subclasses ?[/quote]

Definir uma classe pista, e fazer com que um autodromo tenha um array de pistas.[/quote]

Parabens Viny!! Muito esclarecedor!! Guardei em minha anotações!

[quote=sergiotaborda]

length em arrays e length em String são coisas diferentes. Em arrays, length é uma constante public e estática. Não é um método. Ele contém o numero de elementos de array. Se o array for vazio, ou seja, sem nenhum elemento, este numero é zero.[/quote]

Está errado, no array o length mostra sempre a quantidade de instancias que o array suporta, independente de ter conteúdo ou não.

int array[] = new int[5]; System.out.println(array.length); //imprime 5, mesmo sem colocar nada no array.

[quote=mario.fts][quote=sergiotaborda]

length em arrays e length em String são coisas diferentes. Em arrays, length é uma constante public e estática. Não é um método. Ele contém o numero de elementos de array. Se o array for vazio, ou seja, sem nenhum elemento, este numero é zero.[/quote]

Está errado, no array o length mostra sempre a quantidade de instancias que o array suporta, independente de ter conteúdo ou não.

int array[] = new int[5]; System.out.println(array.length); //imprime 5, mesmo sem colocar nada no array.

[/quote]
Na verdade as duas coisas são equivalentes. Apesar de você não ter colocado nada explicitamente no array todos os arrays são inicializados preenchidos pelo valor padrão: zero em caso de números, false em caso de boolean e null em caso de objetos.

ai entrariamos numa discursão conceitual sobre o que é estar preenchido em um array. Pra mim valor padrão não conta, e se contasse, o array nunca estaria vazio, (continua não imprimindo zero), a não ser que vc inicializa-se ele com tamanho 0, o que tornaria o array inutil, certo? :twisted:

[]'s

[quote=mario.fts][quote=sergiotaborda]

length em arrays e length em String são coisas diferentes. Em arrays, length é uma constante public e estática. Não é um método. Ele contém o numero de elementos de array. Se o array for vazio, ou seja, sem nenhum elemento, este numero é zero.[/quote]

Está errado, no array o length mostra sempre a quantidade de instancias que o array suporta, independente de ter conteúdo ou não.

int array[] = new int[5]; System.out.println(array.length); //imprime 5, mesmo sem colocar nada no array.

[/quote]

Array vazio é um array sem elementos, ou seja, um array declarado assim

int array[] = new int[0];

O array tem elementos , mas esses elementos podem estar preenchidos ou não.
Com primitivos sempre o valor primitivo padrão é usado. com objetos é usado null.

O array ser vazio e os elementos serem vazios são coisas diferentes. É por isso que sempre ao retornar array em alguma método
se deve retornar um array vazio em vez de null.

A expressão “array vazio” diz respeito ao array em si e não aos seus elementos.

    [code]

List l = new ArrayList(5);
int array[] = new int[5];
System.out.println(array.length); //imprime 5, mesmo sem colocar nada no array.
System.out.println( l.size() ); //Use List, Array é muito primitivo
[/code]

Att,
Alison.