Я изучаю Java и не понимаю, почему этот код генерирует следующую ошибку: «ArrayListClass является абстрактным; экземпляр не может быть создан. Помощь будет принята с благодарностью.

import java.util.*;

public class ArrayListClass {
    protected Object[] list;
    protected int maxSize;
    protected int length;

    public ArrayListClass() {
      maxSize = 100;
      length = 0;
      list = new Object[maxSize];
    }

    public ArrayListClass(int size) {
      maxSize = size;
      list = new Object[maxSize];
      length = 0;
    }

    public boolean isEmpty() {
      return length == 0;
    }

    public boolean isFull() {
      if (length == maxSize)
         return true;
      else 
         return false;
    }

    public int listSize() {
      return length;
    }

    public int maxListSize(){
      return maxSize;
    }

    public void print() {
      System.out.print("The list contains:");
      for(int i = 0; i < length; i++)
         System.out.print(list[i] + " ");
      System.out.println();
    }

    public boolean isItemAtEqual(int location, Object item) {
      return (list[location].equals(item));
    }

    public void insertEnd(Object item) {
      if(!isFull())
         list[length++] = item;
    }

    public static void main(String [] args) {
        ArrayListClass dac = new ArrayListClass(5);
        dac.insertEnd(4);
        dac.insertEnd(5);
        dac.insertEnd(6);
        dac.print();
        System.out.println("dac.isItemAtEqual(0,9)"+dac.isItemAtEqual(0,9));
        System.out.println("dac.isItemAtEqual(1,9)"+dac.isItemAtEqual(1,9));
    }
}  
0
Lenneth Tsukiko 27 Ноя 2016 в 19:55

3 ответа

Лучший ответ

Вы не можете создать экземпляр абстрактного класса на любом языке программирования. Базовая конструкция абстрактного - это просто план, а не реальный объект. Он предоставляет шаблон класса и предоставляет форму или схему класса конкретным классам, реализующим класс (`` расширяет '' класс ...)

Таким образом, вы не можете создать экземпляр ArrayListClass, поскольку это дает схему. Если вы расширите этот класс, скажем, DercedArrayListClass extends ArrayListClass, тогда вы сможете создать экземпляр DercedArrayListClass.

package com;

abstract  class ArrayListClass{
    protected Object [] list;
    protected int maxSize;
    protected int length;

    public ArrayListClass(){
        maxSize = 100;
        length = 0;
        list = new Object [maxSize];
    }
    public ArrayListClass(int size){
        maxSize=size;
        list=new Object [maxSize];
        length=0;
    }


    public boolean isEmpty(){
        return length==0;
    }
    public boolean isFull(){
        if(length==maxSize)
            return true;
        else 
            return false;
    }


    public int listSize(){
        return length;
    }

    public int maxListSize(){
        return maxSize;
    }

    abstract void  print();

    public boolean isItemAtEqual(int location, Object item)
    {
        return (list[location].equals(item));
    }
    public void insertEnd(Object item){
        if(!isFull())
            list[length++] = item;
    }

}  

public class ArrayListClassImpl extends ArrayListClass{

    public ArrayListClassImpl(int i) {
        super(i);
    }

    public void print(){
        System.out.print("The list contains:");
        for(int i = 0; i < length; i++)
            System.out.print(list[i] + " ");
        System.out.println();
    }

    public static void main(String [] args){
        ArrayListClass dac = new ArrayListClassImpl(5);
        dac.insertEnd(4);
        dac.insertEnd(5);
        dac.insertEnd(6);
        dac.print();
        System.out.println("dac.isItemAtEqual(0,9)"+dac.isItemAtEqual(0,9));
        System.out.println("dac.isItemAtEqual(1,9)"+dac.isItemAtEqual(1,9));
    }
}
1
clearlight 27 Ноя 2016 в 18:03

Ваш код в порядке. он компилируется и выполняется без ошибок в моем eclipse, и вывод: В списке: 4 5 6

dac.isItemAtEqual (0,9) false

dac.isItemAtEqual (1,9) false

0
kamlesh pandey 27 Ноя 2016 в 17:36

Если вы преобразовываете класс в abstract, вы должны создать отдельный класс, реализующий ваш абстрактный класс.

Реализующий класс должен переопределять нереализованные методы в абстрактном классе и может необязательно переопределять любой или все реализованные методы. в абстрактном классе

Класс abstract может иметь * сочетание реализованных и нереализованных методов. Класс interface может содержать только нереализованные методы.

Вы создаете экземпляр класса, который реализует класс abstract, но вы не можете создать экземпляр самого класса abstract, потому что классы abstract и interface классы считаются шаблонами или схемами, описывающими форму, которой должна следовать реализация. Это как рецепт. Сам рецепт не испечь, надо запечь ингредиенты.

Рабочий пример создания, реализации и создания экземпляра абстрактного класса Java ...

Shape.java: абстрактный класс

public abstract class Shape { // Indicates this is an abstract class

   protected static String shapeType = "generic shape";

   abstract void draw(); // Implementing class *MUST* provide (due to 'abstract' keyword)

   void logGreeting() {  // Children can *optionally* override this implementation
        System.out.println("I want to say hello");
   }
   void logDescription() {  // Children can *optionally* override this implementation
        System.out.println("This shape is a " + shapeType);
   } 

}

Circle.java: класс реализации

public class Circle extends Shape { // Extends (e.g. implements) abstract class

   public Circle() {
       shapeType = "Circle";
   }

   public void logGreeting() { // Overrides implementation already in abstract class
       System.out.println("This is my overridden greeting message");
   }

   public void draw() { // Provides implementation for *unimplemented* abstract method
       // This is a NOP for example only (normally you'd put code here)
   }

}

TestAbstract.java: создание экземпляра класса

public class TestAbstract extends Circle {

     public static void main(String args[]) {
          Circle circle = new Circle(); // instantiates implementing class
          circle.logGreeting();
          circle.logDescription();
          circle.draw(); 
}

Скомпилируйте код:

javac Shape.java
javac Circle.java
javac TestAbstract.java

Выполните код:

java TestAbstract.java

< Сильный > Вывод :

This is my overridden greeting message
This shape is a Circle
0
clearlight 27 Ноя 2016 в 18:28