В чем разница для расширения абстрактного класса и неабстрактного класса? - PullRequest
13 голосов
/ 09 ноября 2011

В чем разница между абстрактным классом и неабстрактным классом при расширении производных классов? В обоих классах я не использовал переопределение метода и абстрактные методы (то есть абстрактный класс). Просто я унаследовал свойства. Что и почему предпочли класс?

Ex:

Код 1:

abstract class a {  
    protected int empnno; 
    protected String empname; 
} 

class b extends a { 
    ...
}

Код 2:

class a {  
    protected int empnno; 
    protected String empname; 
}

class b extends a { 
    ...
}

Ответы [ 6 ]

14 голосов
/ 09 ноября 2011

В чем разница для расширения абстрактного класса и неабстрактного класса?

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

Поскольку в вашем классе a нет абстрактных методов,Разница, что так всегда с точки зрения подкласса.(Разница только в заключается в том, что если a является абстрактным, то он больше не может быть создан как есть. Он может быть создан только в терминах подклассов.)

2 голосов
/ 09 ноября 2011

Абстрактный метод - это метод, который объявлен без реализации (без фигурных скобок и сопровождается точкой с запятой), например:

abstract void moveTo(double deltaX, double deltaY);  

Если класс включает абстрактные методы, сам класс должен быть объявлен абстрактным, как в:

public abstract class GraphicObject {
   // declare fields
   // declare non-abstract methods
   abstract void draw();
}

Абстрактный класс - это класс, который объявлен абстрактным - он может включать или не включать абстрактные методы. Абстрактные классы не могут быть созданы, но могут быть разделены на подклассы
Разница : -
Абстрактные классы не могут быть созданы
Нормальный класс не может иметь абстрактный метод ..
Ваш код: Разница между ч / б Code1 и code2 заключается в коде, свойство code1 может использоваться только по наследству
но в code2 вы можете сделать его объект и использовать там свойство с объектом там.

1 голос
/ 06 июля 2017

Чтобы лучше понять, мы можем сравнить Абстрактные классы с Интерфейсами , Основные отличия :

  1. Хотяабстрактные классы могут содержать поля / свойства и конкретные методы, интерфейсы могут содержать только абстрактные методы (сигнатуры методов).
  2. Один класс может реализовывать несколько интерфейсов, тогда как он может расширять только один класс, абстрактный или нет.

Поэтому, когда вы создаете подкласс, расширенный абстрактный класс, вам необходимо реализовать абстрактный метод, который был в абстрактном классе (если есть), в противном случае подкласс был бы все еще абстрактным классом - который не можетбыть экземпляром !!

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

0 голосов
/ 09 ноября 2011

Предположим, есть класс B и класс A, где A расширяется.Ниже приведены возможные сценарии:

1. B is abstract

1.1. B doesn't have abstract methods

1.1.1. A is abstract

1.1.1.1. You don't want to instantiate A. Everything is fine.

1.1.1.2. You want to instantiate A. That's not possible, you can't create abstract objects

1.1.2. A is not abstract. Everything is fine

1.2. B has at least an abstract method

1.2.1. A is abstract

1.2.1.1. You don't want to instantiate A. Everything is fine.

1.2.1.2. You want to instantiate A. That's not possible, you can't create abstract objects

1.2.2. A is not abstract

1.2.2.1. A doesn't implement all the abstract methods. You can't run your project until you change this

1.2.2.2. A implements all the abstract methods. Everything is fine.

2. B is not abstract

2.1. A is abstract

2.1.1. You want to instantiate A. Error.

2.1.2. You don't want to instantiate A. No problem

2.2. A is not abstract. No problem.
0 голосов
/ 09 ноября 2011

Абстрактный класс будет содержать абстрактные методы, которые не имеют реализации.

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

Если вы реализуете все абстрактные методы, ваш подкласс, как правило, не является абстрактным (хотя ничто не мешает вам объявить его таковым, AFAIK).

0 голосов
/ 09 ноября 2011

На самом деле они одинаковы, но вы не можете создавать классы Abstract.Поэтому, если вы хотите, чтобы никто не пытался создать экземпляр вашего класса, вы бы хотели сделать его Абстрактным.

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