Создание экземпляра абстрактного класса или анонимного класса
В этом коде здесь создается объект абстрактного класса или анонимного класса? Пожалуйста, скажите мне. Я немного смущен здесь.
public abstract class AbstractDemo {
abstract void showMessage();
abstract int add(int x,int y);
public int mul(int x,int y){
return x+y;
}
public static void main(String[] args) {
AbstractDemo ad = new AbstractDemo() {
@Override
void showMessage() {
// TODO Auto-generated method stub
}
@Override
int add(int x, int y) {
// TODO Auto-generated method stub
return 0;
}
};
System.out.println(ad.mul(10, 12));
System.out.println(ad.getClass());
}
}
Ответы
Ответ 1
Вы создаете анонимный класс, который расширяет ваш абстрактный класс.
В приведенном ниже фрагменте вы расширяете AbstractDemo
и предоставляете реализации для своих абстрактных методов.
new AbstractDemo() {
@Override
void showMessage() {
// TODO Auto-generated method stub
}
@Override
int add(int x, int y) {
// TODO Auto-generated method stub
return 0;
}
};
Ответ 2
Вот что произошло в этом коротком и невинном фрагменте кода:
AbstractDemo ad = new AbstractDemo() {
@Override
void showMessage() {
// TODO Auto-generated method stub
}
@Override
int add(int x, int y) {
// TODO Auto-generated method stub
return 0;
}
};
- Был определен новый класс (без имени, так называемый анонимный класс)
- Этот новый класс расширяет класс
AbstractDemo
- Абстрактные методы
AbstractDemo
были переопределены в этом новом классе - Новый экземпляр этого нового класса был создан и назначен переменной
ad
Подробнее об anonymous classes
в Java читайте здесь.
Ответ 3
Вы не можете создать экземпляр абстрактного класса.
Вы можете создать экземпляр класса, который расширяет ваш абстрактный класс.
Вся суть абстрактного класса заключается в том, что он абстрактный - вы определили интерфейс, но не реализацию. Без реализации экземпляр класса не принесет значимого или полезного результата. Если это делает/имеет смысл для создания объектов этого класса, то вы просто не хотите использовать абстрактный класс в первую очередь.
Вы можете использовать концепцию анонимного класса для экземпляра, как показано ниже:
AbstractDemo abstractDemo = new AbstractDemo() {
@Override
void showMessage() {
// TODO Auto-generated method stub
}
@Override
int add(int x, int y) {
// TODO Auto-generated method stub
return 0;
}
};
Ответ 4
@Override // Here
void showMessage() {
// TODO Auto-generated method stub
}
@Override // here
int add(int x, int y) {
// TODO Auto-generated method stub
return 0;
}
Прежде всего, вам нужно знать, что вы не можете создать instance
для abstract class
, здесь вы просто создаете anonymous class
, который действует как inner class
, который расширяет abstract class
, поэтому его принадлежит вашему anonymous class
.
Ответ 5
Вы переопределяете abstract methods
в anonymous class
.. то, почему вы можете создать объект. см. ниже.
@Override // Here
void showMessage() {
// TODO Auto-generated method stub
}
@Override // here
int add(int x, int y) {
// TODO Auto-generated method stub
return 0;
Реализация Abstract Class
может быть создана так, как вы это делаете.
Ответ 6
Автономный абстрактный объект класса не может быть выполнен, но анонимный объект абстрактного класса может быть создан, поскольку он обеспечивает реализацию тогда и там.
Причина, по которой Java не разрешает объект абстрактного класса, заключается в том, что у него нет какой-либо реализации для какого-либо метода или для некоторых методов, так как у вас может быть объект неполного класса. Но анонимным способом здесь вы даете ему реализацию, чтобы он мог иметь объект.
Тот же корпус с интерфейсом
AbstractDemo ad = new AbstractDemo() {
@Override
void showMessage() {
// TODO Auto-generated method stub
}
@Override
int add(int x, int y) {
// TODO Auto-generated method stub
return 0;
}
};
Здесь класс AbstractDemo является абстрактным, но его класс реализации может иметь объект, поэтому здесь анонимный код класса реализует код, поэтому ему вполне разрешено иметь объект.
Подробнее в этом разделе, см. код ниже, MyAbstractClass - абстрактный класс, теперь, если вы закомментируете
abstract void play();
тогда он отлично работает, Java позволяет создавать объект этого абстрактного класса, но когда вы раскомментируете это, он отрицает, потому что у него нет реализации этого метода, поэтому он отказывается делать объект.
abstract class MyAbstractClass {
private String name;
public MyAbstractClass(String name)
{
this.name = name;
}
public String getName(){
return this.name;
}
abstract void play();
}
public class Test2 {
public static void main(String [] args)
{
MyAbstractClass ABC = new MyAbstractClass("name") {
};
System.out.println(ABC.getName());
}
}
внимательно проверьте {} после вызова конструктора, это означает, что не требуется больше выполнения, или вы можете переопределить его один из методов или более.
Ответ 7
Ваш AbstractDemo не является более абстрактным после того, как его абстрактные методы реализованы в анонимном классе. Его также хорошо говорят:
Class AbstractDemoImpl extends AbstractDemo {
void showMessage() {
// TODO Auto-generated method stub
}
int add(int x, int y) {
// TODO Auto-generated method stub
return 0;
}
}
Ответ 8
Здесь мы предоставляем реализацию абстрактного класса. Когда мы создаем объект, мы предоставляем его реализацию и переопределяем все абстрактные методы. В случае абстрактного класса, имеющего только конкретный метод.
См. Ниже Пример
abstract class MyAbstractClass {
private String name;
public MyAbstractClass(String name)
{
this.name = name;
}
public String getName(){
return this.name;
}
}
public class Test {
public static void main(String [] args)
{
MyAbstractClass ABC = new MyAbstractClass("name") {
};
System.out.println(ABC.getName());
}
}
Здесь мы просто делаем объект, используя конструктор вызова, например {}.
- мы реализуем реализацию с использованием анонимного класса.
2. Это не что иное, как класс без имени, который нам нужно делать, когда мы делаем объект.
- Да, мы создаем объект абстрактного класса, доказывая реализацию во время выполнения.
4.Откроем ответ, например, почему абстрактный класс разрешает конструктор? но мы не можем создать его объект.
5. Другой вопрос, связанный с абстрактным классом, состоит в том, что в абстрактном классе может быть только статический блок. Что это значит?
6. Только статический блок, потому что мы хотим загрузить одно время, не расширяя и не создавая его.
7. После компиляции кода мы используем для получения .class каждого конкретного класса, абстрактного класса или интерфейса.
8. Здесь возникает следующий вопрос. Почему java people donot разрешает статический блок в интерфейсе?