Ajuda para entender Codigo

Ola pessoal, acabei de entrar no Forum, sou iniciante em Java, estou tentando resolver esse exercicio, mas nao consigo, eh dado o main dele e a partir disso tenho que fazer as outras classes de tal maneira que o main funcione, ja fiz alguma coisa, mas ainda nao eh o bastante, devido a minha inexperiencia.

OBS: Uso Eclipse.

Main:


public class Principal {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Editora oreilly = new Editora("O'Reilly", "http://oreilly.com/");
		String [] autores = {"Eric Freeman", "Elisabeth Freeman"};
		Publicacao headfirst = new Livro("Padrões de Projeto",
		"Programação", "2a", oreilly, autores);
		Editora tres = new Editora("Editora Três", "http://editora3.terra.com.br/");
		Publicacao oracle = new Revista("Isto É", "Notícias", "2279",
		tres, "semanal");
		System.out.println("O'Reilly: " + oreilly.getNumPubs());
		

	}

}

Fiz a classe Editora, primeiro erro a ser reclamado:


public class Editora {
	
	String nome;
	String site;

	public Editora(String nomeEd, String siteEd) {
		// TODO Auto-generated constructor stub
		nome = nomeEd;
		site = siteEd;
	}
	

}

A partir dai eh que veio o problema… Me deparei com o proximo erro no Main:


Publicacao headfirst = new Livro("Padrões de Projeto",	"Programação", "2a", oreilly, autores);

Pesquisei sobre e vi que se trata de uma Interface, que “Publicacao” eh uma interface e que “Livro” vai implementar essa Interface, mas nao entendi muito bem para que serve. E por enquanto essa eh a minha duvida, pois fiz a Interface assim:


public interface Publicacao {
	

}

Mas eu nao entendi o conceito de Interface, sao metodos que preciso declarar em seu escopo e onde cada clase que implementar essa interface tera que sobescrever o metodo da Interface? Alem disso, nao entendo pq um Array autores eh usado como atributo na classe Livro.

Gente, desculpa a ignorancia, mas fiquei perdida… Nao quero que coloquem a resposta para mim, vou continuar desenvolvendo isso, so quero saber se estarei indo para o passo certo, na pior das hipoteses, gostaria que me mostrassem como escrever…

Abracos

[quote]na linha

Publicacao headfirst = new Livro("Padrões de Projeto","Programação", "2a", oreilly, autores);
vc tem que criar uma classe Livro de acordo com os argumentos passados no construtor
[/quote]

[quote]e na lina faça o mesmo

Publicacao oracle = new Revista("Isto É", "Notícias", "2279",tres, "semanal"); [/quote]

depois me de um retorno que eu vejo, como posso te ajudar

[i]Parece que isso é um exercício de algum lugar, a classe Principal não pode ser modificada pelo que entendi, ela tem criar as classes que faltam para seu main funcionar

Solução neste link
[/i]

[quote=fabianaguimaraes]Ola pessoal, acabei de entrar no Forum, sou iniciante em Java, estou tentando resolver esse exercicio, mas nao consigo, eh dado o main dele e a partir disso tenho que fazer as outras classes de tal maneira que o main funcione, ja fiz alguma coisa, mas ainda nao eh o bastante, devido a minha inexperiencia.

OBS: Uso Eclipse.

Main:


public class Principal {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Editora oreilly = new Editora("O'Reilly", "http://oreilly.com/");
		String [] autores = {"Eric Freeman", "Elisabeth Freeman"};
		Publicacao headfirst = new Livro("Padrões de Projeto",
		"Programação", "2a", oreilly, autores);
		Editora tres = new Editora("Editora Três", "http://editora3.terra.com.br/");
		Publicacao oracle = new Revista("Isto É", "Notícias", "2279",
		tres, "semanal");
		System.out.println("O'Reilly: " + oreilly.getNumPubs());
		

	}

}

Fiz a classe Editora, primeiro erro a ser reclamado:


public class Editora {
	
	String nome;
	String site;

	public Editora(String nomeEd, String siteEd) {
		// TODO Auto-generated constructor stub
		nome = nomeEd;
		site = siteEd;
	}
	

}

A partir dai eh que veio o problema… Me deparei com o proximo erro no Main:


Publicacao headfirst = new Livro("Padrões de Projeto",	"Programação", "2a", oreilly, autores);

Pesquisei sobre e vi que se trata de uma Interface, que “Publicacao” eh uma interface e que “Livro” vai implementar essa Interface, mas nao entendi muito bem para que serve. E por enquanto essa eh a minha duvida, pois fiz a Interface assim:


public interface Publicacao {
	

}

Mas eu nao entendi o conceito de Interface, sao metodos que preciso declarar em seu escopo e onde cada clase que implementar essa interface tera que sobescrever o metodo da Interface? Alem disso, nao entendo pq um Array autores eh usado como atributo na classe Livro.

Gente, desculpa a ignorancia, mas fiquei perdida… Nao quero que coloquem a resposta para mim, vou continuar desenvolvendo isso, so quero saber se estarei indo para o passo certo, na pior das hipoteses, gostaria que me mostrassem como escrever…

Abracos[/quote]

se uma função que não existe dentro da classe for chamada dará erro no java antes da compilação.
O Java faz uma analise léxica antes de compilar e ao encontrar isso ele determina como erro.
para que isso não ocorra, vc tem que criar uma interface.
vc não precisa implementar a interface, mas o método deve obrigatoriamente exisir dentro da classe.

A ideia de interface é basicamente essa. lhe obrigar a lembrar daquele metodo.
e no contexto léxico, no java, significa que será considerado pelo compilador como um erro se vc esqeucer de criar a interface.

O conceito de Interface em Java é que é um contrato em que, a classe que a implementa, deve seguir a assinatura dos métodos dela, senão nem compila.

O exemplo clássico de uso de interfaces é em drivers de bancos de dados. Você tem vários bancos de dados no mercado (MySQL, Oracle, etc), só que se verifica que em todos eles você vai utilizar dos mesmos métodos para conexão, trazer os resultados de consulta, e por aí vai… assim sendo, todos os bancos devem implementar os mesmos métodos da interface de modo que facilitará para quem fizer uso, na programação (por exemplo).

[quote=RodrigoKaos]
[i]Parece que isso é um exercício de algum lugar, a classe Principal não pode ser modificada pelo que entendi, ela tem criar as classes que faltam para seu main funcionar

Solução neste link
[/i]

Sim Rodrigo, eh um exercicio, mas so depois que vi que tinha uma colega fazendo tambem, mas estou em duvida ainda nos conceitos, mas os colegas aqui que responderam ja me deram luz.

Obrigada pelas respostas, estarei fazendo a continuacao do exercicio, sei que terei duvidas, mas obrigada pela compreensao. :slight_smile:

[quote=Roger75]O conceito de Interface em Java é que é um contrato em que, a classe que a implementa, deve seguir a assinatura dos métodos dela, senão nem compila.

O exemplo clássico de uso de interfaces é em drivers de bancos de dados. Você tem vários bancos de dados no mercado (MySQL, Oracle, etc), só que se verifica que em todos eles você vai utilizar dos mesmos métodos para conexão, trazer os resultados de consulta, e por aí vai… assim sendo, todos os bancos devem implementar os mesmos métodos da interface de modo que facilitará para quem fizer uso, na programação (por exemplo).[/quote]

Sim!
facilidade de integração…
permite proteger códigos que não precisam ser lidos por outros desenvolvedores.

Enquanto herança (extends) é o: “é isso”, Interface é o: “tem isso”.
Ex:
Empresa -> Editora. Editora é uma empresa por tanto usa-se herança. Então a editora herdará métodos e váriaveis da empresa.

Editora +( Site + Banco de Dados). A classe editora tem Site e Banco de dados, por tanto, ao utilizar essas interfaces com o implements a Editora fica obrigada a importar os métodos obrigatórios.

[quote=Janerson][quote]na linha

Publicacao headfirst = new Livro("Padrões de Projeto","Programação", "2a", oreilly, autores);
vc tem que criar uma classe Livro de acordo com os argumentos passados no construtor
[/quote]

[quote]e na lina faça o mesmo

Publicacao oracle = new Revista("Isto É", "Notícias", "2279",tres, "semanal"); [/quote]

depois me de um retorno que eu vejo, como posso te ajudar[/quote]

Ola Janerson, obrigada pelo reply!

Um colega respondeu aqui que ja tinha essa resolucao no outro topico, sendo que a garota havia feito sem usar interface, e eu cismei que queria usar interface, nem que fosse vazia… Pois o exercicio era dado so a classe com o metodo main, a aprtir dela a gente fazia as outras classes e etc… Entendi que:

        Publicacao oracle = new Revista("Isto É", "Notícias", "2279",tres, "semanal");

Tem a classe Revista que implementa a interface Publicacao. A garota havia feito uma classe Publicacao, Revista e Livro estendiam de Publicacao, gostaria de tirar duvida de voces: posso fazer desse jeito que a garota fez? Qual seria a diferenca para o Java?

A proposito, acabei de terminar o meu exercicio, usei interface, mas deixei em branco, nao foi necessario o uso de metodo de acordo com o main dado no exercicio, estou certa? Testei o codigo e ele me retornou o que eu esperava.

Aqui esta a minha resolucao completa e muito obrigada a todos:

Main dado como exercicio:


public class Principal {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Editora oreilly = new Editora("O'Reilly", "http://oreilly.com/");
		String [] autores = {"Eric Freeman", "Elisabeth Freeman"};
		Publicacao headfirst = new Livro("Padrões de Projeto", "Programação", "2a", oreilly, autores);
		Editora tres = new Editora("Editora Três", "http://editora3.terra.com.br/");
		Publicacao oracle = new Revista("Isto É", "Notícias", "2279", tres, "semanal");
		System.out.println("O'Reilly: " + oreilly.getNumPubs());
		

	}

}

Minha classe Editora:


public class Editora {
	
	String nome;
	String site;
	static int contador = 1;
	int i;
	
	public Editora(String nomeEd, String siteEd) {
		// TODO Auto-generated constructor stub
		nome = nomeEd;
		site = siteEd;
		i = contador++; 
	}
	
	int getNumPubs() {
		return i;
		}
	
	
}

Minha Interface Publicacao


public interface Publicacao {
	
	
}

Minha classe Livro, fiz dois construtores por causa da classe Revista que estende de Livro… Classe Revista nao precisa de array de autores… Estou certa em fazer dois construtores, pois sei que eh um exercicio, mas vai que um dia fizessemo outra classe que estenda de Livro e queira ter o array de autores… Pensei certo?


public class Livro implements Publicacao{
	
	String nome;
	String tipo;
	String edicao;
	Editora editora;
	String [] autores;
	
	public Livro(String nome, String tipo, String edicao, Editora editora, String [] autores){
		this.nome = nome;
		this.tipo = tipo;
		this.edicao = edicao;
		this.editora = editora;
		this.autores = autores;
	}

	public Livro(String nome, String tipo, String edicao, Editora editora) {
		// TODO Auto-generated constructor stub
		this.nome = nome;
		this.tipo = tipo;
		this.edicao = edicao;
		this.editora = editora;
	}

}

E minha classe Revista:


public class Revista extends Livro implements Publicacao {

	String ocorrencia;
	
	public Revista(String nome, String tipo, String edicao, Editora editora, String ocorrencia) {
		super(nome, tipo, edicao, editora);
		// TODO Auto-generated constructor stub
		this.nome = nome;
		this.tipo = tipo;
		this.edicao = edicao;
		this.editora = editora;
		this.ocorrencia = ocorrencia;
	}
	
	

}

Funcionou gente :slight_smile:

Ainda sou noob em Java, estou aprendendo, mas obrigada pela compreensão de todos, e vou tentar fazer os outros exercicios, se eu tiver duvidas, posso contar com vcs, ne?

Abracos!

[quote=VA]Enquanto herança (extends) é o: “é isso”, Interface é o: “tem isso”.
Ex:
Empresa -> Editora. Editora é uma empresa por tanto usa-se herança. Então a editora herdará métodos e váriaveis da empresa.

Editora +( Site + Banco de Dados). A classe editora tem Site e Banco de dados, por tanto, ao utilizar essas interfaces com o implements a Editora fica obrigada a importar os métodos obrigatórios. [/quote]
Errado.
Tem um/uma (has a/has an) é uma relação de composição ou de agregação.
É um/uma (is a/is an) é uma relação de herança ou de implementação.
Por exemplo, uma pessoa pode ser um trabalhador, apenas por implementar as operações que a interface trabalhador possui.
E, você pode fazer:

public class Pessoa{
    private String nome;
    //getters e setters
}

public interface Trabalhador{
    public void exercerFuncao();
}

public class TrabalhadorImpl extends Pessoa implements Trabalhador {
    @Override
    public void exercerFuncao(){
        System.out.println("Executando função da minha profissão");
    }
}
//E num método qualquer...
Trabalhador gari = new TrabalhadorImpl();
//Ou
Pessoa pessoa = new TrabalhadorImpl();
//Bem como 
TrabalhadorImpl trab = nw TrabalhadorImpl();

Veja que por ser uma Pessoa, posso fazer Pessoa pessoa = new TrabalhadorImpl() e por ser um Trabalhador, posso fazer o mesmo…

Alguem tem ideia de como posso fazer a implementacao de tal maneira que mostre as revistas/livros de cada Editora?
Como posso manipular o toString para me ajudar a fazer isso?

Na minha opinião, primeiro você tem que entender o conceito das coisas para assim
depois entender como as coisas funcionam…

Como quer entender como as coisas funcionam sem mesmo entender o conceito das coisas?

É o mesmo que querer usar água para apagar fogo sem saber o conceito de que é a água que apaga o fogo
e não a gasolina que o fará explodir mais ainda…

Quando se deparar com isso procure sempre pesquisar o que são os termos tipo Interface, Contrutor, Classe e etc.

Foi assim que aprendi.

abraço