Java에서 추상 클래스의 객체를 만들 수 있습니다.java의 추상 클래스
답변
의미에 따라 다릅니다.
"기본 클래스의 인스턴스를 가질 수 있습니까?" 암시 적으로 인 구체적인 하위 클래스의 인스턴스 (추상 클래스의 경우)는 추상 수퍼 유형의 인스턴스 인입니다.
"구체적인 하위 유형을 정의하지 않고 추상 클래스의 인스턴스를 가질 수 있습니까?"- 예, 일부 라이브러리 (예 : javassist, cglib)가 구체적인 하위 유형을 생성하는 경우. 당신이 의미하는 경우
"다음과 같은 표현은 지금까지 통과 할 것"
assert Modifier.isAbstract(x.getClass().getModifiers());
대답은 NO입니다.
추상적 인 클래스 (new
)를 인스턴스화 할 수 없습니다. 그게 무슨 뜻인지는 알 수 없습니다.
하위 클래스의 인스턴스를 가질 수 있습니다. 이러한 객체는 추상 클래스 instanceof
이기도합니다. 즉,이 클래스에 추상화 할 수 있습니다.
(익명의 내부 클래스 구현)는 모든 추상 메소드의 구현을 제공하지 않으면 컴파일 타임에 실패 추상 클래스의 인스턴스를 시도 :이 같은 추상 클래스가 있다면
Runnable r = new Runnable() {
public void run() {
//do something
}
};
추상 클래스 (Runnable은 인터페이스)를 사용하는 예제를 사용했을 수 있습니다. ... – NateS
을 :
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에있는 메서드를 사용합니다. 그것은 다형성의 예입니다.
이 완전한 초보자 질문은 여기 추상 클래스는 자바에있는 기능입니다 가정 :
는자바의 클래스의 세 가지 주요 유형, 인터페이스, 추상 클래스 및 클래스을있다. 이들 각각은 실제 클래스 정의에 특정한 것을 추가합니다.
- 인터페이스 하나 찾을 수있는 방법을 정의 (및를 구현해야합니다) 클래스에서.즉, 인터페이스는 동작을 정의합니다.
- 추상 클래스은 일부 기능을 구현하며 그 위에 추가로 추상 메서드을 정의합니다.이 메서드는 확장 클래스에 의해 구현되어야합니다. 추상 클래스를 사용하는 것은 직접적인 클래스 상속과 유사합니다.
- 클래스은 이미 익숙한 클래스 일뿐입니다.
가능한 모든 클래스 유형을 사용하는 데에는 많은 이유가 있지만 최신 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
야옹을 만들 수 있습니다! 좋아, 그렇지? 당신은 때로는 그냥 여기 보여 주었다보다 감각 이상을 않는 것이 Animal
에 speak()
의 기본 동작을 정의하고 단지 Cat
및 Dog
에서이 메소드를 오버라이드 (override) 할 수
참고.
어쨌든 또 다른 문제가 발생합니다. Dog
이 Animal
이고 Pet
인 경우 어떻게해야합니까? Java에서는 diamond inheritance problem을 피하기 위해 단일 상속 만 허용하므로 다른 수퍼 클래스를 가질 수 없습니다. Animal
에 대한 수퍼 클래스로 추가 할 수 있지만 다시는 모든 동물이 애완 동물이 아닙니다. 마당 연못에는 하마가 아닙니다.
예 : 대신 실제로 의 동작을 정의만을 인터페이스 (! 을하고 실제로 관련 키워드의)을을 구현하기 때문에 당신은 당신의 원래 클래스에 추가 동작을 정의하는 인터페이스를 사용할 수있는 인터페이스
. 애완 동물은 일반적으로 다른 것들 사이에 손질 할 수 있으므로 Pet
의 인터페이스는 다음과 같이 될 것이라고 가정하자 :
public interface Pet {
void groom(Brush b);
}
지금 당신의 Dog
에 implements Pet
을 추가하고 지금 groomable입니다! 그냥 확인하기 위해, 당신의 Dog
클래스의 첫 번째 줄은 다음과 같아야합니다
public class Dog extends Animal implements Pet {
이제 신랑하기 위해이 작업을 수행 할 수 있습니다 Dog
또는 기타 Pet
:
if (animal instanceof Pet) ((Pet) animal).groom();
. 연습으로 Animal
을 인터페이스로 구현해보십시오. 인터페이스는 실제로 다른 인터페이스를 확장 할 수 있다는 점에 유의하십시오.
추신. 또한 열거 형 및 익명 내부 클래스는 클래스 유형으로 간주 될 수 있지만 Java의 기본 사항을 배운 후에 바로 알아야하는 주요 클래스는 아닙니다.
보세요. 그것의 깨끗하고 알맞은 javacanal.blogspot.com/
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");
}
}
예 & 아니요 ... 추상 클래스를 확장하는 클래스 자체가 추상화되어 있지 않아야합니다. –
- 1. 추상 메서드가없는 추상 클래스
- 2. 추상 클래스
- 3. 추상 클래스 매개 변수를 사용하여 추상 메서드가있는 Java 추상 클래스
- 4. 나는 추상 클래스가 추상 클래스
- 5. 추상 기본 클래스 또는 클래스?
- 6. 추상 클래스 캐스트 연산자
- 7. 공유 라이브러리의 추상 클래스
- 8. 추상 클래스 디자인
- 9. 추상 클래스 생성자
- 10. 추상 클래스 명명 규칙
- 11. 추상 클래스와 익명 클래스
- 12. 추상 클래스 및 인터페이스
- 13. 추상 클래스와 익명 클래스
- 14. Android 라이브러리의 추상 클래스
- 15. 오류 LNK2019 추상 클래스
- 16. C에서 추상 클래스 확장하기 #
- 17. QPointer 추상 기본 클래스
- 18. 루비 추상 클래스 디자인
- 19. 추상 클래스 참조
- 20. quartz.net 추상 기본 클래스
- 21. PHP로 추상 클래스 사용하기
- 22. 추상 클래스 및 생성자
- 23. 추상 클래스 컴파일러 오류
- 24. 리팩토링 추상 클래스
- 25. 인터페이스/추상 클래스
- 26. 인터페이스와 추상 클래스
- 27. C++의 추상 클래스
- 28. 추상 기본 클래스 퍼즐
- 29. VC는 추상 클래스
- 30. Java의 일반 클래스 (안전한 형식)
그것은 초보자 질문, 그러나 유효한 것입니다. – dmeister
SO 커뮤니티에 좋은 양식과 금색 별표가 없으며 많은 도움이되는 직접적인 설명이 포함되어 있습니다. –