Problema com a classe main...[RESOLVIDO]

Fala galera, estou tendo um probleminha compilar a seguinte classe main:

public class Teste {  
    
	 public static void main(String args[])
	 {
	 	Pessoa p = new Pessoa("Evander");
		int idade = v.getIdade();
		String nome = p.getNome();
		
		Funcionario f = new Funcionario("Mike Tyson");
		int salario = f.getSalario();
		String cargo = f.getCargo();
		
		FuncAposentado fa = new FuncAposentado();
		int slrAposenta = fa.getSlrAposenta();
	}
}

É exibido o seguinte erro, mas não consegui decrifrar oque isso quer dizer ao certo…

“Teste.java:6: error: no suitable constructor found for Pessoa(String)
Pessoa p = new Pessoa(“Evander”);
^
constructor Pessoa.Pessoa(String,String,int) is not applicable
(actual and formal argument lists differ in length)
constructor Pessoa.Pessoa() is not applicable
(actual and formal argument lists differ in length)”

Alguem saberia me explicar oque acontece ?

abs,

Pode mostrar o código da classe pra avaliar melhor?

Você provavelmente não tem um método construtor na sua classe Pessoa que receba uma String como parâmetro…

você precisa criar um :slight_smile:

Na sua classe pessoa esta faltando o construtor que receba uma string …

public class Pessoa
{
	protected String nome, sobrenome;
	protected int idade;
	
	/* Métodos Construtores */
	
	public Pessoa()
	{
		setNome("Evander", "Holyfield");
		setIdade(0);
	}
	
	public Pessoa(String n, String s, int i)
	{
		setNome(n,s);
		setIdade(i);
	}
	
	/*Métodos set */
	
	public void setNome(String n, String s)
	{
		nome = n;
		sobrenome = s;
	}
	
	public void setIdade(int i)
	{
		idade = (i > 0? i : 0);
	}
	
	/*Métodos get */
	
	public String getNome()
	{
		return nome + " " + sobrenome;
	}
	
	public int getIdade()
	{
		return idade;
	}
	
	/*Método toString */
	
	public String toString()
	{
		return "Nome: " + nome + "\nSobrenome: " + sobrenome + "\nIdade: " + idade;
	}
}

A classe pessoa ai…

você não tem nenhum método construtor que receba só uma string

digao, como assim só uma string ? Eu acho que entendi oque vc quis dizer, mas na vdd não entendi…

Você está inicializando uma pessoa passando como parâmetro um nome

Pessoa p = new Pessoa("Evander");

Mas na sua classe Pessoa, você não possui nenhum construtor que receba só o nome, algo como

public Pessoa(String nome) { this.nome = nome }

public Pessoa(String nome) { this.nome = nome; }

Victor, construtores em Java, são os caras que são chamados quando criamos um novo Objeto, porém construtores são métodos, só que:

1 - Precisam ter exatamente o mesmo nome da classe que criam;
2 - Não possuem tipo; (ressalto que aqui é diferente de void, void é um tipo)

Se você está criando uma pessoa da seguinte forma:new Pessoa("Evander");Perceba que na chamada do método Construtor você passa uma Strring como parâmetro.

Quando revisamos sua classe Pessoa, se você bem reparar, verá que não existe nenhum método construtor assinado desta forma: public Pessoa(String nome) { this.nome = nome; }Então quando você tenta criar um objeto chamando um construtor que aceite um parâmetro, cuide que exista um método construtor que receba um parâmetro do tipo igual ao que você está passando. Lembrando que igual nesse caso também envolve polimorfismo, ou seja, o parâmetro pode ser igual ou um subtipo do tipo esperado.

espero ter ficado claro.

Abs []



public Pessoa(String n, String s, int i)
	{
		setNome(n,s);
		setIdade(i);
	}

Galera, não sei se tem alguma coisa a ver, mas eu estou usando o super pra esses parametros ai nas outras classes, ficou claro a explicação de vcs, porém eu não sei agora como implemento…e esse construtor a cima está na classe Pessoa…

Amigo adriano_si

Diferentemente do que disse construtores NÃO são métodos, pois métodos podem ser usados depois da criação do objeto, o Construtor só é chamado na hora da construção do objeto para dar possibilidade ou obrigar o usuário a passar parametros da classe na hora da criação do objeto, por isso construtores não possuem tipo e dever ter necessariamente o nome da classe como você mesmo já disse

Olá victorrgds,

Se eu entendi bem você está com dificuldade de entender construtores, mas este contrutor você só vai utilizar se tiver os valores tipo:

public static void main(String[] args) {
		String nome = "Victor";
		String sobrenome = "AlgumaCoisa";
		int idade = 20;
		
		Pessoa pessoa = new Pessoa(nome,sobrenome,idade);
		System.out.println(pessoa);

Caso contrario você tem que passar o valores que você tem ou usar um construtor default.

Era essa a sua dúvida??

victorrgds

na sua classe onde contem o método main

na hora de criar a classe você já passa os parametros tipo

Pessoa pessoa = new Pessoa("José", "João", 20);

sua classe Pessoa esta mais ou menos certa mas deve indicar os paramtros para as váriaveis tipo

[code]class Pessoa{

String nome1;
String nome2;
int idade;

public Pessoa(String nome1, String nome2, int idade){

this.nome1 = nome1;
this.nome2 = nome2;
thiis.idade = idade;
}[/code]

bom como eu vou sair do trabalho agora, vou postar oque pediu para ser feito e oque eu fiz, acompanharei pelo celular…

Dadas as classes ?Pessoa?, ?FuncionarioAposentado? e ?Funcionario?, sabendo que existem os
atributos ?salario?, ?salarioAposentadoria?, ?nome?, ?idade? e ?cargo? e sabendo que o método
?categoria?, dado abaixo, pertence à classe ?Funcionario?, pede-se:
a) Construa o Diagrama de Classes UML;
b) Construa as classes em Java, lembrando de considerar construtores e incluir alguns métodos,
implementando pelo menos um encapsulamento;
c) Monte um programa de acesso;
d) Modifique o código para quem seja implementado o Polimorfismo.
Dado o método ?categoria?:
public int categoria()
{
if( idade > 20)
{
return 30;
}
else
{
return 10;
}
}

Classe Funcionario

public class Funcionario extends Pessoa
{
	protected double salario;
	protected String cargo;
	
	/* Métodos Construtores */

	public Funcionario()
	{
		setSalario(0);
		setCargo("Engenheiro");
	}
	
	public Funcionario(String n, String s, int i, double sl, String cg)
	{
		super(n,s,i);
		setSalario(sl);
		setCargo(cg);
	}
	
	/*Métodos set */
	
	public void setSalario(double sl)
	{
		salario = (sl > 0.00 ? sl : 0);
	}
	
	public void setCargo(String cg)
	{
		cargo = cg;
	}
	
	/*Métodos get */
	
	public double getSalario()
	{
		return salario;
	}
	
	public String getNome()
	{
		return nome+" "+sobrenome;
	}
	
	public String getCargo()
	{
		return cargo + " ";
	}
	
	public int categoria()
	{
		if( idade > 20)
		{
			return 30;
		}
		else
		{
			return 10;
		}
	}
	
	/*Método toString */
	
	public String toString()
	{
		return "Nome: "+nome+"\nSobrenome: "+sobrenome+"\nIdade: "+idade;
	}
}

Classe FuncAposent

[code]public class FuncAposentado extends Pessoa
{
protected double slrAposenta;

/* Métodos Construtores */

public FuncAposentado()
{
	setSalarioAposenta(0);
}

public FuncAposentado(String n, String s, int i, double sa)
{
	super(n,s,i);
	setSalarioAposenta(sa);
}

/*Métodos set */

public void setSalarioAposenta(double sa)
{
	salarioAposent = (sa > 0.00 ? sa : 0.00);
}

/*Métodos get */

public double getSalarioAposenta()
{
	return salarioAposent;
}

/*Método toString */

public String toString()
{
	return "Aposentado: " + super.toString() + "\nSalario do aposentado: " + salarioAposent;
}

}[/code]

a classe pessoa que postei a cima e a classe main:

[code]public class Teste {

 public static void main(String args[])
 {
 	
	String saida = "";
	
	Pessoa p1 = new Pessoa();
	Pessoa p2 = new Pessoa("Evander", "Holy");
	int idade = p2.getIdade(21);
	String nome = p2.getNome("Marcelino", "Popó");
	
	saida += "Pessoa 1: " + p1.toString() + "\nPessoa 2: " + p2.toString();
	
	Funcionario f1 = new Funcionario();
	Funcionario f2 = new Funcionario("Maguila");
	int salario = f2.getSalario(2000);
	String cargo = f2.getCargo("Lutador");
	
	saida += "Funcionario 1: " + f1.toString() + "\nFuncionario 2: " + f2.toString();
	
	FuncAposentado fa1 = new FuncAposentado();
	FuncAposentado fa2 = new FuncAposentado("Iceman");
	int slrAposenta = fa.getSlrAposenta(1000);
	
	saida += "Aposentado 1: " + fa1.toString() + "\nAposentado 2: " + fa2.toString();

	// Exibindo dados dos objetos
	
	JOptionPane.showMessageDialog(null, saida, "Teste",
	JOptionPane.INFORMATION_MESSAGE);
	
	saida = "Lista\n\n" +
		p1.getNome() + " " + p1.getIdade() + " " +
		"\n" + p2.getNome() + " " + p2.getIdade() + " ";
		

}

}[/code]

essa classe main na verdade eu tava tentando fazer uma loucura ai e parei…por favor se alguem puder me ajudar ficarei mto agradecido…

Amigo adriano_si

Diferentemente do que disse construtores NÃO são métodos, pois métodos podem ser usados depois da criação do objeto, o Construtor só é chamado na hora da construção do objeto para dar possibilidade ou obrigar o usuário a passar parametros da classe na hora da criação do objeto, por isso construtores não possuem tipo e dever ter necessariamente o nome da classe como você mesmo já disse
[/quote]

Perfeito Guike… relí com calma o que eu postei e você está correto… Já havia entrado em uma discussão dessa há um tempo atrás e realmente o conceito de método como conhecemos não se aplica a construtores…

Eles são métodos, mas não são métodos, entendeu ???

Valeu pela chamada de atenção cara.

Abs []

Primeiro de tudo a classe Pessoa num pode ser a main pois ela vai servir como efeito de poliformismo que foi pedido, todo funcionario e/ou funcionario aposentado é uma pessoa então devemos começar criando a classe Pessoa, repare que na classe Pessoa não exite o atributo cargo muito menos salario, pois quem tem o cargo e salario é um Funcionário e não uma Pessoa.

onde:

public class Pessoa {
	
	protected String nome;
	protected int idade;
	
	//construtor que inicializa as variaveis nome e idade
	public Pessoa(String nome, int idade){
		this.nome = nome;
		this.idade = idade;
	
	}
	
	//metodos que retornam os valores das variaveis nome e idade
	public String getNome(){
		return this.nome;
	}
	
		
	public int setIdade(){
		return this.idade;
	}

}[/code]

depois deve se criar uma classe Funcionario que é uma Pessoa, e então criar o atributo cargo e salario mas nao o de salario aposentado

onde existe o método categoria modificado para receber o efeito Poliformismo

[code]public class Funcionario extends Pessoa {
	
	protected String cargo;
        protected double salario

	public Funcionario(String nome, int idade, String cargo) {
		super(nome, idade);
		this.cargo = cargo;
		
	}

        public void setSalario(double valor){
		this.salario = valor;
	}

	//metodo categoria recebendo o efeito poliformismo onde parte-se do principio de qualquer funcionario ou funcionario aposentado é uma pessoa e possua uma idade
	public int categoria(Pessoa pessoa){
		if(pessoa.idade > 20){
			return 30;
		}
		else{
			return 10;
		}
	}
	

}[/code]

e então cria-se uma classe de Funcionario Aposentado que é um Funcionario sendo assim uma Pessoa


[code]public class FuncionarioAposentado extends Funcionario {

		protected double salarioAposentadoria;
		
	public FuncionarioAposentado(String nome, int idade, String cargo) {
		super(nome, idade, cargo);
	}
	
	void salarioAposentadoria(double valor){
		this.salarioAposentadoria = valor;
	}

}[/code]

por ultimo cria-se um Programa com uma classe main para testar seu programa

[code]public class Programa {
	public static void main(String[] args) {
		
//veja que criei um Funcionario Aposentado
		FuncionarioAposentado fa = new FuncionarioAposentado("José", 80, "T.I");
		
		fa.salarioAposentadoria(2000);
//o método categoria está implementado na classe Funcionario que recebe como parametro uma Pessoa que pode ser um Funcionario Aposentado ou um Funcionario. Quem implementou a classe Funcionario com o método categoria passando como Poliformismo(Pessoa pesso) por exemplo nunca imaginou que poderia chegar mais tarde um Funcionario Novo, ou um Gerente que também é um funcionario que no fim é uma Pessoa		
		System.out.println(fa.categoria(fa));
	}
}

ficou claro agora?

[quote]Perfeito Guike… relí com calma o que eu postei e você está correto… Já havia entrado em uma discussão dessa há um tempo atrás e realmente o conceito de método como conhecemos não se aplica a construtores…

Eles são métodos, mas não são métodos, entendeu ???

Valeu pela chamada de atenção cara.

Abs [][/quote]

Que isso adriano_si a comunidade é para isso mesmo, o conceito de Construtor é bem complicado de se enteder e muito mais de se explicar, isso me confudiu bastante também, e confunde muito quem está aprendendo por exemplo nosso amigo que abriu o tópico, pois ele parece ser um método por ter comportamentos iguais, mas que não é

abraços!!

Cara, eu o vendo pelo iphone aqui, mas msm assim consegui entender, porem gostaria de fazer umq pergunta, comparando o seu codigo com o meu, deixando de lado a classe main, tem mta diferença? To no “caminho certo”?

É que to buscando aprimorar cada dia mais o java e gosto de receber criticas construtivas…

Pude perceber que tbm falhei no polimorfismo do metodo categoria…

Abs e obrigado!

Olhei um pouco mqis detalhado aqui, me perdoe se estiver errado, mas eu nao identifiquei uma sobreposiçao de metodo…;(