2009-12-23 7 views
0

Java에서 추상 클래스의 객체를 만들 수 있습니다.java의 추상 클래스

+1

그것은 초보자 질문, 그러나 유효한 것입니다. – dmeister

+1

SO 커뮤니티에 좋은 양식과 금색 별표가 없으며 많은 도움이되는 직접적인 설명이 포함되어 있습니다. –

답변

1

의미에 따라 다릅니다.

"기본 클래스의 인스턴스를 가질 수 있습니까?" 암시 적으로 인 구체적인 하위 클래스의 인스턴스 (추상 클래스의 경우)는 추상 수퍼 유형의 인스턴스 인입니다.

"구체적인 하위 유형을 정의하지 않고 추상 클래스의 인스턴스를 가질 수 있습니까?"- 예, 일부 라이브러리 (예 : javassist, cglib)가 구체적인 하위 유형을 생성하는 경우. 당신이 의미하는 경우

"다음과 같은 표현은 지금까지 통과 할 것"

assert Modifier.isAbstract(x.getClass().getModifiers()); 

대답은 NO입니다.

1

추상적 인 클래스 (new)를 인스턴스화 할 수 없습니다. 그게 무슨 뜻인지는 알 수 없습니다.

하위 클래스의 인스턴스를 가질 수 있습니다. 이러한 객체는 추상 클래스 instanceof이기도합니다. 즉,이 클래스에 추상화 할 수 있습니다.

3

(익명의 내부 클래스 구현)는 모든 추상 메소드의 구현을 제공하지 않으면 컴파일 타임에 실패 추상 클래스의 인스턴스를 시도 :이 같은 추상 클래스가 있다면

Runnable r = new Runnable() { 
    public void run() { 
     //do something 
    } 
}; 
+0

추상 클래스 (Runnable은 인터페이스)를 사용하는 예제를 사용했을 수 있습니다. ... – NateS

4

을 :

public abstract class Foo 
{ 
    public void bar() 
    { 
     car(); 
    } 

    protected abstract void car(); 
} 

이 할 수 있다면 :

final Foo foo; 

foo = new Foo(); 
foo.bar(); 

을 "bar"메서드가 "car"메서드를 호출 할 때 "car"메서드에 연결된 코드가 없다면 어떻게 될까요? 다음 않는

class Star 
    extends Bar 
{ 
    protected void car() 
    { 
    } 
} 

과 :

당신은 그러나이 작업을 수행 할 수 있습니다

final Foo foo; 

foo = new Star(); 
foo.bar(); 

당신이 푸의 구상 서브 클래스 (클래스 인 클래스를 저장할 수있는 유형의 푸의 변수를 가지고이 시간을 추상적이지는 않다). 이제 "bar"메서드를 호출하면 Foo에있는 메서드를 사용하고 "car"메서드를 호출하면 Star에있는 메서드를 사용합니다. 그것은 다형성의 예입니다.

3

이 완전한 초보자 질문은 여기 추상 클래스는 자바에있는 기능입니다 가정 :

자바의 클래스의 세 가지 주요 유형, 인터페이스, 추상 클래스클래스을있다. 이들 각각은 실제 클래스 정의에 특정한 것을 추가합니다.

  • 인터페이스 하나 찾을 수있는 방법을 정의 (를 구현해야합니다) 클래스에서.즉, 인터페이스는 동작을 정의합니다.
  • 추상 클래스은 일부 기능을 구현하며 그 위에 추가로 추상 메서드을 정의합니다.이 메서드는 확장 클래스에 의해 구현되어야합니다. 추상 클래스를 사용하는 것은 직접적인 클래스 상속과 유사합니다.
  • 클래스은 이미 익숙한 클래스 일뿐입니다.

가능한 모든 클래스 유형을 사용하는 데에는 많은 이유가 있지만 최신 Java 코드에서 가장 일반적으로 많은 인터페이스와 해당 인터페이스를 구현하는 클래스를 볼 수 있습니다.

예 :

public class Cat { 
public void speak() { 
    System.out.println("Meow!"); 
} 
public void eat(Food f) { 
    System.out.println("Om nom nom, this "+f.getName()+" is delicious!"); 
} 
} 

이것은 매우 간단한 클래스와 종류 모든 자바 코더, 심지어 초보자입니다 잘 알고 : 클래스

은 다음 클래스를 생각해 보자. 여기에는 특별한 것이 없습니다. 그러나 이것으로 당신은 문제가 있습니다 : Dog가 기본적으로 같지만 meows 대신 분명히 짖는다면 어떨까요?

예 : 추상 클래스

은 "Cat 또는 Dog"문제는 상속으로 해결 될 수있다. 전통적으로 표준 상속은 다음과 같습니다

public class Animal { 
public void eat(Food f) { 
    System.out.println("Om nom nom, this "+f.getName()+" is delicious!"); 
} 
} 

public class Cat extends Animal { 
public void speak() { 
    System.out.println("Meow!"); 
} 
} 

public class Dog extends Animal { 
public void speak() { 
    System.out.println("Bark! Bark!"); 
} 
} 

그러나 여기에 문제가있다 : 실제로 Cat 야옹 또는 Dog 껍질을하려면, 당신은 정확하게 동물에 캐스팅되는 동물의 종류를 확인하는 코드가 있어야 올바른 유형을 입력 한 다음 방법을 호출하십시오.

if (animal instanceof Dog) { 
((Dog) animal).speak(); 
} else if (animal instanceof Cat) { 
((Cat) animal).speak(); 
} 

이 코드는 완전히 무의미합니다! 확실히 animal.speak()으로 전화를 걸 수 있습니다. 맞습니까? 그리고 그 목적을 위해 추상적 인 수업이 있습니다! 이

public abstract class Animal { 
public void eat(Food f) { 
    System.out.println("Om nom nom, this "+f.getName()+" is delicious!"); 
} 
public abstract void speak(); 
} 

로 위의 예에서 Animal 클래스를 대체함으로써 당신은 단지 animal.speak()를 호출하여 Dog 나무 껍질과 Cat 야옹을 만들 수 있습니다! 좋아, 그렇지? 당신은 때로는 그냥 여기 보여 주었다보다 감각 이상을 않는 것이 Animalspeak()의 기본 동작을 정의하고 단지 CatDog에서이 메소드를 오버라이드 (override) 할 수

참고.

어쨌든 또 다른 문제가 발생합니다. DogAnimal이고 Pet 인 경우 어떻게해야합니까? Java에서는 diamond inheritance problem을 피하기 위해 단일 상속 만 허용하므로 다른 수퍼 클래스를 가질 수 없습니다. Animal에 대한 수퍼 클래스로 추가 할 수 있지만 다시는 모든 동물이 애완 동물이 아닙니다. 마당 연못에는 하마가 아닙니다.

예 : 대신 실제로 동작을 정의만을 인터페이스 (! 을하고 실제로 관련 키워드의)을을 구현하기 때문에 당신은 당신의 원래 클래스에 추가 동작을 정의하는 인터페이스를 사용할 수있는 인터페이스

. 애완 동물은 일반적으로 다른 것들 사이에 손질 할 수 있으므로 Pet의 인터페이스는 다음과 같이 될 것이라고 가정하자 :

public interface Pet { 
void groom(Brush b); 
} 

지금 당신의 Dogimplements Pet을 추가하고 지금 groomable입니다! 그냥 확인하기 위해, 당신의 Dog 클래스의 첫 번째 줄은 다음과 같아야합니다

public class Dog extends Animal implements Pet { 

이제 신랑하기 위해이 작업을 수행 할 수 있습니다 Dog 또는 기타 Pet :

꽤 많이입니다
if (animal instanceof Pet) ((Pet) animal).groom(); 

. 연습으로 Animal을 인터페이스로 구현해보십시오. 인터페이스는 실제로 다른 인터페이스를 확장 할 수 있다는 점에 유의하십시오.

추신. 또한 열거 형 및 익명 내부 클래스는 클래스 유형으로 간주 될 수 있지만 Java의 기본 사항을 배운 후에 바로 알아야하는 주요 클래스는 아닙니다.

0

No. 불가능합니다. 추상 클래스를 확장하는 클래스를 만들어야하고 하위 클래스의 객체를 만들 수 있습니다.

의 예를 찾아주세요 :

abstract class AbstractClass{ 

    public abstract String abstractMethod(String param1,String param2); 

    public void nonAbstractMethod(String param){ 
     System.out.println("Value of param is "+param); 
    } 
} 

class NonAbstractClass extends AbstractClass{ 
    public String abstractMethod(String param1,String param2){ 
     String param = param1 + param2; 
     return param; 
    } 
} 


public class DemoClass{ 

    public static void main(String[] args) { 
     NonAbstractClass nonAbstractClass = new NonAbstractClass(); 
     nonAbstractClass.abstractMethod("param1", "param2"); 
     nonAbstractClass.nonAbstractMethod("param1"); 
    } 
} 
+0

예 & 아니요 ... 추상 클래스를 확장하는 클래스 자체가 추상화되어 있지 않아야합니다. –