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

Gurzi

Juro que tento perceber, mas não consigo :P

42 mensagens neste tópico

Porque é que Java é tão complicado ???

alguem me explica o que isto realmente faz ?

class A { 
    int i; 
}

public class VarArgs{
    static void f(Object[] x){
      for(int i = 0; i< x.length; i++)
        System.out.println(x[i]);
        
    }
    
    public static void main(String[] args){
      f(new Object[] {
         new Integer(47), new VarArgs(),
         new Float(3.14), new Double(11.11) } );
         
         f(new Object[] {" one", "two" , "threee" } ) ;
         
        f(new Object[] { new A(), new A(), new A() } );
        
        }
        
        }
        

       

   

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Java não é complicado, tu é que insistes em tentar programar sem preceberes os conceitos, mas enfim, não és o único....

Dava algum jeito que começasses a dar nomes como deve de ser às variáveis. Um nome de uma variável tem de ser explicativo da sua função...

Ora bem.... isso deve escrever no standard outoup uma data de lixo... nomes de classes principalmente, referências para memória, coisas não muito inteligiveis... o que é que querias que isso fizesse?

Já agora, tens de perder a mania de fazer os métodos todos como estáticos, estar a detorpar o uso da palavra reservada...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Knitter, o problem é que não sou eu que faço isso, eu apenas estou a ler o "Thinking in Java , edition 2 " e só tento compeender, se tiveres algo melhor para eu ler, avisa, para não estar a perder o meu tempo!  :fartnew2:

o código que te dei, é o do livro

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

... se tiveres algo melhor para eu ler, avisa, para não estar a perder o meu tempo!  :fartnew2:

Eu não conheço esse livro mas quando comecei a dar Java o professor recomendou um livro chamado "Object first with Java", que ensina a programar em Java juntamente com um IDE disponibilizado em www.bluej.org.

Só depois é que passarias para o Netbeans, antes é necessário entender como funciona o Java.

Eu não cheguei a comprar esse livro, só dei uma olhadela e pareceu-me realmente muito bom. Agora tu é que sabes. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Addison Wesley - Java Programming Language Tenta este é o livro pessoalmente axo ke é o melhor livro para aprender java.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema não é o livro...

A questão é simples, tens de compreender POO ANTES de mexeres em código, tens de ter bases...

Se usas um ou outro livro, se usas um ou outro IDE isso não importa, tu é que tens de trabalhar... Se sabes programar em Java até o bloco de notas serve.

A ideia desse código é apenas criar uma função, neste caso "f", que recebe um vector de objectos e depois imprime no standard output esses mesmos objectos. Onde é que isto falha?... bem em lado nenhum, excepto que nos objectos que estão a ser passados não foi redefinido o método "toString" o que vai fazer com que o texto escrito não seja grande texto.

//Antiga classe "A"
public class IntegerWrapper {

    private int inteiro = 0;
    
    public IntegerWrapper(int inteiro) {
        this.inteiro = inteiro;
    }

    public String toString() {
        return "" + inteiro;
        //alternativamente poderia usar-se:
       // return String.parseInt(inteiro);
    }
}

public class VarArgs{
   
    //Construtor. Como a classe não tem atributos o construtor não precisa de fazer coisa alguma
    public VarArgs() {}

    //Antigo método "f"
    public void imprimir(Object[] vector) {
      
        for(int i = 0; i < vector.length; i++)
            System.out.println(vector[i]);
        
    }

    public String toString() {
        return "Classe \"VarArgs\"";
    }
    
    public static void main(String[] args){

        VarArgs temp = new VarArgs();

        //Para simplificar
        Object primeiroObjecto = new Object[] { new Integer(47), new VarArgs(), new Float(3.14), new Double(11.11) };
        Object segundoObjecto = new Object[] { new Object[] {" one", "two" , "thre" };
        Object terceiroObjecto = new Object[] { new IntegerWrapper(5), new IntegerWrapper(6), new IntegerWrapper(10)};

        temp.imprimir(primeiroObjecto);
        temp.imprimir(segundoObjecto);
        temp.imprimir(terceiroObjecto);
    }
}

Experimenta este código, tem em atenção que as duas classes têm de estar definidas em ficheiros diferentes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não me lembro se é String.parseInt() ou Interger.parseInt(), umas delas será mas esqueço-me sempre de qual é....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema não é o livro...

A questão é simples, tens de compreender POO ANTES de mexeres em código, tens de ter bases...

Se usas um ou outro livro, se usas um ou outro IDE isso não importa, tu é que tens de trabalhar... Se sabes programar em Java até o bloco de notas serve.

a parte de o IDE que usamos não importar até concordo, agora quanto ao livro não.

ele precisa de aprender de POO antes (ou pelo menos ao mesmo tempo) de aprender Java. se usar um livro que ensina apenas a linguagem Java não vai conseguir isso, e pior, vai apanhar maus habitos de programação.

mas existem livros que focam sobretudo a metodologia de programação orientada aos objectos, e se ele estivesse a usar um livro desses talvez não estivesse a cometer algumas das falhas que está a cometer.

se ele for aprender POO por um livro de má qualidade também não lhe vai servir de muito...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já mudei de book..

Este código percebo tudo menos a parte do super();

sei que super é para chamar o constructor da super classe mas que resultado vai fazer ??? OU seja o que vai acontecer ?

public class Bicycle {   // the Bicycle class has three fields 
  public int cadence; 
  public int gear; 
  public int speed; 
  // the Bicycle class has one constructor 
  public Bicycle(int startCadence, 
                 int startSpeed, int startGear) { 
    gear = startGear; 
    cadence = startCadence; 
    speed = startSpeed; 
  } 
  // the Bicycle class has four methods 
  public void setCadence(int newValue) { 
    cadence = newValue; 
  } 
  public void setGear(int newValue) { 
    gear = newValue; 
  } 
  public void applyBrake(int decrement) { 
    speed -= decrement; 
  } 
  public void speedUp(int increment) { 
    speed += increment; 
  } 
} 

A class declaration for a MountainBike class that is a subclass of Bicycle might look like this: 

public class MountainBike extends Bicycle { 
  // the MountainBike subclass has one field 
  public int seatHeight; 
  // the MountainBike subclass has one constructor 
  public MountainBike(int startHeight, int startCadence, 
                            int startSpeed, int startGear) { 
    super(startCadence, startSpeed, startGear); 
    seatHeight = startHeight; 
  } 
  // the MountainBike subclass has one method 
  public void setHeight(int newValue) { 
    seatHeight = newValue; 
  } 
} 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O super() invoca métodos da super classe. Ou seja, na classe Bicycle tens o seguinte método constructor:

public Bicycle(int startCadence, int startSpeed, int startGear) { .....

Depois invocas na sub-classe esse método através do super():

super(startCadence, startSpeed, startGear); 

Que te cria um objecto do tipo MountainBike

Também podes chamar outros métodos da super-classe com o super()

Exemplo:

super().speedUp(increment)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

porreiro, já percebi mas diz-me uma coisa

ao fazer :

super(startCadence, startSpeed, startGear) vou criar um objecto , e qual o nome dele? :x

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

porreiro, já percebi mas diz-me uma coisa

ao fazer :

super(startCadence, startSpeed, startGear) vou criar um objecto , e qual o nome dele? :x

O nome do objecto é dado pelo método toString(). Uns posts acima o Knitter faz referência a isso. :P Mas se continuares sem perceber diz...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como ainda estou a "adaptar-me" a isto dos objectos e classes , não percebi essa parte do toString() , podes me explicar melhor o resultado final do super ? ou seja ele vai buscar o constructor da superclasse e vai criar um objecto igual ao "default" daquela super classe ? como é atribuido o nome ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como ainda estou a "adaptar-me" a isto dos objectos e classes , não percebi essa parte do toString() , podes me explicar melhor o resultado final do super ? ou seja ele vai buscar o constructor da superclasse e vai criar um objecto igual ao "default" daquela super classe ? como é atribuido o nome ?

É assim, por default o nome dos objecto é uma cena marada tipo: "cnjfcnlerncerbcer" :P

Para que o nome do objecto seja aquilo que tu queiras tens de redefinir o método toString().

Exemplo:

public String toString() {
        return "Nome_do_objecto";
    }

Agora sempre que cries um objecto do tipo MountainBike, vai-se chamar "Nome_do_objecto".

Mas como criamos muitos objectos do mesmo tipo convém dar sempre um nome diferente. Por exemplo podemos criar um contador e incrementar cada vez que se crie um objecto, e aí o nome do objecto ía ser o numero do contador.

Exemplo:

private int contador = 0;

...incrementas o contador quando crias um objecto......

public String toString() {
        return contador;
    }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes ver a herança como construção por blocos. Quando constrois um objecto estas a reservar espaço para ele em memória, nesse sentido cada classe pai do objecto "ocupa" um pedaço de memória... isto é a zona de memória que o objecto ocupa é a soma das memórias necessárias pelas suas superclasses. Ao usares a palavra "super" vais aceder às caracteristicas da superclasse, sejam métodos ou atributos. Neste caso ao chamares o construtor da superclasse, através de uma chamada ao "super()" estás a criar parte deste objecto que corresponde à sua superclasse... ok isto talvez seja confuso, com um desenhito ia lá melhor :P.

Imagina que tens um objecto MyObject, que herda de Integer, ora a classe Integer tem um atributo inteiro que guarda o seu valor, como é que através da classe MyObject consegues indicar o valor correcto? Poderias usar um get(), ou um set(), conforme o caso, poderias indicar  o valor através de acesso directo, caso o atributo seja publico, ou então, da forma mais correcta, usas o construtor da superclasse para o fazer.

A criação de um objecto é feita em cascata, primeiro é criado um pedaço de memória correspondente à classe Object, a classe de topo, depois é criado e acrescentado um pedaço de memória correspondente à tua classe, caso ela não herde de mais ninguém. O Java faz isso por ti. Isto é, mesmo que não invoques o construtor da superclasse explicitamente, o compilador acrescenta SEMPRE uma chamada a um construtor sem argumentos e faz isso no início do teu construtor. Assim se tiveres o seguinte construtor:

public Construtor() {
   //código de iniciação de atributos
}

O compilador vai alterar o teu código para:

public Construtor() {
    super();
   //código de iniciação de atributos
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
É assim, por default o nome dos objecto é uma cena marada tipo: "cnjfcnlerncerbcer"

Isto é errado, o nome dos objectos é uníco e não interessa ao programador, aliás não pode ser alterado pelo programador.

O uso do método "toString", ou a sua redefinação neste caso, serve apenas para a mais fácil apresentação de objectos. Mas este método é de utilização reduzido. Normalmente é usado para debug. É claro que pode ser usado para o que bem enterdermos mas em 5 anos de java não o usei para mais que debug :P

"toString" é apenas um método que pretende devolver uma representação textual do objecto. No caso de não ser redefinido imprime o nomde do objecto e tenta imprimir as suas caracteristicas. Para veres como se não for redefinido não imprime coisas muito úteis, ou imprime coisas dificeis de compreender experimenta a seguinte linha dentro de uma qualquer função "main"

System.out.println(new GregorianCalendar());

Vais ver os anos, meses, dias, segundos, milésimos de segundo, etc, de um calendário com a data actual, nada de muito agradável de mostrar ao utilizador :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim eu sei disso tudo não me expliquei foi muito bem. :P

Aquilo das letras ("dendfhwbcfwrheukfhwr") foi só um exemplo. :)

Mas eu por acaso no ano passado com o Bluej e a trabalhar com grafos a redefinição do método toString() fez-me muito jeito pois quando criava um objecto desse tipo (via-se mesmo o vértice do grafo por exemplo) apareciam caracteres que eu nem ninguém percebia nada! :P Alterei para "Vertice1", "Vertice2", ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que tu alteraste foi apenas uma representação do objecto, não foi o nome dele, isso é que eu queria dizer que estava errado. Nunca um programador altera o nome do objecto. Além de que o nome de um objecto nada interessa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pela explicação.

Então quando eu fizer super(startCadence, startSpeed, startGear);

vai ser criado um objecto de nome random que vai á classe Bicycle e vai ter 3 atributos iguais ao da class Bicycle ?

Os valores que este objecto vai ter serão depois definidos dentro do main quando se fizer a chamada ao method com os respectivos argumentos ? :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando fizeres essa chamada ao super, a zona correspondente à superclasse vai ser criada com os valores que passares...

É como aquelas bonequinhas que se colocam umas dentro das outras, se considerares que cada boneca que está dentro é uma superclasse, até atingires a boneca mais pequenina que é a classe Object, então quando constróis uma boneca grande o java constroi todas as outras, no entanto apenas um objecto é criado, as bonecas pequenas fazem todas parte da grande.

Fiz-me entender? Não me perguntes é o nome das bonecas porque isso já è demais, até para mim :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pela paciência :P

Ist vai dar demorar a apreender :)

Vou ser eu que vou dar vida á secção Java  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma dúvida aqui muito básica pessoal..

Eu tenho várias classes mas nenhuma diz extends de nenhuma.. imaginem que tenho uma chamada Point e outra xx

eu na classse xx posso fazer por exemplo Point G = new Point() ;  Posso ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma dúvida aqui muito básica pessoal..

Eu tenho várias classes mas nenhuma diz extends de nenhuma.. imaginem que tenho uma chamada Point e outra xx

eu na classse xx posso fazer por exemplo Point G = new Point() ;  Posso ?

Podes. Pois vais estar a criar um objecto desse tipo, às vezes dá jeito. :P

O facto de ter ou não ter o "extends" nada tem a ver com a criação de objectos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um objecto não tem nome apenas hash.

Na implementação do toString da class Object o que aperece é NomeDaClasse@HashDoObjecto

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