[자바의 왕이 되는 길] 16장: Java SE (객체 지향 프로그래밍 - 추상 클래스, 인터페이스)

이 섹션의 목표

추상 클래스

상호 작용

1. 추상 클래스란?

실제 작동하는 메서드는 없으며 추상 메서드로 설계할 수 있으며 추상 메서드가 포함된 클래스를 추상 클래스라고 합니다.

예시:

abstract class shape{
    public abstract void draw();//抽象方法
}

1. 추상 메소드를 포함하는 클래스를 추상 클래스라고 합니다.

2. 추상 메소드란 무엇인가: 구체적인 구현이 없는 메소드는 abstract 키워드에 의해 수정됩니다.

추상 클래스와 일반 클래스의 차이점

1. 추상 클래스는 인스턴스화할 수 없습니다.

 2. 추상 클래스는 인스턴스화할 수 없기 때문에 상속만 가능합니다. 일반 클래스가 추상 클래스를 상속하면 이 일반 클래스에서 이 추상 클래스의 모든 추상 메서드를 다시 작성해야 합니다.

 3. 추상 클래스는 일반 클래스와 동일한 멤버 및 메서드를 포함할 수도 있습니다.

 4. 추상 클래스의 가장 큰 역할은 상속입니다.

abstract class Shape{
    public int a;
    public void func(){
        System.out.println("测试普通方法");
    }
    public abstract void draw();//抽象方法
}
class Rect extends  Shape{
    @Override
    public void draw() {
        System.out.println("❀");
    }
}

public class Test {
    public static void drawMap(Shape shape){
        shape.draw();
    }
    public static void main(String[] args) {
        Shape shape = new Rect() ;
        drawMap(new Rect());

    }
}

 5. 추상 클래스 A가 추상 클래스 B를 상속하는 경우, 추상 클래스 A는 추상 부모 클래스 B의 추상 메소드를 구현하지 않을 수 있습니다.

6. 포인트 5와 결합하여 클래스 A가 다시 공통 클래스에 상속되면 두 추상 클래스 A와 B의 추상 메소드를 다시 작성해야 합니다. 

bstract class Shape{
    public int a;
    public void func(){
        System.out.println("测试普通方法");
    }
    public abstract void draw();//抽象方法
}
abstract class A extends Shape{
    public abstract void func();

}
class B extends A{
    @Override
    public void func() {
        
    }

    @Override
    public void draw() {

    }

}
class Rect extends  Shape{
    @Override
    public void draw() {
        System.out.println("❀");
    }
}

public class Test {
    public static void drawMap(Shape shape){
        shape.draw();
    }
    public static void main(String[] args) {
        Shape shape = new Rect() ;
        drawMap(new Rect());

    }
}

추상 클래스를 사용하는 이유 

추상 클래스를 사용하는 시나리오는 위의 코드와 같으며 실제 작업은 상위 클래스가 아닌 하위 클래스에서 수행해야 합니다. 그러면 실수로 상위 클래스를 실수로 사용하면 일반 클래스 컴파일러에서 오류를 보고하지 않습니다. .. 하지만 부모 클래스가 추상 클래스인 경우 인스턴스화할 때 오류가 발생하므로 최대한 빨리 문제를 찾도록 합시다.

2. 인터페이스란?

인터페이스는 추상 클래스의 추가 단계입니다. 추상 클래스에는 비추상 메서드와 필드도 포함될 수 있습니다. 인터페이스에 포함된 메서드는 추상 메서드이고 필드에는 정적 상수만 포함될 수 있습니다.

 문법 규칙

지금 막 인쇄하는 그래픽의 예에서 우리의 부모 클래스인 Shape는 다른 비추상 메소드를 포함하지 않으며 인터페이스로도 디자인될 수 있습니다.

interface IShape { 
 void draw(); 
} 
class Cycle implements IShape { 
 @Override 
 public void draw() { 
 System.out.println("○"); 
 } 
} 
public class Test { 
 public static void main(String[] args) { 
 IShape shape = new Rect(); 
 shape.draw(); 
 } 
} 

인터페이스를 사용하여 인터페이스 정의

인터페이스의 메서드는 추상 메서드여야 하므로 추상을 생략할 수 있습니다.

인터페이스의 메서드는 public이어야 하므로 public은 생략할 수 있습니다.

싸이클은 인터페이스를 상속받기 위해 도구를 사용하는데 이때 표현의 의미는 더 이상 '확장'이 아니라 '구현'이다.

호출할 때 하위 클래스의 인스턴스에 해당하는 인터페이스에 대한 참조를 만들 수도 있습니다.

인터페이스는 개별적으로 인스턴스화할 수 없습니다.

확장 대 구현

확장은 이미 특정 기능이 있고 기능이 더 확장된다는 것을 의미합니다.

구현은 현재 아무것도 없으며 처음부터 구성해야 함을 의미합니다. 

인터페이스는 추상 메서드만 포함할 수 있고 필드의 경우 인터페이스는 정적 상수(최종 정적)만 포함할 수 있습니다.

interface IShape { 
 void draw(); 
 public static final int num = 10; 
} 

 public, static 및 final 키워드는 생략할 수 있습니다. 생략된 num은 여전히 ​​public static 상수를 나타냅니다.

힌트:

1. 인터페이스를 생성할 때 인터페이스 이름은 일반적으로 대문자 I로 시작합니다.

2. 인터페이스의 이름은 일반적으로 품사 "형용사"의 단어를 사용합니다.

3. Ali Coding Specification은 인터페이스의 메소드와 속성에 수정 기호를 추가하여 코드를 간결하게 유지하도록 규정하고 있습니다.

다중 인터페이스 구현

때때로 우리는 클래스가 여러 부모 클래스로부터 동시에 상속되도록 해야 합니다. 이것은 다중 상속을 통해 일부 프로그래밍 언어에서 달성됩니다. 그러나 Java는 단일 상속만 지원하고 클래스는 하나의 부모 클래스만 확장할 수 있습니다. 그러나 다중 상속 인터페이스를 동시에 구현할 수 있고 다중 상속과 유사한 효과를 얻을 수 있습니다.이제 클래스를 사용하여 동물 그룹을 나타냅니다.

class Animal { 
 protected String name; 
 
 public Animal(String name) { 
 this.name = name; 
 } 
} 

 또한 "비행", "달리기" 및 "수영"을 각각 나타내는 일련의 인터페이스를 제공합니다.

interface IFlying { 
 void fly(); 
} 
interface IRunning { 
 void run(); 
} 
interface ISwimming { 
 void swim(); 
} 

다음으로 달릴 수 있는 몇 가지 특정 동물 고양이를 만듭니다.

class Cat extends Animal implements IRunning { 
 public Cat(String name) { 
 super(name); 
 } 
 @Override 
 public void run() { 
 System.out.println(this.name + "正在用四条腿跑"); 
 } 
} 

물고기는 수영할 수 있습니다.

class Fish extends Animal implements ISwimming { 
 public Fish(String name) { 
 super(name); 
 } 
 @Override 
 public void swim() { 
 System.out.println(this.name + "正在用尾巴游泳"); 
 } 
} 

개구리, 달리고 수영할 수 있음(양서류)

class Frog extends Animal implements IRunning, ISwimming { 
 public Frog(String name) { 
 super(name); 
 } 
 @Override 
 public void run() { 
 System.out.println(this.name + "正在往前跳"); 
 } 
 @Override 
 public void swim() { 
 System.out.println(this.name + "正在蹬腿游泳"); 
 } 
}

"오리"라고 불리는 수륙 양용 마법의 동물도 있습니다.

class Duck extends Animal implements IRunning, ISwimming, IFlying { 
 public Duck(String name) { 
 super(name); 
 } 
 @Override 
 public void fly() { 
 System.out.println(this.name + "正在用翅膀飞"); 
 } 
 @Override 
 public void run() { 
 System.out.println(this.name + "正在用两条腿跑"); 
 } 
 @Override 
 public void swim() { 
 System.out.println(this.name + "正在漂在水上"); 
 } 
}

위의 코드는 Java 객체 지향 프로그래밍에서 가장 일반적인 사용법을 보여줍니다. 클래스는 부모 클래스를 상속하고 동시에 여러 인터페이스를 구현합니다.

상속 표현의 의미는 is-a 시맨틱이고 인터페이스 표현의 의미는 xxx 특성을 갖는 것입니다.

고양이는 달릴 수 있는 동물입니다.

개구리는 또한 달리기와 수영을 모두 할 수있는 동물입니다.

오리는 또한 달리고, 수영하고, 날 수 있는 동물입니다.

이 디자인의 장점은 무엇입니까?프로그래머가 유형을 잊어 버릴 수 있도록 다형성의 이점을 항상 염두에 두십시오.인터페이스를 사용하면 클래스 사용자는 특정 유형에 주의를 기울일 필요가 없고 클래스가 특정 능력.

예를 들어 이제 "walk

public static void walk(IRunning running) { 
 System.out.println("我带着伙伴去散步"); 
 running.run(); 
} 

이 걷기 메서드 안에서는 매개변수가 실행될 수만 있다면 어떤 동물이든 상관없습니다.

Cat cat = new Cat("小猫"); 
walk(cat); 
Frog frog = new Frog("小青蛙"); 
walk(frog); 
// 执行结果
我带着伙伴去散步
小猫正在用四条腿跑
我带着伙伴去散步
小青蛙正在往前跳

매개변수도 실행되는 한 "동물"이 될 수 없습니다.

class Robot implements IRunning { 
 private String name; 
 public Robot(String name) { 
 this.name = name; 
 } 
 @Override 
 public void run() { 
 System.out.println(this.name + "正在用轮子跑"); 
 } 
} 
Robot robot = new Robot("机器人"); 
walk(robot); 
// 执行结果
机器人正在用轮子跑

 

추천

출처blog.csdn.net/m0_64397675/article/details/123738636