Java 추상 정의 분석 예
1. 개요
OOP의 개념에서는 모든 객체가 클래스를 통해 설명되지만 모든 클래스가 객체를 설명하는 데 사용되는 것은 아닙니다. 클래스에 구체적인 객체를 설명하기에 충분한 정보가 포함되어 있지 않은 경우 이러한 클래스를 추상 클래스라고 합니다.
추상 클래스: (1) 추상 클래스는 객체를 인스턴스화할 수 없습니다. 객체가 인스턴스화되면 컴파일이 통과되지 않습니다. 추상 클래스의 비추상 서브클래스만이 멤버 변수, 멤버 메소드, 생성자 등을 포함할 수 있는 객체(2)를 생성할 수 있습니다. (3) 생성자와 클래스 메서드(정적으로 수정된 메서드)는 추상 메서드로 선언할 수 없습니다.
추상 메서드: (1) 클래스에 추상 메서드가 포함되어 있으면 클래스는 추상 클래스여야 합니다. (2) 모든 하위 클래스는 쓰기를 반복해야 합니다. 상위 클래스의 추상 메서드를 사용하거나 자신을 추상 클래스로 선언합니다
정의: 추상 클래스 클래스 이름
2. 예: 농부는 동물에게 먹이를 줍니다
동물: 추상 클래스-------getName(), move( ), drink()
Reptile, Mammal: 추상 클래스 상속
Snake, Tiger, Goat, Rabbit: Reptile 또는 Mammal 각각 상속
fammer: BringWater(), FeedWater(동물)---- 담당 물을 가져오기 위해 지정된 장소로 이동한 후, 동물은 목적지로 이동하여 물을 마십니다
코드는 다음과 같습니다.
package abstractDemo; /** * @author lpx * @Description TODO * @date 2021-04-07 */ public abstract class Animal { abstract String getName(); abstract void move(String destination); abstract void drink(); } abstract class Reptile extends Animal{ } abstract class Mammal extends Animal{ } class Tiger extends Mammal{ private static String name="tiger"; @Override String getName() { return this.name; } @Override void move(String destination) { System.out.println("tiger move to "+destination+"."); } @Override void drink() { System.out.println("tiger lower it is head and drink"); } } class Goat extends Mammal{ private static String name="goat"; @Override String getName() { return this.name; } @Override void move(String destination) { System.out.println("goat move to "+destination+"."); } @Override void drink() { System.out.println("goat lower it head to drink"); } } class Rabbit extends Mammal{ private static String name="rabbit"; @Override String getName() { return this.name; } @Override void move(String destination) { System.out.println("rabbit move to "+destination+"."); } @Override void drink() { System.out.println("rabbit put out it is tongue and drink"); } } class Snake extends Reptile{ private static String name="snake"; @Override String getName() { return this.name; } @Override void move(String destination) { System.out.println("snake move to "+destination+"."); } @Override void drink() { System.out.println("snake dived into and drink"); } } class Farmer{ public void bringWater(String destination){ System.out.println("Farmer bring water to " + destination + "."); } public void feedWater(Animal a){ // polymorphism this.bringWater("Feeding Room"); a.move("Feeding Room"); a.drink(); } } class Test{ public static void main(String[] args) { Farmer fm=new Farmer(); Snake snake=new Snake(); Goat goat=new Goat(); Tiger tiger=new Tiger(); Rabbit rabbit=new Rabbit(); fm.feedWater(snake); fm.feedWater(goat); fm.feedWater(tiger); fm.feedWater(rabbit); } }
실행 결과:
요약:
각 동물이 한다면 음료 및 이동 방법을 추상화하지 않으면 다형성을 달성할 수 없습니다. 농부 클래스는 다양한 매개변수에 따라 여러 FeedWater를 오버로드해야 합니다. 계속해서 동물을 추가하면 재장전 횟수가 늘어납니다. 비교와 이해를 돕기 위해 코드도 다음과 같습니다.
package abstractDemo; /** * @author lpx * @Description TODO * @date 2021-04-07 */ class Tiger1{ private static String name="tiger"; String getName() { return this.name; } void move(String destination) { System.out.println("tiger move to "+destination+"."); } void drink() { System.out.println("tiger lower it is head and drink"); } } class Goat1{ private static String name="goat"; String getName() { return this.name; } void move(String destination) { System.out.println("goat move to "+destination+"."); } void drink() { System.out.println("goat lower it head to drink"); } } class Rabbit1{ private static String name="rabbit"; String getName() { return this.name; } void move(String destination) { System.out.println("rabbit move to "+destination+"."); } void drink() { System.out.println("rabbit put out it is tongue and drink"); } } class Farmer1{ public void bringWater(String destination){ System.out.println("Farmer bring water to " + destination + "."); } public void feedWater(Goat1 goat){ // polymorphism this.bringWater("Feeding Room"); goat.move("Feeding Room"); goat.drink(); } public void feedWater(Tiger1 tiger){ // polymorphism this.bringWater("Feeding Room"); tiger.move("Feeding Room"); tiger.drink(); } public void feedWater(Rabbit1 rabbit1) { this.bringWater("Feeding Room"); rabbit1.move("Feeding Room"); rabbit1.drink(); } } public class Test1{ public static void main(String[] args) { Farmer1 farmer1=new Farmer1(); Tiger1 tiger1=new Tiger1(); Goat1 goat1=new Goat1(); Rabbit1 rabbit1=new Rabbit1(); farmer1.feedWater(tiger1); farmer1.feedWater(goat1); farmer1.feedWater(rabbit1); } }
이 예제를 직접 입력했는데 예전에는 기본이 매우 중요하다는 것을 깨달았습니다. , 그래서 여러 곳에서 혼란을 야기했는데 왜 그렇게 썼는지 모르겠습니다.
(1) .java 파일에는 여러 클래스를 정의할 수 있지만, 하나만 공개로 정의할 수 있으며 클래스 이름은 파일 이름과 동일해야 합니다.
(2) 추상 클래스는 해당 클래스를 재정의하지 않고 추상 클래스를 상속합니다. 추상 메서드(이유도 매우 간단합니다. 추상적이고 메서드 본문을 구현할 수 없습니다.) 비추상 클래스는 추상 클래스를 상속하지만 추상 메서드를 재정의해야 하며 비추상 메서드는 필요하지 않습니다.
(3) 재작성과 오버로딩의 차이점(고주파 인터뷰 질문?)
오버로딩: 메소드 이름은 동일하지만 매개변수가 다릅니다. 이는 컴파일 시간 다형성
Rewriting에 속합니다. 하위 클래스는 상위 클래스의 @Override 메서드를 재정의합니다. 런타임 다형성에 속합니다
위 내용은 Java 추상 정의 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.
