Ir ao conteúdo

Ajuda em herança em java e como usar o método super


pauloeduardo2906

Posts recomendados

Postado

Acabei de fazer um programa apenas para estudar, para testar alguns conceitos em java e deu alguns erros, queria que alguém pudesse me ajudar a resolver esse problema, vou colocar o programa aqui e logo em seguida o erro que aparece:

public class Pessoa {

String nome;

int idade;

public Pessoa(String nome,int idade) {

this.nome=nome;

this.idade=idade;

}

}

public class Aluno extends Pessoa{

int mat;

double n1,n2,media;

boolean passou;

public Aluno(int mat,double n1,double n2,double media,boolean passou) {

super(nome,idade);

this.mat=mat;

this.n1=n1;

this.n2=n2;

this.media=media;

this.passou=passou;

}

public Aluno(int mat,double n1,double n2,double media){

super(nome,idade);

this.mat=mat;

this.n1=n1;

this.n2=n2;

this.media=media;

}

public void exibir(){

System.out.println("Aluno: "+nome+"\nIdade: "+idade+"\nMatricula: "+mat+"\nPrimeira Nota: "+n1+"\nSegunda Nota: "+n2+"\nMedia: "+media+"\nPassou: "+passou);

}

}

import java.util.Scanner;

public class SistemaEscola {

public static void main(String[] args) {

Scanner entrada=new Scanner(System.in);

System.out.println("QUAL O NOME DO ALUNO: ");

String n;

n=entrada.nextLine();

System.out.println("QUAL A IDADE DO ALUNO: ");

int id;

id=entrada.nextInt();

Pessoa pe=new Pessoa(n,id);

Aluno sim,nao;

System.out.println("QUAL A PRIMEIRA NOTA: ");

double nu1;

nu1=entrada.nextDouble();

System.out.println("QUAL A PRIMEIRA NOTA: ");

double nu2;

nu2=entrada.nextDouble();

double media;

media=(nu1+nu2)/2;

int matricula;

boolean s;

if(media>6)

{ s=true;

matricula++;

nao=new Aluno(matricula,nu1,nu2,media,s);

nao.exibir();

}

else

{

s=false;

matricula++;

sim=new Aluno(Matricula,nu1,nu2,media);

sim.exbir();

}

}

}

error: cannot reference nome before supertype constructor has been called - line 8

error: cannot reference idade before supertype constructor has been called - line 8

error: cannot reference nome before supertype constructor has been called - line17

error: cannot reference idade before supertype constructor has been called - line17

Quem puder responder, além de consertar o programa, gostaria também que me explicasse o porque e tal por favor.

OBS: Sou novo aqui no fórum, primeira pergunta que eu faço aqui.

Postado

O conceito de herança é simples: Uma aluno é uma pessoa, mas uma pessoa não é um aluno. Chamando o super no início do construtor de aluno está perfeito! Mas faltou colocar alguns métodos e inicializar alguns parâmetros. Portanto, você poderia usar:

Classe Pessoa


public class Pessoa
{
String nome;
int idade;
public Pessoa()
{
}
public Pessoa(String nome,int idade)
{
this.nome=nome;
this.idade=idade;
}

public void setNome(String nome)
{
this.nome = nome;
}

public void setIdade(int idade)
{
this.idade = idade;
}

public String getNome()
{
return nome;
}

public int getIdade()
{
return idade;
}
}

Classe Aluno


public class Aluno extends Pessoa
{
int mat;
double n1,n2,media;
boolean passou;
public Aluno(String nome, int idade, int mat,double n1,double n2,double media,boolean passou)
{
super(nome, idade);
this.mat=mat;
this.n1=n1;
this.n2=n2;
this.media=media;
this.passou=passou;
}

public Aluno(String nome, int idade, int mat,double n1,double n2,double media)
{
super(nome,idade);
this.mat=mat;
this.n1=n1;
this.n2=n2;
this.media=media;
}
public void exibir()
{
System.out.println("Aluno: "+nome+"\nIdade: "+idade+"\nMatricula: "+mat+"\nPrimeira Nota: "+n1+"\nSegunda Nota: "+n2+"\nMedia: "+media+"\nPassou: "+passou);
}
}

Classe Main


import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
//Tente sempre inicializar as variáveis...
String n = "";
int id = 0;
double nu1 = 0.0;
double nu2 = 0.0;
double media = 0.0;
int matricula = 0;
//Inicializa o processo...
Scanner entrada=new Scanner(System.in);
System.out.println("QUAL O NOME DO ALUNO: ");
n=entrada.nextLine();
System.out.println("QUAL A IDADE DO ALUNO: ");
id=entrada.nextInt();
System.out.println("QUAL A PRIMEIRA NOTA: ");
nu1=entrada.nextDouble();
System.out.println("QUAL A PRIMEIRA NOTA: ");
nu2=entrada.nextDouble();
media=(nu1+nu2)/2;
if(media > 6)
{
matricula++;
Aluno aprovado = new Aluno(n,id,matricula,nu1,nu2,media,true);
aprovado.exibir();
}
else
{
matricula++;
Aluno reprovado = new Aluno(n,id,matricula,nu1,nu2,media, false);
reprovado.exibir();
}
}
}

Grande abraço,

Postado

Brigadão cara, eu tava esquecendo de passar os atributos da classe pessoa como parâmetro nos construtores da classe aluno, mas eu percebi que você usou na classe pessoa os métodos de encapsulamento e esse conceito eu ainda não conseguir entender, qual a vantagem de usar esses métodos? eu sei usar ele mas não entendo o motivo de usar eles ou não...

Postado
  pauloeduardo2906 disse:
Brigadão cara, eu tava esquecendo de passar os atributos da classe pessoa como parâmetro nos construtores da classe aluno, mas eu percebi que você usou na classe pessoa os métodos de encapsulamento e esse conceito eu ainda não conseguir entender, qual a vantagem de usar esses métodos? eu sei usar ele mas não entendo o motivo de usar eles ou não...

Fala Paulo,

Que bom que consegui ajudar!

Bem, somente coloquei os métodos set e get que são além de um padrão aplicado para classes OO, facilita muito o trabalho, pois esses atributos são privados da classe Pessoa (não são acessíveis diretamente - mesmo que você tenha feito o extends).

Na realidade, o ideal é sempre criar métodos set e get para qualquer classe que contenha atributos que você deseja que sejam acessados.

Grande abraço e qualquer coisa estamos aí,

Postado
  Citação
Fala Paulo,

Que bom que consegui ajudar!

Bem, somente coloquei os métodos set e get que são além de um padrão aplicado para classes OO, facilita muito o trabalho, pois esses atributos são privados da classe Pessoa (não são acessíveis diretamente - mesmo que você tenha feito o extends).

Na realidade, o ideal é sempre criar métodos set e get para qualquer classe que contenha atributos que você deseja que sejam acessados.

Grande abraço e qualquer coisa estamos aí,

Ajudou bastante, estou em semana de prova na facul e tava meio desesperado porque eu não estava entendendo algumas coisas, mas encapsulamento eu não vou precisar usar embora eu saiba usar, mas queria te perguntar mais algumas coisas, por exemplo, você disse que os metodos gets e sets são para acessar os atributos privados, mas eu não coloquei os atributos em privados, deixei em default mesmo porque a professora como eu disse não entrou nessa parte de encapsulamento, bom, sem usar esse metodos nesse programa que eu fiz ele funciona também né? e outra coisa, como pode perceber na classe aluno tem o atributo mat de matricula, sendo que fica feio do jeito que eu coloquei, seria legal colocar ele em static, pra cada aluno que for criado a matricula ser associado + 1, do jeito que está todo aluno vai ter matricula 1, mas eu tentei fazer com static e estava dando erro direto, aí prefiri tirar o loop q eu criei pra ficar mais fácil consertar, mas qualquer coisa a ajuda foi excelente, a parte de herança eu já entendi 100%.

Postado

Ora Paulo,

1. Mesmo sendo um atributo Default, quando você efetua a herança o mesmo não poderá ser acessado diretamente (faz um teste). Se você tivesse utilizado Pessoa p = new Pessoa() aí sim, você teria acesso aos atributos públicos, mas como eu disse: Isto é uma "aberração" para o Java, que pode te trazer inúmeros problemas futuros. Portanto, treine para sempre colocar atributos privados e get's e set's.

2. Você pode utilizar o static int mat sim!

3. Beleza! O código está como seu professor(a) pediu?...tente agora fazer ele ficar mais robusto!!! Tem um monte de coisa que dá para melhorar nele...

Grande abraço,

Postado

Entendi, a partir de agora vou tornar um hábito fazer encapsulamento, mas esse programa eu fiz apenas pra estudar, inventei da minha cabeça mesmo, coloquei o static com o loop e agora funcionou, agora, pela ultima vez rsrs, só queria perguntar mais umas duas coisas, tem como criar um vetor com atributo definindo quantas posições ele tem sem usar o new? e da pra criar um atributo de uma classe por associação também sem usar o new? por exemplo:

  Citação

class Paciente{

int idade=30;

long matricula[5]; /*eu sei que só fazendo isso não da pra criar o vetor, mas queria saber se tem como criar um vetor sem ser com new e sem ser na classe Principal*/

Endereco ender; // Atributo da classe Endereco

void exibir(){

System.out.println(idade);

ender.exibir();

}

  Citação

class Endereco{

String rua="Rosa";

void exibir(){

System.out.println(rua);}

  Citação

class Principal{

public static void main(String[]args){

Hospital h=new Hospital();

h.exibir();

}}

sempre que eu faço isso o compilador roda mas dá uma mensagem de erro...

ps: malz se eu to colocando minhas duvidas de forma errada aqui no topico, mas é que eu preciso saber todas esses conceitos de java pra não entrar em desespero pra prova que ta vindo e obrigado pelos toques que ta me dando, estão ajudando MUITO, não tem ideia. abraço!!!

Postado

Respondendo o que acho que queres saber:

1. Crie uma classe;

2. Crie um array dela;

Exemplo:


MinhaClasse[] mc = new MinhaClasse[7];

Mas na verdade, dê uma olhada nas lists do java e depois comece a trabalhar diretamente com instâncias aninhadas. (estudar)

Grande abraço,

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Mostrar mais  

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

Mostrar mais  
×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!