Как создать объект абстрактного класса и интерфейс - PullRequest
16 голосов
/ 01 декабря 2010

Как мне создать объект абстрактного класса и интерфейса?Я знаю, что мы не можем создать экземпляр объекта абстрактного класса напрямую.

Ответы [ 12 ]

13 голосов
/ 01 декабря 2010

Вы не можете создать экземпляр абстрактного класса или интерфейса - вы можете создать экземпляр одного из их подклассов / разработчиков.

Примеры таких вещей типичны для использования коллекций Java.

List<String> stringList = new ArrayList<String>();

Вы используете тип интерфейса List<T> в качестве типа, но сам экземпляр является ArrayList<T>.

9 голосов
/ 20 июня 2012

Для создания объекта абстрактного класса просто используйте new так же, как создаете объекты других неабстрактных классов с одним небольшим отличием, как показано ниже:

package com.my.test;

public abstract class MyAbstractClass {
    private String name;

    public MyAbstractClass(String name)
    {
        this.name = name;
    }

    public String getName(){
        return this.name;
    }


}

package com.my.test;

public class MyTestClass {

    public static void main(String [] args)
    {
        MyAbstractClass ABC = new MyAbstractClass("name") {
        };

        System.out.println(ABC.getName());
    }

}

Таким же образом Вы можете создать объект типа интерфейса, следующим образом:

package com.my.test;

public interface MyInterface {

    void doSome();
    public abstract void go();

}

package com.my.test;

public class MyTestClass {

    public static void main(String [] args)
    {

        MyInterface myInterface = new MyInterface() {

            @Override
            public void go() {
                System.out.println("Go ...");

            }

            @Override
            public void doSome() {
                System.out.println("Do ...");

            }
        };

        myInterface.doSome();
        myInterface.go();
    }

}
4 голосов
/ 01 декабря 2010

Вы можете предоставить реализацию в виде анонимного класса:

new SomeInterface() {
    public void foo(){
      // an implementation of an interface method
    }
};

Аналогичным образом, анонимный класс может расширять родительский класс вместо реализации интерфейса (но он не может выполнять обе функции).

4 голосов
/ 01 декабря 2010
public abstract class Foo { public abstract void foo(); }
public interface Bar { public void bar(); }
public class Winner extends Foo implements Bar {
  @Override public void foo() { }
  @Override public void bar() { }
}
new Winner(); // OK
3 голосов
/ 01 декабря 2010

Это можно сделать двумя способами.

1) Либо вы расширяете / реализуете класс / интерфейс Abstract в новом классе, создаете объект этого нового класса и затем используете этот объект в соответствии со своими потребностями.

2) Компилятор позволяет вам создавать анонимные объекты интерфейсов в вашем коде.

Например, (новый Runnable () {...});

Надеюсь, это поможет.

С уважением, Махендра Лия.

2 голосов
/ 01 декабря 2010

То, что вы знаете, правильно. Вы не можете создать объект абстрактного класса или интерфейса, так как они являются неполным классом (интерфейс даже не рассматривается как класс.)

Что вы можете сделать, это реализовать подкласс абстрактного класса, который, конечно, не должен быть абстрактным. Для интерфейса вы должны создать класс, который реализует интерфейс и реализует тела методов интерфейса.

Вот оригинальное руководство на сайте оракула, http://download.oracle.com/javase/tutorial/java/IandI/abstract.html и http://download.oracle.com/javase/tutorial/java/concepts/interface.html

2 голосов
/ 01 декабря 2010

«экземпляр» означает «создать объект».

Так что вы не можете создать его напрямую.

Цель интерфейсов и абстрактных классов - описать поведение некоторого конкретного класса, который реализует интерфейс или расширяет абстрактный класс.

Класс, который реализует интерфейс, может использоваться другим кодом, который знает только об интерфейсе, который помогает вам разделить обязанности и четко определить, что вы хотите от объекта. (Вызывающий код будет знать только то, что объект может делать все, что указано в интерфейсе; он не будет знать ни о каких других имеющихся у него методах.)

Если вы используете чей-то код, который ожидает Fooable (где это имя некоторого интерфейса), вас на самом деле не спрашивают об объекте некоторого класса Fooable (потому что на самом деле такого класса нет ). Вас только спрашивают об экземпляре некоторого класса, который реализует Fooable, то есть объявляет, что он может делать все в этом интерфейсе. Короче говоря, кое-что, что "может быть Foo'd".

2 голосов
/ 01 декабря 2010

Вы пишете класс, производный от абстрактного класса или реализующий интерфейс, а затем создаете его экземпляр.

1 голос
/ 03 сентября 2015

Вы не можете создать экземпляр абстрактного класса или интерфейса - вы можете создать экземпляр одного из их подклассов / разработчиков

Вы не можете создать экземпляр абстрактного класса или интерфейса, вы можете создать только один из их производных классов.

В вашем примере

 MyAbstractClass ABC = new MyAbstractClass("name") {
    };

Вы создаете экземпляр любого класса, который реализует Suprising

1 голос
/ 11 октября 2013

НЕТ, мы не можем создать объект из интерфейса или абстрактного класса, потому что

Основное намерение создания объекта - использовать упакованные методы и данные.Поскольку интерфейс не имеет конкретной реализации, следовательно, мы не можем.

Для абстрактного класса у нас может быть конкретный метод или абстрактный метод или оба.Разработчик API не может ограничить использование метода, который не имеет реализации.

Надеюсь, что справка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...