Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Beraldo

[Resolvido] Herança com classes em diferentes arquivos

Recommended Posts

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

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

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

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

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.