JAva 100例#6

3497 ワード

抽象クラス


抜粋:他のクラスの共通フィーチャーのみを抽象的に宣言します(戻り値はなく、メソッド名のみを宣言します).具体的な内容はありません.
クラスにabstractメソッドがある場合は、クラスにabstractを抽象クラスとして追加する必要があります.これにより、エラーは発生しません.
  • 抽象クラスを使用して継承を使用します.
  • 抽象(親)クラスを継承するサブクラスで、オーバーライド(再定義)メソッドを使用します.
  • メソッド宣言のみのため、オブジェクトを作成できません.
    したがって、抽象クラスを継承するサブクラスには、強制性があり、抽象メソッドが含まれている必要があります.
  • (抽象クラスには、通常のメソッドも含まれます.)

    //Animal a = new Animal(); = Err
    サブクラスが抽象メソッドを使用したくない場合は、サブクラスを抽象クラスとして作成することもできます.

    インタフェース


    :相互通信のための仕様(または標準化)
    インタフェースは複数のオブジェクトと一緒に使用できるため、コードを変更せずに実行内容と戻り値を多様化できるという利点があります.
    インタフェースを使用するクラスは、インタフェースで宣言する方法を実装する必要があります.
    抽象クラスvsインタフェース
    共通点:
    具体的な内容がないため、継承されたクラスは上書きされて使用されます.
    差異:

  • 抽象化の度合いが高く,インタフェースには一般的な方法がない.

  • 抽象クラス:class/extends

  • インタフェース:インタフェース/インプリメンテーション

  • 継承と実装
    インタフェースは多相であってもよい(抽象的な宣言しかできないため、この方法はサブメソッドによって実現される)
    抽象クラスは単一の継承にのみ使用されます.(親から受け継いで、子供はもっと大きい)

  • 優先順位は継承です.
    ex) class a extends b implements c,d
  • インタフェース変数フィールドは定数のみです.
  • 共通静的finalデータ型=定数;
    (コンパイル中に自動的に貼り付けて「public static final」を省略)
    静的なので、オブジェクトを作成する必要はありません.
    (「インタフェース名.変数名」はmainで使用可能)
    同様に、インタフェース内のすべての方法はabstractであり、「public abstract」を省略することができる.
    .
    .
    .
    .
    .
    .
    class Person{
    	String name;
    	int age;
    	int weight;
    	
    	Person(){}
    	Person(String name,int age, int weight){
    		this.name = name;
    		this.age =age;
    		this.weight = weight;
    	}
    	
    	void wash() {System.out.println("씻는 중");}
    	void study() {System.out.println("공부 중");}
    	void play() {System.out.println("노는 중");}
    	
    }
    
    interface Allowance{
    	//인터페이스라서 일반 메소드 작성 불가능
    	abstract void in(int price, String name);
    	abstract void out(int price, String name);
    }
    
    interface Train{
    	//인터페이스라서 상수만 가능
    	public static final int aa = 1;
    	int bb =2; 
    	
    	void train(int training_pay, String name);
        
        //public static final, abstract 생략 가능
    }
    
    class Student extends Person implements Allowance, Train{
    	//우선 순위 : 상속 > 구현
    	
    	Student(){}
    	Student(String name,int age, int weight){
    		super(name,age,weight);
    	}
    	
    	//추상메서드 먼저 구현
    	public void train(int training_pay, String name) {System.out.printf("%s-->%d원 입금%n",name,training_pay);}
    	public void in(int price, String name) {System.out.printf("%s으로부터 %d원 수익%n",name,price);}
    	public void out(int price, String name) {System.out.printf("%d원 지출 [ 지출용도 = %s ]%n",price,name);}
    }
    
    public class ex2 {
    	public static void main(String[] args) {
    		//A, B인터페이스(부) implements
    		//Person 클래스(부) extends
    		//Student 클래스(자)
    		
    		System.out.println(Train.aa);
    		//인터페이스에 있는 상수변수라 객체 생성없이 사용가능 (static)
    		
    		Student s1 = new Student("밍",23,2);
    		
    		
    		//클래스와 인터페이스로부터 상속, 구현받은 메소드 호출
    		s1.play();
    		s1.in(1000, "복권");
    		
    	}
    }
    .
    .
    .
    .
    .
    .
    .
    .
    ニャー、共役出力インタフェースSoundableの例
    public interface Soundable {String sound();}
    
    class Cat12 implements Soundable{
    	@Override
    	public String sound() {return "야옹";}
    }
    class Dog12 implements Soundable{
    	public String sound() {return "멍멍";}
    }
    
    
    public class ex5 {
    	private static void printSound(Soundable soundable) {
    		System.out.println(soundable.sound());
    	}
    	
    	public static void main(String[] args) {
    		printSound(new Cat12());
    		printSound(new Dog12());	
    	}
    }