Может ли абстрактный класс иметь конструктор?
Если да, то как его можно использовать и для каких целей?
Да, абстрактный класс может иметь конструктор. Рассмотрим следующее:
abstract class Product {
int multiplyBy;
public Product( int multiplyBy ) {
this.multiplyBy = multiplyBy;
}
public int mutiply(int val) {
return multiplyBy * val;
}
}
class TimesTwo extends Product {
public TimesTwo() {
super(2);
}
}
class TimesWhat extends Product {
public TimesWhat(int what) {
super(what);
}
}
Суперкласс Product
является абстрактным и имеет конструктор. Конкретный класс TimesTwo
имеет конструктор, который просто жестко кодирует значение 2. Конкретный класс TimesWhat
имеет конструктор, который позволяет вызывающей стороне указать значение.
Абстрактные конструкторы часто используются для обеспечения соблюдения ограничений или инвариантов класса, например, минимальных полей, необходимых для установки класса.
ПРИМЕЧАНИЕ: Поскольку в родительском классе нет конструктора по умолчанию (или конструктора без указания значения), то в абстрактном классе, который является родительским. абстрактного класса, конструктор, используемый в подклассе, должен явно вызывать родительский конструктор.
Вы можете определить конструктор в абстрактном классе, если вы находитесь в одной из следующих ситуаций:
Обратите внимание, что:
В любом случае, Дон'т забывайте, что если вы Don'т определить конструктор, то компилятор автоматически сгенерирует для вас (это общественная, не аргумент, и ничего не делает).
Да, у него может быть конструктор, и он определяется и ведет себя так же, как конструктор любого другого класса. За исключением того, что абстрактные классы не могут быть непосредственно инстанцированы, только расширены, поэтому использование всегда происходит из конструктора подкласса.
Да! Абстрактные классы могут иметь конструкторы!
Да, когда мы определяем, что класс абстрактный класс не может быть инстанцирован, но это не значит, абстрактный класс может иметь конструктор. Каждый абстрактный класс должен иметь конкретный подкласс, который будет реализовывать абстрактные методы, что абстрактный класс.
Когда мы создаем объект любого подкласса все конструкторы в соответствующем дереве наследования вызываются в сверху вниз подход. То же касается и абстрактные классы. Хотя мы не можем создать объект абстрактного класса, когда мы создаем объект класса, который является конкретным и подкласс абстрактного класса, конструктор абстрактного класса вызывается автоматически. Следовательно, мы можем иметь конструктор в абстрактных классах.
Примечание: не-абстрактный класс может иметь абстрактные методы, а абстрактный класс может иметь неабстрактный метод. Причина аналогична строителей, разницей, вместо того, чтобы вызываться автоматически, мы можем вызвать Super(). Кроме того, есть не что иное, как абстрактный конструктор, так как он не имеет никакого смысла.
Не только он может, он всегда так делает. Если вы не укажете его, то оно имеет по умолчанию конструктор без аргументов, как и любой другой класс. На самом деле, все классы, включая вложенные и анонимные классы, будет конструктор по умолчанию, если не указано иное (в случае анонимного классов нельзя указать один, так что вы всегда найдете конструктор по умолчанию).
Хороший пример абстрактный класс, имеющий конструктор календарный класс. Вы получите объект календарь с помощью вызова календаря.деыпзьапсе(), но также есть конструкторы, которые охраняются. Причина его конструкторов защищается так, что только его подклассы называют их (или классы в том же пакете, но так как он'ы реферат, что не'т применять). Gregoriancalendar значение приведен пример класса, который расширяет календарь.
Абстрактный класс может иметь конструктор, но вы не можете создать объект абстрактного класса, так как вы можете использовать этот конструктор?
Дело, когда вы наследуете, что абстрактный класс в подклассе, вы можете пройти ценностей(реферат'ы) с помощью конструктора супер(значение) метод в подклассе, и нет, вы не'т наследовать конструктор.
таким образом, используя супер можно передавать значения в конструктор абстрактного класса и насколько я помню она должна быть первой инструкцией в ваш метод или конструктор.
Хотя есть много хороших ответов, я хотел бы дать мои 2 цента.
Конструктор не построить объект. Он используется для инициализации объекта.
Да, абстрактный класс всегда имеет конструктор. Если не определить свой собственный конструктор, компилятор даст конструктор по умолчанию для абстрактного класса. Выше справедливо для всех классов - вложенные, абстрактные, анонимные и т. д.
Абстрактный класс (В отличие от интерфейса) может быть не окончательной нестатических полей, которые нуждаются в инициализации. Вы можете написать свой собственный конструктор в абстрактном классе, чтобы сделать это. Но, в таком случае, там выиграл'т быть любой конструктор по умолчанию.
public abstract class Abs{
int i;
int j;
public Abs(int i,int j){
this.i = i;
this.j = j;
System.out.println(i+" "+j);
}
}
Будьте осторожны при расширении выше абстрактный класс, вы должны явно вызвать супер из каждого конструктора. В первой строке любого конструктора звонки на Super(). если явно не вызвать Super(), то Java будет делать это за вас. Ниже код не будет компилироваться:
public class Imp extends Abs{
public Imp(int i, int j,int k, int l){
System.out.println("2 arg");
}
}
Вы должны использовать его, как показано ниже пример:
public class Imp extends Abs{
public Imp(int i, int j,int k, int l){
super(i,j);
System.out.println("2 arg");
}
}
Конечно, абстрактный класс может иметь конструктор.Как правило, конструктор класса используется для инициализации полей.Таким образом, абстрактный класс конструктор используется для инициализации поля абстрактного класса. Вы бы конструктора абстрактного класса, если вы хотите инициализировать некоторые поля абстрактного класса до создания ребенка-класс проходит. Абстрактный конструктор класса также может быть использована для выполнения кода, который актуален для каждого ребенка класса. Это предотвращает дублирование кода.
Мы не можем создать экземпляр абстрактного класса,но мы можем создать экземпляры классов, те являются производными от абстрактного класса. Таким образом, при создании экземпляра производного класса, Родительский абстрактный конструктор класса вызывается автоматически.
Ссылка :в данной статье
Подумайте об этом:
abstract class Product {
int value;
public Product( int val ) {
value= val;
}
abstract public int multiply();
}
class TimesTwo extends Product {
public int mutiply() {
return value * 2;
}
}
Суперкласс является абстрактным и имеет конструктор.
Как описано javafuns здесь, это пример:
public abstract class TestEngine
{
private String engineId;
private String engineName;
public TestEngine(String engineId , String engineName)
{
this.engineId = engineId;
this.engineName = engineName;
}
//public gettors and settors
public abstract void scheduleTest();
}
public class JavaTestEngine extends TestEngine
{
private String typeName;
public JavaTestEngine(String engineId , String engineName , String typeName)
{
super(engineId , engineName);
this.typeName = typeName;
}
public void scheduleTest()
{
//do Stuff
}
}
В конкретном классе, объявление конструктора для конкретного типа Фнорд эффективно выявляет две вещи:
Средства, с помощью которых код может запросить создание экземпляра Фнорд
Средства, с помощью которых экземпляр типа, производного от Фнорд, который находится в стадии строительства может потребовать, чтобы все базового класса функции инициализации.
Хотя, возможно, должны быть средством, с помощью которого эти две способности могут быть контролируемый отдельно, для каждого конкретного типа одно определение позволит. Хотя первая способность не имеет смысла для абстрактного класса, вторая способность является такой же значимой для абстрактного класса, как это было бы для любого другого, и таким образом свое заявление так же необходимо и полезно.
Да, абстрактные классы могут иметь конструкторы !
Вот пример, используя конструктор в абстрактном классе:
abstract class Figure {
double dim1;
double dim2;
Figure(double a, double b) {
dim1 = a;
dim2 = b;
}
// area is now an abstract method
abstract double area();
}
class Rectangle extends Figure {
Rectangle(double a, double b) {
super(a, b);
}
// override area for rectangle
double area() {
System.out.println("Inside Area for Rectangle.");
return dim1 * dim2;
}
}
class Triangle extends Figure {
Triangle(double a, double b) {
super(a, b);
}
// override area for right triangle
double area() {
System.out.println("Inside Area for Triangle.");
return dim1 * dim2 / 2;
}
}
class AbstractAreas {
public static void main(String args[]) {
// Figure f = new Figure(10, 10); // illegal now
Rectangle r = new Rectangle(9, 5);
Triangle t = new Triangle(10, 8);
Figure figref; // this is OK, no object is created
figref = r;
System.out.println("Area is " + figref.area());
figref = t;
System.out.println("Area is " + figref.area());
}
}
Так что я думаю, вы получили ответ.
да, это так. И конструктора абстрактного класса вызывается при создании экземпляра наследуется класс. Например, следующее является допустимым Java-программы.
// An abstract class with constructor
abstract class Base {
Base() { System.out.println("Base Constructor Called"); }
abstract void fun();
}
class Derived extends Base {
Derived() { System.out.println("Derived Constructor Called"); }
void fun() { System.out.println("Derived fun() called"); }
}
class Main {
public static void main(String args[]) {
Derived d = new Derived();
}
}
Это выход выше код,
Базовый Конструктор Называется Конструктора Производного Называется
ссылки: Введите описание ссылки здесь
Абстрактный класс может иметь конструктор, хотя он не может быть инстанцирован. Но конструктор определен в абстрактном классе может быть использован для создания экземпляра конкретного класса этого абстрактного класса. Проверьте ПСБ:
это-ошибка времени компиляции, если делается попытка создать экземпляр абстрактного класса с помощью создания экземпляра класса выражение.
подкласс абстрактного класса, который не является самостоятельно Abstract, может быть инстанцируют, в результате выполнения конструктора абстрактный класс и, следовательно, выполнение полевых инициализаторов для переменных экземпляра этого класса.
Да, абстрактный класс может иметь конструктор. Можно перегрузить столько конструктор, сколько вы хотите в абстрактном классе. Эти подрядчики могут быть использованы для инициализации начального состояния объектов, расширяя абстрактный класс. Как мы знаем, что мы можем'т сделать объект абстрактного класса, потому что объекты создаются в "Новой" по запросам, а не конструкторов...они там только для инициализации состояния объектов подкласса.
Поскольку абстрактный класс могут иметь переменные все модификаторы доступа, они должны быть инициализированы к значениям по умолчанию, поэтому конструктору необходимо. Как вы создаете экземпляр дочернего класса, вызывается конструктор абстрактного класса и инициализировать переменные.
Напротив, интерфейс содержит только постоянные переменные означает, что они уже были инициализированы. Так что интерфейс не'т нужна конструктора.
Для достижения конструктор-цепочки, абстрактный класс конструктор. Компилятор держит супер() заявление в конструкторе подкласса, который будет вызывать конструктор суперкласса. Если не было никаких конструкторов для абстрактных классов в Java нарушил правила и мы можем'т достичь конструктор цепочки.
пакет Условие_1;
открытый класс AbstractClassConstructor {
public AbstractClassConstructor() {
}
public static void main(String args[]) {
Demo obj = new Test("Test of code has started");
obj.test1();
}
}
abstract class Demo{
protected final String demoValue;
public Demo(String testName){
this.demoValue = testName;
}
public abstract boolean test1();
}
class Test extends Demo{
public Test(String name){
super(name);
}
@Override
public boolean test1() {
System.out.println( this.demoValue + " Demo test started");
return true;
}
}
Да, конечно, можно добавить одну, как уже упоминалось для инициализации переменных класса Аннотация. Но если вы не явно объявить один, он в любом случае имеет неявный конструктор "не конструктор цепочки" на работе.