создать объект абстрактного класса! = создать экземпляр абстрактного класса? - PullRequest
0 голосов
/ 27 января 2012

Я узнал, что мы не можем создать экземпляр абстрактного класса. Но сегодня я проверил некоторые коды, и я чувствую смущение по этому поводу.

package MainPackage;

abstract class abstractClass {
    abstract abstractClass a_function();
}

public class Src {
    abstractClass m;
    public abstractClass abstractClassTest() {
        return m.a_function();
    }
    public static void main(String args[]) {
        System.out.println("Hello world!");
    }
}

Здесь я создаю абстрактный класс abstractClass и возвращаю его в функцию abstractClassTest (). И он успешно скомпилирован без ошибок! ИМО, прежде чем что-то возвращать, компьютер должен создать объект такого типа. И здесь он должен создать объект abstractClass до return m.function () , который я не могу понять. я думаю, что мы не можем создать экземпляр абстрактного класса означает, что мы не можем создать объект абстрактного класса или мы не может создать новый класс (например, abstractClass m = new abstractClass() is illegal) . Но из приведенных выше кодов кажется, что мы можем создать объект абстрактного класса. как это можно понять? Для кода abstractClass m, что делает компьютер, когда видит код? Мы не можем сказать, что java создал экземпляр абстрактного класса m для кода abstractClass m? и если java не создает экземпляр класса abstractClass, как он может вернуть объект abstractClass в коде abstract abstractClass a_function();?

Ответы [ 3 ]

5 голосов
/ 27 января 2012

Да, должен скомпилироваться без ошибок.Тем не менее, если бы вы когда-либо вызывали abstractClassTest, то при выполнении выполнялось бы NullPointerException, потому что вы никогда не инициализируете переменную m для ссылки на фактический экземпляр.Для этого вам нужно создать конкретный класс, который подклассирует ваш абстрактный.

Например:

public class ConcreteClass extends AbstractClass {
    @Override AbstractClass a_function() {
       return this;
    }
}

public class Src {
    private AbstractClass m = new ConcreteClass();

    public AbstractClass abstractClassTest() {
        return m.a_function();
    }
    public static void main(String args[]) {
        new Src().abstractClassTest();
    }
}

Обратите внимание, что ничего в вашемКод создает экземпляр абстрактного класса.То, что у вас есть переменная этого типа, не означает, что объект этого типа был создан.

1 голос
/ 27 января 2012

m никогда не назначается, и вы никогда не пытаетесь создать экземпляр нового abstractClass с новым ключевым словом. Если ваш код когда-либо действительно попадет в abstractClassTest, вы просто получите исключение нулевого указателя. Я думаю, что вы можете смешать объявление переменной и фактически присвоить ей значение.

0 голосов
/ 27 января 2012

Вы не можете напрямую создать экземпляр абстрактного класса, а ваш код на самом деле этого не делает.То, что у вас есть, является просто ссылкой на некоторый подкласс или другой из вашего абстрактного класса, и когда вы придете к созданию экземпляра 'm', вам придется предоставить фактический конкретный подкласс.Вполне допустимо написать, например:

List m;
...
m.size();

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

List m;
...
m = new ArrayList();
...
m.size();

Обратите внимание, как при созданиимы используем ArrayList, а не List (это просто интерфейс).

...