Сомнение в абстрактных классах - PullRequest
0 голосов
/ 21 апреля 2010
public abstract class Person {

    private String name;

    public Person(String name) {
        this.name = name;
        System.out.println("Person");
    }

    public String getName() {
        return name;
    }

    abstract public String getDescription();    
}


public class Student extends Person {

    private String major;

    public Student(String name, String major) {
        super(name);
        this.major = major;
    }

    public String getMajor() {
        return major;
    }

    @Override
    public String getDescription() {
        return "student" + super.getName() + " having" + major;
    }

}

public class PersonTest {

    public static void main(String[] args) {

        Person person = new Student("XYZ", "ABC");
        System.out.println(person.getDescription());

    }

}

Ques: Мы не можем создавать объекты абстрактных классов, тогда зачем вызывается Person Constructor, даже его абстрактный класс?

Ответы [ 8 ]

2 голосов
/ 21 апреля 2010

Поскольку это все еще класс, и его конструктор вызывается как часть создания объекта. Тот факт, что он абстрактный, не имеет к этому никакого отношения.

1 голос
/ 21 апреля 2010

Ques: мы не можем создавать объекты абстрактные классы, то почему человек Конструктор был вызван, даже его абстрактный класс?

Если класс объявлен как абстрактный, никакие объекты этого класса не могут быть созданы. Это НЕ означает, что вы не можете создавать объекты его подклассов.

У вас могут быть ссылки (типа абстрактного класса) на объект подкласса (неабстрактный).

Человек человек = новый студент ("XYZ", "ABC"); * +1010 *

И чтобы построить объект Student, вам нужно инициализировать «индивидуальные» части студента, для чего именно нужен конструктор абстрактного суперкласса.

1 голос
/ 21 апреля 2010

То, что вы не можете сделать, это создать экземпляр абстрактного класса. Поскольку ученик является «частично» человеком, super(...) инициализирует «личную часть» ученика, он не создает личность.

Надеюсь, вы понимаете, что я пытаюсь сказать

0 голосов
/ 21 апреля 2010

Класс Abstract является частью вашего общего конкретного класса. Абстрактный класс - это класс, которому разрешено откладывать многие части до его конкретных реализаций, но он все равно должен инициализировать себя.

Как таковой, он имеет конструктор и как таковой конструктор с любыми параметрами, необходимыми для его настройки.

Когда вы вызываете метод super (...) из класса Student, вы явно вызываете конструктор в классе шаблона Person. Вызов super () должен находиться в первой строке конструктора Person, поэтому, если ваш класс person хочет переопределить значения по умолчанию, установленные конструктором Person (), у вас есть эта опция. Но при расширении класса (абстрактный или конкретный) ДОЛЖЕН быть вызван ровно один человек-конструктор.

0 голосов
/ 21 апреля 2010

Нельзя создать экземпляр abstract class, но подклассы могут вызывать super(name);. Несмотря на то, что это конструктор, это всего лишь другой метод.

0 голосов
/ 21 апреля 2010

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

0 голосов
/ 21 апреля 2010

Конструктор Person вызывается из класса Student. Из учебников по Java

Абстрактный класс - это класс, который объявлен аннотацией - может или не может включить абстрактные методы. Аннотация классы не могут быть созданы, но они могут быть разделены на подклассы.

0 голосов
/ 21 апреля 2010

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

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