[英]Creating the instance of abstract class or anonymous class
在這段代碼中,它是創建抽象類或匿名類的對象嗎? 請告訴我。 我在這里有點困惑。
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());
}
}
您創建一個擴展抽象類的匿名類。
在下面的剪輯中,您將擴展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;
}
};
以下是這段簡短而無辜的代碼中發生的事情:
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
變量 在這里閱讀有關Java中anonymous classes
更多信息。
您無法創建抽象類的實例。
您可以創建擴展抽象類的類的實例。
抽象類的重點是它是抽象的 - 你已經定義了一個接口而不是一個實現 。 如果沒有實現,實例化類將不會產生有意義或有用的結果。 如果確實/有意義地實例化該類的對象,那么您根本不想首先使用抽象類。
您可以對以下實例使用匿名類概念:
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;
}
};
@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
創建一個instance
,這里你只是創建一個anonymous class
,它就像一個擴展abstract class
的inner class
,因此它屬於你的anonymous class
。
您正在重寫 anonymous class
abstract methods
。這就是您可以創建對象的原因。 見下文。
@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
的實現可以像你一樣實例化。
不能創建獨立的Abstract類的Object,但可以創建一個匿名的抽象類對象,因為它提供了實現。
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());
}
}
在構造函數調用之后仔細檢查它是{},這意味着不再需要實現,或者可以覆蓋其方法之一或更多。
在匿名類中實現抽象方法之后,您的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;
}
}
這里我們提供抽象類的實現。在我們創建對象的時候,我們提供它的實現並覆蓋所有抽象方法。在Abstract類只有具體方法的情況下。 見下面的例子
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());
}
}
這里我們只是使用像{}之類的調用構造函數來創建對象。
什么只是沒有名字的階級,我們需要做的就是當我們創造一個對象時。
4.為什么抽象類允許構造函數打開答案? 但我們無法創造它的對象。
5.與抽象類相關的另一個問題是我們在抽象類中只能有靜態塊。這是什么意思?
6.Only靜態塊因為我們只想加載一次而不擴展和創建它的對象。
7.編譯代碼后,我們用來獲取每個具體類,抽象類或接口的.class。
8.下一個問題出現在這里為什么java人不允許在接口中使用靜態塊?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.