Java 프로그램은 추상 클래스를 사용하여 본질적으로 추상 개념을 구현합니다. 추상 클래스의 기능은 관련된 여러 클래스를 함께 구성하여 공통 클래스, 즉 추상 클래스를 제공하는 것이며, 이에 의해 구성되는 특정 클래스는 이 클래스에서 하위 클래스로 파생됩니다. 추상 클래스는 공용 동작을 특성화하고 상속 메커니즘을 통해 이를 파생 클래스로 전송합니다. 추상 클래스에 정의된 메서드를 추상 메서드라고 합니다. 이러한 메서드는 메서드 헤더의 선언만 가지며 세미콜론을 사용하여 메서드 본문의 정의를 대체합니다. 즉, 특정 작업 없이 멤버 메서드의 인터페이스 형태만 정의됩니다. . 파생 클래스에 의한 추상 멤버 메서드의 재정의만이 실제로 파생 클래스와 관련된 작업을 구현합니다.
각 하위 클래스는 상위 클래스의 추상 메소드를 상속받은 후 이를 다른 문과 메소드 본문으로 재정의하여 동일한 이름, 동일한 반환 값 및 동일한 매개변수 목록을 가진 여러 하위 클래스를 형성합니다. 목적은 동일하지만 특정 차이점이 있습니다. 구현. 추상 클래스에서 추상 메서드를 정의하는 목적은 인터페이스를 구현하는 것입니다. 즉, 모든 하위 클래스는 외부 세계에 동일한 이름을 가진 메서드를 제공합니다. 추상 클래스는 모든 하위 클래스의 공용 속성 모음과 하나 이상의 추상 메서드를 포함하는 클래스입니다. 추상 클래스를 사용하는 가장 큰 장점 중 하나는 이러한 공용 속성을 최대한 활용하여 프로그램 개발 및 유지 관리의 효율성을 향상시킬 수 있다는 것입니다. 추상 클래스 및 추상 메서드에 대한 제한 사항은 다음과 같습니다.
(1) 추상 수정자로 수정된 모든 클래스를 추상 클래스라고 합니다. abstract 한정자로 수정된 모든 멤버 메서드를 추상 메서드라고 합니다.
(2) 추상 클래스는 0개 이상의 추상 메소드를 가질 수도 있고, 비추상 메소드를 포함할 수도 있습니다.
(3) 추상 클래스에는 추상 메서드가 필요하지 않지만, 추상 메서드가 있는 클래스는 추상 클래스여야 합니다.
(4) 추상 메소드의 경우 구현 코드를 작성하지 않고 추상 클래스에 메소드 이름과 유형만 지정합니다.
(5) 추상 클래스는 하위 클래스를 파생시킬 수 있으며, 추상 클래스에 정의된 모든 추상 메서드는 추상 클래스에서 파생된 하위 클래스에서 구현되어야 합니다.
(6) 추상 클래스는 객체를 생성할 수 없습니다. 객체 생성 작업은 추상 클래스에서 파생된 하위 클래스에 의해 구현됩니다.
(7) 상위 클래스에 같은 이름의 추상 메서드가 있으면 하위 클래스에도 같은 이름의 추상 메서드가 있을 수 없습니다.
(8) abstract는 final과 병렬로 동일한 클래스를 수정할 수 없습니다.
(9) abstract는 private, static, final 또는 Native와 병렬로 동일한 메서드를 수정하는 데 사용할 수 없습니다.
Java 언어에서는 클래스에 추상 메서드가 있는 경우 해당 클래스를 추상 클래스로 선언해야 한다고 규정합니다.
하위 클래스가 상위 클래스로부터 상속을 받을 때 상위 클래스에 추상 메서드가 있고 하위 클래스가 상위 클래스의 모든 추상 메서드를 구현할 수 있다고 생각하면 하위 클래스는 상위 클래스의 모든 추상 메서드를 구현해야 합니다. 와 같은:
/** * 하위 클래스 Dog는 추상 클래스 Animal을 상속하고 추상 메서드인 Enjoy를 구현합니다. * @author gacl * */class Dog extends Animal { /** * Dog 클래스는 고유한 속성을 추가합니다*/ public String furColor; ( String n, String c) { super(n);//부모 클래스 Animal의 생성자 호출 this.furColor = c; } @Override public void Enjoy() { System.out.println("개가 짖습니다.. .." ); }}
상위 클래스의 추상 메서드를 하위 클래스에서 구현할 수 없는 경우 하위 클래스를 다음과 같이 추상 클래스로 선언합니다.
/** * 여기서 하위 클래스 Cat은 Animal 추상 클래스를 상속받으며, 당연히 Animal 클래스에 선언된 추상 메서드인 Enjoy()를 상속받습니다. * 그러나 하위 클래스 Cat은 이 Enjoy() 메서드를 다음과 같이 구현하는 것이 적절하지 않다고 생각합니다. 따라서 자신을 추상 클래스로 선언합니다. * 그러면 이 추상 메서드인 Enjoy()를 구현하는 사람과 하위 클래스를 상속하는 사람이 모두 이 추상 메서드인 Enjoy()를 구현하는 사람이 됩니다. * @author gacl * */abstract class Cat extends Animal { /** * Cat은 고유한 속성을 추가합니다*/ public String eyeColor; public Cat(String n, String c) { super(n);//상위 클래스 호출 동물의 구성 방법 this.eyeColor = c }}
여기서 하위 클래스 Cat은 Animal 추상 클래스를 상속받으며, 당연히 Animal 클래스에 선언된 추상 메소드인 Enjoy()를 상속받습니다. 그러나 하위 클래스인 Cat은 자체적으로 이 Enjoy() 메소드를 구현하는 것이 적절하지 않다고 느껴서 자기 자신을 추상 클래스로 선언한 다음 누가 추상적인 Enjoy 메소드를 구현하는지, 누가 서브클래스를 상속하는지 그 다음 추상 메소드인 Enjoy()를 구현합니다. 좋다:
/** * 하위 클래스 BlueCat은 추상 클래스 Cat을 상속하고 상위 클래스 Cat에서 상속받은 추상 메서드인 Enjoy를 구현합니다. * @author gacl * */class BlueCat extends Cat { public BlueCat(String n, String c) { super(n , c); } /** * 추상 메서드를 구현합니다. */ @Override public void Enjoy() { System.out.println("파란 고양이 야옹...");
전체 테스트 코드는 다음과 같습니다.
package javastudy.summary;/** * 부모 클래스 Animal * 클래스 앞에 abstract를 추가합니다. 즉, 다음과 같이 선언합니다. abstract class Animal * 이렇게 하면 Animal 클래스가 추상 클래스가 됩니다. */abstract class Animal { public String name; public Animal(String name) { this.name = name; } /** * 추상 메서드 * 메서드 정의만 있고 메서드 구현은 없습니다. */ public abstract void Enjoy(); }/** * 여기서 Cat 하위 클래스는 Animal 추상 클래스를 상속하고 Animal 클래스에 선언된 추상 메서드인 Enjoy()를 자연스럽게 상속하지만, * 하위 클래스 Cat은 그래야 한다고 생각합니다. 자체 구현 이 Enjoy() 메소드도 부적절하므로 자신을 추상 클래스로 선언합니다. * 그러면 이 추상 메소드를 구현하는 사람, 하위 클래스를 상속받은 사람이 이 추상 메소드인 Enjoy()를 구현하는 사람이 됩니다. * @author gacl * */abstract class Cat extends Animal { /** * Cat은 고유한 속성을 추가합니다*/ public String eyeColor; public Cat(String n, String c) { super(n);//상위 클래스 호출 Animal의 생성 메서드 this.eyeColor = c; }}/** * 하위 클래스 BlueCat은 추상 클래스 Cat을 상속하고 상위 클래스 Cat에서 상속된 추상 메서드인 Enjoy를 구현합니다. * @author gacl * */class BlueCat 확장 Cat { public BlueCat(String n, String c) { super(n, c) } /** * 추상 메서드를 구현합니다. */ @Override public void Enjoy() { System.out.println("Blue Cat meows. .."); } }/** * 하위 클래스 Dog는 추상 클래스 Animal을 상속하고 추상 메서드인 Enjoy를 구현합니다. * @author gacl * */class Dog는 Animal을 확장합니다. { /** * Dog 클래스는 고유한 속성을 추가합니다. / 공개 문자열 furColor; public Dog(String n, String c) { super(n);//부모 클래스 Animal의 생성자 호출 this.furColor = c } @Override public void Enjoy() { System.out.println("Dog; 짖는 소리 ...."); }} public class TestAbstract { /** * @param args */ public static void main(String[] args) { /** * Cat 클래스를 추상 클래스로 선언한 후에는 Cat 클래스를 인스턴스화할 수 없습니다.* 추상 클래스가 불완전하고 팔과 다리가 누락되어 추상 클래스를 인스턴스화할 수 없습니다. */ //Cat c = new Cat("Catname","blue"); Dog d = new Dog("dogname","black");//구현한 BlueCat 메소드를 호출합니다. = new BlueCat("BlueCatname","blue"); c.enjoy();//구현한 Enjoy 메소드 호출}}