2013-11-13 2 views
0

Я новичок в программировании на Java, завтра у меня есть тест, но до сих пор не понимаю абстрактных классов, потому что каждый из них дает мне бесконечные ошибки, я читал книги и искал в Интернете , но я чувствую себя очень разочарованным.Абстрактная ошибка класса. Причина: фактические и формальные аргументы различаются по длине

Хорошо, вот мое последнее упражнение: предполагается поздравить с юбилеем!

это абстрактный базовый класс

abstract class Pessoa 
{ 
    private int dia, mes, ano; 

    Pessoa (int dia, int mes, int ano) 
    { 
     this.dia = dia; 
     this.mes = mes; 
     this.ano = ano; 
    } 

    public void setDia(int dia){ this.dia = dia;} 

    public void setMes(int mes){ this.mes = mes;} 

    public void setAno(int ano){ this.ano = ano;} 

    public int getDia(){return dia;} 

    public int getMes(){ return mes;} 

    public int getAno(){ return ano;} 

    abstract int aniversario(); 
} 

и это одно производный класс, который наследует методы

import java.util.Date; 

class Cliente extends Pessoa 
{ 

    int aniversario() 
     { 
     int d = data.get(Calendar.DAY_OF_MONTH); 
     int m = data.get(Calendar.MONTH); 

     if (d== dia && m == mes) 
      return "Parabéns pelo seu aniversário! "; 
    } 
} 

и ошибка:

constructor Pessoa in class Pessoa cannot be applied to given types; 
required: java.lang.String,int,java.lang.String,int,int,int 
found: no arguments 
reason: actual and formal argument lists differ in length 

the operator that you use cannot be used for the 
type of value you are using it for. You are either 
using the wrong type here, or the wrong operator. 

может быть, очевидно, но я не вижу! (пожалуйста, извините, плохой английский)

+2

Вашего класс 'Pessoa' имеет конструктор 3 аргумента, вы не применяли его в' Cliente' класса. Просмотрите, как работает наследование. –

+1

также проверяет, что метод 'aniversario()' возвращает 'String' вместо int. –

ответ

2

У вас нет конструктора по умолчанию в Pessoa, который не принимает аргументов. Каждый подкласс неявно вызывает конструктор по умолчанию (без аргументов), если вы его явно не вызываете. Но нет такого явного вызова в Cliente, и Java не может вызвать конструктор суперкласса по умолчанию, если его нет.

Добавить конструктор в Cliente, который явно вызывает конструктор суперкласса в Pessoa.

public Cliente(int dia, int mes, int ano) 
{ 
    super(dia, mes, ano); 
} 

Эта проблема возникает с конструкторами классов; это не имело никакого отношения к Pessoa, являющемуся abstract.

+0

Итак, если у суперкласса есть конструктор по умолчанию, мне всегда нужно вызвать его в моем подклассе? и все аргументы суперкласса или просто те, которые мне нужны? – user2988567

+0

Нет. Если суперкласс имеет конструктор с нулевым аргументом (по умолчанию или иначе), вы можете полагаться на Java, вставляя неявный вызов конструктору по умолчанию в ваш конструктор подкласса (по умолчанию или иначе). Если суперкласс не имеет конструктора с нулевым аргументом, то любой конструктор подкласса должен быть явным, чтобы он мог явно вызвать конструктор суперкласса. – rgettman

0

Вам необходимо явно вызвать конструктор суперкласса

class Cliente extends Pessoa 
{ 
    Cliente(int dia, int mes, int ano) { 
     super(dia, mes, ano); 
    } 

    int aniversario() 
     { 
     int d = data.get(Calendar.DAY_OF_MONTH); 
     int m = data.get(Calendar.MONTH); 

     if (d== dia && m == mes) 
      return "Parabéns pelo seu aniversário! "; 
    } 
} 
Смежные вопросы