要求一个方法在基类中

时间:2017-08-21 20:19:56

标签: java class object inheritance methods

我对以下代码有疑问。

当我运行项目时,在调用ImprimirDatos()方法时标记错误,错误说明:

cannot find symbol. symbol: method ImprimirDatos(). location: class Articulo.

我在子类deRevista中编写了该方法。我不明白为什么要求这个方法在基类中。

注意:如果您在我的代码中看到异常,请随意“更正”。它,我在这个主题上是全新的。

interface ImprDatos
{
    String ImprimirDatos();
}
class Autor
{
    private String nombre;
    private String adscripcion;

    Autor(String nombre,String adscripcion)
    {
        this.nombre=nombre;
        this.adscripcion=adscripcion;
    }

    String getNombre()
    {
        return nombre;
    }

    String getAdscripcion()
    {
        return adscripcion;
    }

    void setNombre(String nombre)
    {
        this.nombre=nombre;
    }

    void setAdscripcion(String adscripcion)
    {
        this.adscripcion=adscripcion;
    }
}
abstract class Articulo 
{
    private String nombre;  
    private Autor autores[]=new Autor[4]; 
    private String fechaPublicacion;
    private int codigo;

    Articulo(String nombreArt,String fechaPublicacion, String nombre,String adscription,String nombre1,String adscripcion1,int codigo)
    {
        this.nombre=nombreArt;
        this.fechaPublicacion=fechaPublicacion;
        autores[0]=new Autor(nombre,adscripcion);
        autores[1]=new Autor(nombre1,adscripcion1);
        autores[2]=new Autor(nombre,adscripcion);
        autores[3]=new Autor(nombre1,adscripcion1);
        this.codigo=codigo;    
    }
    Articulo()
    {
    }

    String getNombre()
    {
        return nombre; //del articulo
    }   
    String getfechaPublicacion()
    {
        return fechaPublicacion;
    }  
    int getCodigo()
    {
        return codigo;
    }
    String getAutores()
    {
        String c=null;
        c=autores[0].getNombre()+" "+autores[0].getAdscripcion()+" 
 "+autores[1].getNombre()+" "+autores[1].getAdscripcion();

        return c;
    }

    void setAutores(Autor[] autores) 
    {
        this.autores = autores;
    } 
    void setNombre(String nomArt)
    {
        nombre=nomArt;
    }
    void setfechaPublicacion(String fechaPublicacion)
    {
        this.fechaPublicacion=fechaPublicacion; 
    }
    void setcodigo(int cod)
    {
        codigo=cod;
    }    
}
class deRevista extends Articulo implements ImprDatos
{
    private String nomRevista; 
    private int añoEdicion; 
    deRevista(){}
    deRevista(String nombreArt,String fechaPublicacion, String 
    nombre,String adscripcion,String nombre1,String adscripcion1,String 
    nomRevista,int añoEdicion,int codigo)
    {
        super(nombreArt,fechaPublicacion,nombre,adscripcion,nombre1,adscripcion1,
 codigo);

        this.añoEdicion=añoEdicion;
        this.nomRevista=nomRevista;    
     }


     void setañoEdicion(int nom)
     {
         añoEdicion=nom;
     }
     int getañoEdicion()
     {
         return añoEdicion;
     }

     void setnomRevista(String nom)
     {
         nomRevista=nom;
     }
     String getnomRevista()
     {
         return nomRevista;
     }

     public String ImprimirDatos()
     { 
         return " Nombre del articulo: " + getNombre() + " Nombre de la 
  revista: " + getnomRevista() 
        + " Año de edicion: " + getañoEdicion() + " Autores: " +
           getAutores() + " Codigo: " + getCodigo() + " Fecha de 
  publicacion: "
        + getfechaPublicacion();
     }
 }  
class deCongreso extends Articulo implements ImprDatos
{
    private String nomCongreso;

    deCongreso(){}   
    deCongreso(String nombreArt,String fechaPublicacion, String 
nombre,String adscripcion
        ,String nombre1,String adscripcion1,String nomCongreso,int 
codigo)
   {
        super(nombreArt,fechaPublicacion,nombre,adscripcion,nombre1,adscripcion1,codigo);
        this.nomCongreso=nomCongreso;

    }
    void setnomCongreso(String nom)
    {
        nomCongreso=nom;
    }
    String getnomCongreso()
    {
        return nomCongreso;
    }

    public String ImprimirDatos() 
    { 
        return "Nombre del articulo: " + getNombre() + " Nombre de la 
 revista: " + getnomCongreso()
        + " Autores: "+getAutores() + " Codigo: " + getCodigo() + " 
 Fecha de publicacion: "
        + getfechaPublicacion();  
    }    
}
public class Articulo17ago
{  
    public static void main(String[] args) 
    {  
        Scanner x=new Scanner(System.in);

        String  au1[]=new String[4];
        String ads1[]=new String[4];

        Articulo y[]=new Articulo[4]; 

        //ARTICULO DE REVISTA:
        for(int i=0;i<2;i++)
        {
            System.out.println("Introduzca el nombre del articulo");
            String art=x.nextLine();

            System.out.println("Introduzca el nombre de la revista");
            String rev=x.nextLine();

            System.out.println("Introduzca el año de edicion");
            int año=x.nextInt();

            System.out.println("Introduzca el codigo ISSN");
            int cod=x.nextInt();

            System.out.println("Introduzca la fecha de publicacion");
            x.nextLine();   
            String fec=x.nextLine();
            for(int k=0;k<2;k++)
            {
                System.out.println("Introduzca el nombre del autor");
                au1[k]=x.nextLine();
                System.out.println("Introduzca la adscripcion del autor");
                ads1[k]=x.nextLine(); 
            }

            y[i]=new deRevista(art,fec,au1[0],ads1[0],au1[1],ads1[1],rev,año,cod);
        }

        for(int i=0;i<2;i++)
            System.out.println("Datos: "+y[i].ImprimirDatos());


        //ARTICULO DE CONGRESO:
        for(int i=2;i<4;i++)
        {
            System.out.println("Introduzca el nombre del articulo");
            String art=x.nextLine();

            System.out.println("Introduzca el nombre del congreso");
            String rev=x.nextLine();

            System.out.println("Introduzca el codigo ISBN");
            int cod=x.nextInt();

            System.out.println("Introduzca la fecha de publicacion");   
            x.nextLine();
            String fec=x.nextLine();

            for(int k=2;k<4;k++)
            {
                System.out.println("Introduzca el nombre del autor");
                au1[k]=x.nextLine();
                System.out.println("Introduzca la adscripcion del autor");
                ads1[k]=x.nextLine(); 
            }

            y[i]=new deCongreso(art,fec,au1[2],ads1[2],au1[3],ads1[3],rev,cod);
        }

        for(int i=2;i<4;i++)
            System.out.println("DATOS: " + y[i].ImprimirDatos());

    }    
}

2 个答案:

答案 0 :(得分:2)

更改

Articulo y[]=new Articulo[4];

ImprDatos y[]=new ImprDatos[4];

Articulo[]数组可能包含任何扩展Articulo的内容。由于Articulo未实现ImprDatos,因此无法保证所有子类都将实现它,因此编译器不会让您假设该数组中的对象具有ImprimirDatos方法。要告诉编译器数组对象必须实现ImprDatos,您可以简单地将其声明为ImprDatos[]数组。

或者,如果所有Articulo个对象都应该实现ImprDatos,那么您可以将类声明更改为abstract class Articulo implements ImprDatos,而不需要进行其他更改。

答案 1 :(得分:1)

正如上面的评论所述,您的界面ImprDatos知道其方法ImprimirDatos()(根据Java naming conventions应该命名为imprimirDatos()(第一个字低于情况下))。

你的Articulo班级对此一无所知。

然后我们需要了解以下内容:

创建代码时有两种状态:

  1. 编译时间
  2. 运行时间
  3. 在编译时,y数组知道它是Articulo类型(它对ImprimirDatos()一无所知,但在运行时它表现为deRevista或{{1 }}类型(了解deCongreso方法)。

    因此,我们可以做的是“强制”编译器编译我们的代码,这是两件事:

    1. ImprimirDatos()数组显式转换为y接口...

      您可以更改此行:

      ImprDatos

      对此:

      System.out.println("Datos: "+y[i].ImprimirDatos());
      

      这告诉编译器:

      • “嘿编译器!我有这个System.out.println("Datos: " + ((ImprDatos) y[i]).ImprimirDatos()); 类型数组的元素,但我希望你把它当作Articulo类型元素”,编译器会说:

      • “好的,我告诉你这不安全,但是如果你还想这样做,那么如果出现问题就是你的错”

      然后你就可以编译你的代码,但是在运行代码时可能会中断。

    2. ImprDatos数组类型更改为接口类型:

      所以,改变:

      y

      致:

      Articulo y[] = new Articulo[4];
      
    3. 也可以做这项工作。

      旁注(与问题无关):由于您的代码是用西班牙语编写的(我检查了您的个人资料,而且您来自墨西哥(我)),也许您可​​以在{{3 (但是我觉得这里更舒服,因为我学了更多(技术)英语,也可以练习),我只是让你选择是否留下来写下你的问题并阅读英语或西班牙语的答案(或两者兼得!)

      我认为你对接口和抽象类的工作原理感到困惑......如果你愿意,我可以尝试解释它(不是通过Stack Overflow,因为它可能真的很长,而且过于广泛,但通过其他媒体)。