Beraldo 864 Denunciar post Postado Dezembro 8, 2009 Estou tentando fazer herança com classes em diferentes arquivos, mas não estou conseguindo. O problema parece estar na importação da classe pai. Vejam a estrutura de diretórios e arquivos: . |-- PackTest.java `-- myLib |-- Funcionario.java `-- Pessoa.java Quero que Funcionarios seja uma classe herdeira de Pessoa, para que ambas sejam acessadas em PackTest. Fontes dos arquivos: Pessoa.java package myLib; class Pessoa { private String nome; private byte idade; public void setNome( String nome ) { this.nome = nome; } /*------------------------------*/ public void setIdade( byte idade ) { if ( idade > 0 && idade < 140 ) this.idade = idade; } /*----------------------------------*/ public byte getIdade() { return this.idade; } /*-------------------------*/ public String getNome() { return this.nome; } /*-------------------------*/ public String toString() { return ( this.nome + " | " + this.idade ); } /*----------------------------------*/ } Funcionario.java package myLib; import Pessoa; public class Funcionario extends Pessoa { private float salario; public void setSalario( float salario ) { this.salario = salario; } /*------------------------------*/ public float getSalario() { return this.salario; } /*-------------------------*/ public String toString() { return ( super.getNome() + " | " + super.getIdade() + " | R$" + this.salario ); } /*------------------------------*/ } PackTest.java import myLib.*; public class PackTest { public static void main( String args [] ) { Pessoa p1 = new Pessoa(); Pessoa p2 = new Pessoa(); Funcionario f1 = new Funcionario(); p1.setNome( "Beraldo" ); p1.setIdade( (byte)22 ); p2.setNome( "Tio Zé" ); p2.setIdade( (byte)42 ); f1.setNome( "João" ); f1.setIdade( (byte) 30 ); f1.setSalario( 780.00f ); System.out.println( "Nome da pessoa 1: " + p1.getNome() ); System.out.println( "Idade da pessoa 1: " + p1.getIdade() ); System.out.println( "Nome da pessoa 2: " + p2.getNome() ); System.out.println( "Idade da pessoa 2: " + p2.getIdade() ); System.out.println( p1.toString() ); System.out.println( p2.toString() ); System.out.println( f1.toString() ); } /*-----------------------------*/ } Consigo usar apenas Pessoa no PackTest sem problemas. O problema é compilar Funcionario.java. O Erro: $ javac Funcionario.java Funcionario.java:3: '.' expected import Pessoa; ^ Funcionario.java:3: ';' expected import Pessoa; ^ 2 errors Acho que é um simples erro no import. Já tentei com myLib.Pessoa e também não deu certo. :( Valeu Abraços, Beraldo Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Dezembro 8, 2009 Ou retire o import do Funcionario ou então importe assim: import myLib.Pessoa Como está no mesmo pacote não precisa importar. Os arquivos estão no mesmo diretório? Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 9, 2009 Ou retire o import do Funcionario ou então importe assim: import myLib.Pessoa Como está no mesmo pacote não precisa importar. Retirei o import (eu já havia testado sem import) e o erro persiste: $ javac Funcionario.java Funcionario.java:4: cannot find symbol symbol: class Pessoa public class Funcionario extends Pessoa ^ Funcionario.java:22: cannot find symbol symbol : variable super location: class myLib.Funcionario return ( super.getNome() + " | " + super.getIdade() + " | R$" + this.salario ); ^ Funcionario.java:22: cannot find symbol symbol : variable super location: class myLib.Funcionario return ( super.getNome() + " | " + super.getIdade() + " | R$" + this.salario ); ^ 3 errors Os arquivos estão no mesmo diretório? Sim. Estão no mesmo diretório (myLib) Compartilhar este post Link para o post Compartilhar em outros sites
Vergil 15 Denunciar post Postado Dezembro 9, 2009 As classes que estão no mesmo pacote não precisam de importação. Contudo, isso não causa problema na hora de compilar o projeto. O seu erro consiste em tentar estender (herdar) uma classe que não é pública. Declare a classe pessoa com acesso público. public class Pessoa {} Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 9, 2009 Modifiquei a classe Pessoa para pública, recompilei-a, mas o erro persiste. Será que estouc ompilando de forma errada? Basta executar isto? $ javac Funcionario.java Preciso definir onde está a classe Pessoa? Eu estava lendo a documentaçãoe encontrei a opção -classpath. Até tentei compilar desta forma: $ javac -classpath . Funcionario.java Funcionario.java:4: cannot find symbol symbol: class Pessoa public class Funcionario extends Pessoa ^ Funcionario.java:22: cannot find symbol symbol : variable super location: class myLib.Funcionario return ( super.getNome() + " | " + super.getIdade() + " | R$" + this.salario ); ^ Funcionario.java:22: cannot find symbol symbol : variable super location: class myLib.Funcionario return ( super.getNome() + " | " + super.getIdade() + " | R$" + this.salario ); ^ 3 errors E o erro persiste Devo estar fazendo babaquice... Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Dezembro 9, 2009 Fiz o teste e o javac não cria o diretório myLib. Faça o seguinte: javac -d "seu_diretorio" Pessoa.java javac -d "seu_diretorio" Funcionario.java Especificando o diretório onde será criada a classe, o javac cria os subdiretórios do pacote. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 9, 2009 Eu estava com a estrutura de diretórios montada corretamente, mas estava compilando de forma errada. Eu estava a entrando no diretório myLib para compilar. Não preciso fazer isso. O resultado é o seguinte: Minha estrutura de diretórios: $ tree . |-- PackTest.java `-- myLib |-- Funcionario.java |-- Pessoa.java Tendo essa estrutura montada, compilei da seguinte forma: $ javac -d . myLib/Pessoa.java $ javac -d . myLib/Funcionario.java $ javac PackTest.java $ java PackTest Tudo isso sendo executado no diretório base, ou seja, um acima de myLib. Assim deu certo! Valeu Abraços, Beraldo Compartilhar este post Link para o post Compartilhar em outros sites
Vergil 15 Denunciar post Postado Dezembro 9, 2009 Por essas e outras prefiro utilizar uma boa IDE pra que me auxilie nessas tarefas rotineiras. http://forum.imasters.com.br/public/style_emoticons/default/natal_wink.gif Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 9, 2009 Por essas e outras prefiro utilizar uma boa IDE pra que me auxilie nessas tarefas rotineiras. http://forum.imasters.com.br/public/style_emoticons/default/natal_wink.gif Usar IDE é bom, desde que você saiba fazer o que ela faz para você. Caso contrário, você fica dependente dela. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Dezembro 9, 2009 Entendi o que voce fez. Naquele caso, voce poderia usar o seguinte comando: javac -classpath "seu_diretorio" Funcionario.java "seu_diretorio" seria o diretório imediatamente acima do myLib. Sem o classpath ele buscaria a seguinte estrutura: $ tree . |-- PackTest.java `-- myLib |-- Funcionario.java |-- myLib |-- Pessoa.java Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 9, 2009 Ah, por isso que, quando eu compilava com -d dentro do myLib, era criado outro subdiretório myLib (apesar de o man dizer que -d não cria subdiretório :blink: ). Valeu Agora está mais claro. Eu estava usando -classpath de forma errada. Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Dezembro 9, 2009 Ah, por isso que, quando eu compilava com -d dentro do myLib, era criado outro subdiretório myLib (apesar de o man dizer que -d não cria subdiretório :blink: ). Na verdade com essa opção se os diretórios do pacote não existirem eles são criados. Ele não cria o diretório de destino. Esse deve existir se não o comando não funciona. Eu também costumo usar IDE, mas tive que estudar um pouco sobre os comandos javac e java. O problema é que a IDE te acostuma mal. :P Precisando estamos aqui. Abraço! Compartilhar este post Link para o post Compartilhar em outros sites