Java x Python

5 respostas
dntalemao

galera, estou usando na faculdade python na disciplina algoritmos, e agente sempre acaba fazendo analogia com outras linguagens quando aprendemos uma nova e como em java sou iniciante… enfim, minha dúvida é a respeito das chamadas de método, por exemplo:

em Java na importa se o código do método venha depois da chamada desse método:

public static void main (String [] args){
    teste();  //funciona normalmente.  


}

static void teste(){
//logic code here.

}

já em python

teste() #não funciona a chamada.

def teste():
    print("Olá")

Agora por que em java não importa a ordem? Sei que em python ele carrega em tempo de execução as funções, em java todas as “assinaturas dos métodos” são carregadas antes mesmo da sua execução de fato? :shock:

5 Respostas

J

Olá dntalemao

Estou verificando se entendi o que estudei e assim tentarei te responder.
Antes da JVM executar o .class este .class foi compilado pelo javac .java, e nessa compilação ele já pôs, vamos dizer assim, em ordem todas as referências encontradas. O que entendo faz que a resposta a sua pergunta seja: tanto faz a ordem (agora não sei se há alguma exceção ou exceções a esse tanto faz).

Abs.

E

O Java, diferentemente do Python ou do C++ ou do Pascal (Delphi), não impõe que tudo que vai ser usado já tenha sido definido antes.

Ele usa um esquema de compilação em “dois passos” que primeiro varre o programa para anotar os identificadores (e ver se algum deles está indefinido), e depois pega os indefinidos e os define - e é por isso que você pode se referir a métodos que ainda vão ser definidos na sua classe.

Embora o C++ também use múltiplos passos, a linguagem é muito mais complexa e o autor da linguagem optou por só poder usar alguma coisa (como um método ou classe) se ela tiver sido declarada (ainda que parcialmente). Um exemplo de coisas que você pode ter em C++ que não é necessário fazer em Java:

class X;
class Y {
public:
   X* getX() { ... }
};
class X {
    Y* getY() { .... }
}

Note neste caso que X depende de Y e Y depende de X. Java se vira para poder resolver esse problema de circularidade na hora da compilação, mas C++ depende de uma declaração incompleta (também chamada “forward” no caso do Pascal).

dntalemao

entanglement:
O Java, diferentemente do Python ou do C++ ou do Pascal (Delphi), não impõe que tudo que vai ser usado já tenha sido definido antes.

Ele usa um esquema de compilação em “dois passos” que primeiro varre o programa para anotar os identificadores (e ver se algum deles está indefinido), e depois pega os indefinidos e os define - e é por isso que você pode se referir a métodos que ainda vão ser definidos na sua classe.

Embora o C++ também use múltiplos passos, a linguagem é muito mais complexa e o autor da linguagem optou por só poder usar alguma coisa (como um método ou classe) se ela tiver sido declarada (ainda que parcialmente). Um exemplo de coisas que você pode ter em C++ que não é necessário fazer em Java:

class X;
class Y {
public:
   X* getX() { ... }
};
class X {
    Y* getY() { .... }
}

Note neste caso que X depende de Y e Y depende de X. Java se vira para poder resolver esse problema de circularidade na hora da compilação, mas C++ depende de uma declaração incompleta (também chamada “forward” no caso do Pascal).


Vamos ver se eu entendi o que vcs escreveram, então os métodos e as variáveis recebem esses identificadores antes mesmo deles serem utilizados? Como que um identificador pode ser indefinido?
obrigado

douglaskd
public static void main (String [] args){   
    teste();  //funciona normalmente.     
   
}   
  
static void teste(){   
//logic code here.   
  
}

teste().............como o entanglement explicou, ele pode ser considerado indefinido, por que não foi declarado antes do Main(), mas o java contorna esse problema fazendo em 2 passes, se tivesse que declarar tudo antes do main orientação a objetos seria um caos,

se você tentar compilar esse programa em C, ele da erro...se você jogar o static void teste().... para cima do main ai ele funciona, por que foi previamente declarado, em C para contornar esse problema existem os protótipos de funções...........ou seja, se pegar o programa acima e colocar somente: static void teste(); antes de main, e depois do main você declarar o resto do função teste(), ai o programa funciona....

imagine como se o java criasse esses protótipos automaticamente, fazendo uma varredura pelas assinaturas dos métodos......o processo é mais ou menos esse...

e imagine que o python use a mesma base do C...

dntalemao
douglaskd:
public static void main (String [] args){   
    teste();  //funciona normalmente.     
   
}   
  
static void teste(){   
//logic code here.   
  
}

teste().............como o entanglement explicou, ele pode ser considerado indefinido, por que não foi declarado antes do Main(), mas o java contorna esse problema fazendo em 2 passes, se tivesse que declarar tudo antes do main orientação a objetos seria um caos,

se você tentar compilar esse programa em C, ele da erro...se você jogar o static void teste().... para cima do main ai ele funciona, por que foi previamente declarado, em C para contornar esse problema existem os protótipos de funções...........ou seja, se pegar o programa acima e colocar somente: static void teste(); antes de main, e depois do main você declarar o resto do função teste(), ai o programa funciona....

imagine como se o java criasse esses protótipos automaticamente, fazendo uma varredura pelas assinaturas dos métodos......o processo é mais ou menos esse...

e imagine que o python use a mesma base do C...

legal, agora deu pra entender bem. valeu mesmo

Criado 13 de agosto de 2012
Ultima resposta 14 de ago. de 2012
Respostas 5
Participantes 4