Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

rippp

Problemas com variaveis Static

Mensagens Recomendadas

rippp

Boas pessoal,

Estou com um problema num exercicio que estou a resolver.

É o seguinte, tenho duas classes uma motor e outra carro. Na classe motor tenho um atributo potencia. Na classe carro tenho varios atributos e varios metodos sendo um deles o acelerar(). no acelerar acrescenta 10 cada vez que é chamado mas agora queria que ele acrescentasse 10 + motor.potencia.

O problema é que da um erro que diz que uma variar non-static n pode ter o valor de uma varialvel static. algo parecido ja experimentei de tudo e nao consigo aranjar isso.

Ja agora um off-topic. se tiverem exercicios interessantes gostava que me enviassem isso.

Abraço!!


Java, Android developerhttp://minimalcode.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Uma varíavel não estática pode ter o valor de uma variável estática... o erro não será que uma variável não estática não pode ser acedida de um contexto estático?

Podes colocar o código que tens? Parece-me que tens uma variável de instância e que estás a aceder a essa variável através de um método estático, o que é um erro, uma variável não estática não pode ser usada dentro de métodos ou blocos estáticos.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rippp

Aqui vai o.

no velocidadeactual  += 10 queria adicionar + motor.potencia*0.1

Class carros

class Carros {
private Integer numeroIdentificacao;
private Double velocidadeMaxima = 100.0;
private Double velocidadeActual = 0.0;
        private Piloto piloto;
        private Motor motor;

void Ligar(){
System.out.println(" WWrrruumm ");
}

void Desligar(){
System.out.println("mmmmmmmm...");
}

void Acelerar()
{
       velocidadeActual += 10;
       if(velocidadeActual > velocidadeMaxima)
       {
               velocidadeActual = velocidadeMaxima;
       }
       System.out.println(velocidadeActual);
}

void Frear(Integer intensidadeFreada)
{
       if(intensidadeFreada > 100)
       {
               intensidadeFreada = 100;
       }else if(intensidadeFreada < 0)
       {
               intensidadeFreada = 0;
       }
       velocidadeActual -= intensidadeFreada*0.25;
       if(velocidadeActual < 0)
       {
               velocidadeActual = 0.0;
       }
}
public Integer setnumeroIdentificacao(){
    return numeroIdentificacao;
}
public void setNumeroIdentificacao(Integer numeroIdentificacao) {
       this.numeroIdentificacao = numeroIdentificacao;
}
public Piloto getPiloto() {
       return piloto;
}
public void setPiloto(Piloto piloto) {
       this.piloto = piloto;
}
public Double getVelocidadeAtual() {
       return velocidadeActual;
}
public Carros(Integer numeroIdentificacao) {
       this.numeroIdentificacao = numeroIdentificacao;
       }
public double getvelocidadeMaxima(){
    return velocidadeMaxima;
}
public void setvelocidadeMaxima(Double velocidadeMaxima){
    this.velocidadeMaxima = velocidadeMaxima;
}
}

class motor

public class Motor {
    protected Integer potencia;
    Carros Carros;

    public Integer getpotencia(){
        return potencia;
    }
    public void setpotencia(Integer potencia){
        this.potencia = potencia;
    }

    void verPotencia(){
        if(potencia < 0){
            System.out.println(0);
        }
        if(potencia > 100){
            System.out.println(100);
        }
        else
            System.out.println(potencia);
    }
}


Java, Android developerhttp://minimalcode.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

O código que tens não provoca qualquer erro, e podes, no método Acelerar, colocar a alteração que pretendes. Não estará correcto, dentro do que é programação orientada a objectos, mas irá funcionar.

Deixando um comentário ao código, não deves usar o modificador protected dessa forma, nem aceder a variáveis sem utilizar os métodos de acesso correctos. Os nomes dos métodos em Java, escrevem-se em minúsculas, para não se confundirem com nomes de classes. E tens algum motivo especial para usares os tipos wrapper Integer, Double, etc em vez do tipo primitivo int, double, etc?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rippp

o codigo que eu pus aí nao tem erro nenhum. agora se tentarem por

void  Acelerar()
{
       velocidadeActual += 10 + [b]motor.potencia[/b];
       if(velocidadeActual > velocidadeMaxima)
       {
               velocidadeActual = velocidadeMaxima;
       }
       System.out.println(velocidadeActual);
}

assim é que da erro.

Quanto as maiusculas e minusculas ainda nao estou a 100% ainda me confundo um pouco. quanto aos tipos nao tenho motivo nenhum, estava a seguir um exercicio de um tutorial e eles tinham la assim.

Gostaria que me explicasse o porque de dizer isso ao metodo protected.

(vim do php e em php e uma jabardisse completa), mas estou a adorar java, ja tava para começar a algum tempo e nao me arrependo nada de ter começado agora, arrependo-me de nao ter começado antes.


Java, Android developerhttp://minimalcode.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Onde é que te é mostrado o erro? Quando executas ou quando tentas escrever esse código? Estás a usar que versão de Java?

Não há motivo nenhum para, com o código que colocaste, te estar a dar um erro relacionado com variáveis estáticas dado que não estás a usar variáveis estáticas e lado nenhum nem métodos estáticos. Pelo menos na versão actual do Java, nas versões anteriores, eventualmente podias ter problemas com o uso dos tipos wrapper mas neste caso duvido que seja isso.

Em POO tens o conceito de encapsulamento, que de forma rápida, diz que deves esconder os detalhes internos de cada objecto dos restantes objectos e expor apenas o que é necessário através de métodos de acesso. Como regra genérica, todos os atributos devem ser privados, e devem ter métodos de acesso, os típicos getters e setters. Não devem existir atributos públicos e os protected devem ser evitados porque, no fundo, são atributos públicos disfarçados.

Isto, claro, é uma regra prática, na realidade, há necessidade de se usarem atributos públicos, se bem que até agora só vi essa necessidade em variáveis estáticas, e nunca nas restantes, e os atributos protegidos até podem ser necessários mas raramente encontrei uma situação onde a necessidade fosse real e não apenas preguiça do programador.

O problema de atributos públicos e de atributos protegidos é que podem ser acedidos livremente por outros objectos e modificados sem qualquer respeito pelas regras internas do objecto, podes colocar lá valores que, em situações normais, seriam impossíveis de existir. Por isso é que se usam métodos de acesso, que permitem esconder a implementação interna e garantir que os valores das variáveis estão sempre num estado correcto. E ajudam a que os objectos sejam mais modulares.

No exemplo que tens, seria mais correcto fazer:

    void Acelerar() {
        velocidadeActual += 10 + motor.getpotencia() * 0.1;
        if (velocidadeActual > velocidadeMaxima) {
            velocidadeActual = velocidadeMaxima;
        }
        System.out.println(velocidadeActual);
    }

O resultado pode parecer o mesmo, na verdade estamos das duas maneiras a aceder ao valor da potência do motor, mas usando o método de acesso e passando a variável potencia de protected para private, garantimos que não podem, por erro ou por intenção, alterar os valores da potência para valor inválidos. Assumindo que o método set faz as protecções devidas :).

Existe muito a tentação de se usarem atributos protegidos para escrever menos código e porque, com atributos protegidos, só as subclasses e as classes do mesmo package é que têm acesso directo, classes de outro package não terão, mas isso é um erro porque é fácil transformar uma variável protegida numa variável pública, por exemplo, criando um método público que devolva a variável, e assim, todas as classes podem ter acesso à dita variável.

Podes ver um tutorial, +/- completo na wiki do P@P, bem como outros tutoriais com utilização de Java:

http://wiki.portugal-a-programar.org/java:tutorial:00_home

http://wiki.portugal-a-programar.org/java:convencoes_linguagem

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rippp

ok ok mais uma vez obrigado pela ajuda do forum que é sempre preciosa.

O erro da quando eu tento executar o programa.

Ja agora o Netbeans 6.8 nao aceita o tipo int so integer. nao sei porque.


Java, Android developerhttp://minimalcode.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Coloca o código todo que tens, senão estou sempre a tentar adivinhar. Podes usar o pastebin do P@P se for muito código, http://paste.portugal-a-programar.org/

Não aceitar int? Vou supor que estás a escrever Int, com a maiúscula no início em vez de int, tudo em minúsculas, daí não aceitar... ou então estás a tentar fazer contas entre tipos primitivos e tipos wrapper de uma forma ilegal. Mas suponho que seja mais o primeiro problema :)

Como é que estás a aprender Java?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rippp

como é que estou a aprender java como assim ? Por exemplo estou agora a fazer um programa que (por enquanto tem tres classes) uma programa, uma login e uma sqlConnect. no programa pergunta os nomes e pass, o login recebe e vai buscar um metodo da class sqlconect para autenticar.

Eu tou a aprender sozinho, ja sabia C e bastante php. Secalhar apredendo sozinho nao estou a aprender da melhor maneira, mas vou aprendendo o que é importante, e para tar a ir as escolas tirar formações nao tenho possibilidade por enquanto.

Acho que me estou a desenrascar mais ou menos bem sozinho. Por isso é que tinha pedido exercicios se tivessem exercicios porreiros.

Ah e tou a estagiar na Aleluia ceramicas e o Eng daqui ajuda-me sempre que preciso, se bem que ainda não precisei da ajuda dele no java. Ele deu-me umas luzes de Vb.net porque tive que lhes fazer um programa mas detestei aquilo. Quanto ao java estou a adorar.


Java, Android developerhttp://minimalcode.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Só perguntei para saber se estavas a aprender por estares num curso ou se estava a aprender sozinho por algum tutorial ou alguma coisa.

Se estás a aprender sozinho, vê o tutorial da wiki, embora não tenha tudo tem já bastante informação importante e que pode ser uma boa base, especialmente a parte de POO que é muito importante para se usar correctamente Java, senão corres o risco de saber a sintaxe mas teres programas que, embora funcionem, não o fazem da melhor forma.

Na página de Links do tutorial da wiki estão também alguns links que podes seguir, especialmente o tutorial da Sun que é muito bom para quem já tem bases de programação e quer conhecer a linguagem.

Já agora, o problema dos ints, sempre era a maiúscula? Ou já está resolvido?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rippp

era da maiuscula :)

Ja agora uma ultima pergunta.

para saber se a pesquisa existe ou nao, no mysql, em php tinha o affected_rows aqui no java ja vi que tenho o resultset.wasnull(). so que o problema é que ele devolve sempre o mesmo valor, quer existe a linha que tou a procura quer nao exista.

resolvi isso assim:

  String sql = "SELECT count(*) FROM teste where id=1";
               ResultSet rs = stmt.executeQuery(sql);
                rs.next();
                int count = rs.getInt(1);
               //Percorrendo o ResultSet e obtendo os valores do banco
                  if( count == 0){
                   System.out.print("errado");
               }
               else
                   System.out.print("certo");


Java, Android developerhttp://minimalcode.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rippp

Sim eu ja sabia como ir buscar dados, so queria saber era como confirmar se existe uma determinada linha mas tambem ja ficou ontem a funcionar. Muito obrigado pela ajuda .

Mais uma vez peço que se alguem tiver um exercicio porreiro com um manual e tal que me mande isso :) ficarei mesmo muito agradecido! java ou java+swing :D e se tiver Bd a mistura.. :)


Java, Android developerhttp://minimalcode.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

  • Existir forma de confirmar até existe, mais ou menos. Por partes:
    • O método wasNull() não te devolve o número de linhas nem te diz se o resultSet está vazio. O que o método te diz é se o último valor a que acedeste é do tipo SQL NULL. O que implica que tens de aceder a um campo antes de invocares este método.
    • Em JDBC e com ResultSets tens de primeiro invocar o método next() para iniciares a pesquisa porque o ResultSet tem um ponteiro que aponta para antes da primeira linha. Isto é, quando é criado não está a apontar para o primeiro resultado, está a apontar para uma posição imediatamente antes, daí a primeira coisa que se faz com um resultSet ser invocar o método para avançar para o próximo registo, que no início é o primeiro. Isto implica que usar o método wasNull() não ajuda para o que estavas a tentar fazer.
    • Um SELECT COUNT(*) não devolve o valor NULL, devolve zero resultados, novamente o wasNull() não dá, porque não tens resultado para ver se foi NULL.
    • A API JDBC é dependente do driver e da implementação exacta que extás a usar, bem como da versão que estás a usar. O JDBC está actualmente na versão 4 mas muitos drivers não suportam toda a versão 4, alguns nem a 2 suportam. O que implica que alguns métodos até podem existir e ser úteis, mas se o driver que estás a usar não os suportar ou não tens resultados ou tens resultados inesperados.
    • O ponto acima leva-nos ao problema de contar o número de linhas, e para isso tens várias formas:
      • O ResultSet tem um método para saberes o número da linha onde estás, ora também tem métodos para percorrer as linhas de forma arbitrária. Portanto, se pegares num resultSet, avançares até à última linha com o método last() e depois usares o método getRow() para saberes em que linha estás, tens o número de linhas do resultSet. Isto funciona porque os números são baseados em 1, e não em 0, a primeira linha é a row 1, e assim por diante. Depois de saberes o número de linhas podes simplesmente invocar o método first() e usar o resultSet normalmente.
        O problema desta abordagem é que implica que, quando criares o ResultSet o faças indicando que o mesmo é navegável, é um dos parâmetros do createStatement se não me engano, ou do execute... um deles. Se não o fizeres vais obter excepções quando tentares voltar ao início do resultSet. Implica também que o driver suporte navegação e que a BD suporte navegação. Quanto a drivers há muitos que não suportam, a nível de bases de dados, acho que todas suportam, só vi problemas em MS Access, mas MS Access não se pode chamar uma BD :).

      [*]Podes contar o número de registos com uma query separada. Executas um SELECT COUNT(*) para a query que pretendes usar, acedes ao valor devolvido de forma normal

if(rs.next()) total = rs.getInt(0);


  • Não dá para queries que devolvam escalares, mas funciona em todas as outras.
  • Podes fazer a query duas vezes e numa contar o número de linhas

while ( rs.next() )  {  linhas++;  } 


    • Implica duas pesquisas à BD algo lentas.
    • Podes devolver o ResultSet para uma estrutura genérica que tenha um método size() e usá-lo para aceder ao número de registos.

Como vês, alternativas não faltam :D, pessoalmente, se o driver suportar navegação, então usar o método getRow() é melhor, senão, opto por fazer duas queries, uma com um SELECT COUNT e outra com a query que quero executar, que só executo se a anterior devolver mais que zero.

Quanto a ideias para aplicações, posso deixar algumas que fiz durante o curso:

  • Jogos usando Swing: Campo Minado, Tetris, Sokoban. Permite o uso de vários componentes Swing, a utilização de event listeners, models e renderers diferentes. Algo muito comum quando se trabalha com Swing.
  • Aplicações de gestão: Gerir alunos, gerir contactos( agenda), gestão de um hotel, gestão de filmes, livros, etc. Podes assim usar um mecanismo de persistência (BDs relacionas, BDs objectos, ficheiro de texto, serialização, XML, etc.
  • Cliente e servidor de IM. Implementa um sistema de chat simples, com servidor e cliente. Usas sockets, threads e Swing.
  • Aplicação para gerir árvore genealógica. Usas Swing, uma persistência qualquer e precisas de desenhar os teus próprios componentes Swing bem como interacções mais complexas de rato.

Só para acrescentar mais umas : Cliente de Twitter, Editor de Texto com correcção sugestão de erros/correcções, cliente para um qualquer serviço disponível na Web (por exemplo serviços de meteorologia, de notícias, etc. desde que use webservices )

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rippp

ok ok.

Mais uma vez uma grande ajuda por parte do pessoal do forum. :D

Vou seguir essas ideias e mesmo começar pelo campo minado que por enquanto parece-me ser o mais acessivel visto o que eu sei. :)

Cumprimentos e muito obrigado


Java, Android developerhttp://minimalcode.net

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.