java_継承、super、書き換え、instance of

16315 ワード

/*
                  .
      ---->              has a     

      ----->                is a   

*/

//   
class Player{

    int num; //  

    String name;

    public Player(int num , String name){
        this.num = num;
        this.name = name;
    }

    public void run(){
        System.out.println(name+"  ...");
    }
}


//   
class Team{

    String name;  //     

    Player p1;  //  1

    Player p2;   //  2

    Player p3;  //  3

    public  Team(String name,Player p1,Player p2,Player p3){
        this.name = name;
        this.p1 = p1;
        this.p2 = p2;
        this.p3 = p3;
    }

    //    
    public void startGame(){
        System.out.println(name+"   !!");
    }
}


class Demo6 
{
    public static void main(String[] args) 
    {
        Player p1 = new Player(12,"  ");
        Player p2 = new Player(7,"C ");
        Player p3 = new Player(11,"   ");
        //  
        Team t = new Team("  ",p1,p2,p3);
        t.startGame();

        System.out.println("  :"+ t.p2.name);
    }
}
/*現在存在する問題:1.これらの2つのクラスの間の継承関係は説明できません。2.重複コードがあります。
対象に向かう三つの特徴:1.パッケージ2.継承3.多形。
継承:継承はキーワードを通じてextensで表現されます。
継承の書式:
class   1 extends   2{

}
継承の注意事項:1.重複コードを減らすために継承しないでください。本当に継承関係がある時だけ継承します。2.親のプライベートメンバーは引き継がれません。3.父の構造関数は継承できません。4.サブクラスオブジェクトを作成するときは、デフォルトでは親の無参構造関数を呼び出します。
*/
//   
class Person{

    String name;

    private int age;

    public  Person(String name){
        this.name = name;
    }

    public Person(){
        System.out.println("Person          ....");
    }

    public void eat(){
        System.out.println(name+"   ...");
    }
}

//   
class Student extends Person {  // Student     Person    , Person     Student   (  、  )

    int num; //  

    public Student(){
        System.out.println("Student          ....");
    }

    public void study(){
        System.out.println(name+"good good study , day day up");
    }   
}




class Demo7 
{
    public static void main(String[] args) 
    {
        Student s = new Student();

        /*
        s.name = "  ";
        System.out.println("  :"+ s.name);
        s.eat();
        */
    }
}
/*
  :               ?         ?

                               。

*/ 
class Fu{

    int x = 10;

    String name;

    public Fu(String name){
        this.name = name;
        System.out.println("Fu d       ...");
    }

    public Fu(){
        System.out.println("Fu        ...");
    }
}


class Zi extends Fu{

    int x = 20;

    public Zi(String name){
        super(name); //               。
    }


    public void print(){
        System.out.println("x1 = "+ x);
    }

}


class Demo8 
{
    public static void main(String[] args) 
    {
        Zi z = new Zi("    "); 
        System.out.println("name= "+z.name);

    }
}
//superキーワード:
superキーワードは親空間の参照を表している。
superキーワードの役割:1.サブカテゴリに同名のメンバーが存在する場合、サブクラスではデフォルトではサブクラスのメンバーにアクセスし、superキーワードで親クラスにアクセスするメンバーを指定することができます。2.サブクラスオブジェクトを作成する場合、デフォルトでは親類無参の構造方法を呼び出し、superキーワードで親類を呼び出す構造方法を指定することができます。
superキーワードの親構造方法の注意事項:1.サブクラスの構造方法に親類を呼び出す構造方法が指定されていない場合、javaコンパイラはサブクラスの構造方法にsuper()文を加えます。2.superキーワードが親のコンストラクタを呼び出す場合、この文はサブコンストラクタの最初の文である必要があります。3.superとthisのキーワードは同じコンストラクタに同時に現れて他のコンストラクタを呼び出すことができません。二つの文は最初の文が必要ですから。
superキーワードとthisキーワードの違い:1.代表するものが一致しない。1.superキーワードは親空間の参照を表しています。2.thisキーワードは、所属関数の使用者オブジェクトを表します。2.使用前提が合わない。1.superキーワードは継承関係がなければ使用できない。2.thisキーワードは継承関係がなくても使用できます。3.コンストラクタを呼び出す違い:1.superキーワードは親のコンストラクタを呼び出すことです。2.thisのキーワードはこのクラスの構造関数を呼び出します。*/
class Fu{

    int x = 10;

    String name;


    public Fu(){
        System.out.println("Fu        ..");
    }

    public Fu(String name){
        this.name = name;
        System.out.println("Fu        ..");
    }


    public void eat(){
        System.out.println("       ..");
    }
}


class Zi extends Fu{

    int x = 20; 

    int num;

    public Zi(String name,int num){
        super(name); //               ...
        this(); //           ..
        //super(); //             。。。
        System.out.println("Zi        ..");
    }

    public Zi(){
        System.out.println("Zi        ..");
    }


    public void print(){
        System.out.println("x = " +super.x);
    }

    public void eat(){
        System.out.println("       ..");
    }
}

class Demo9 {

    public static void main(String[] args) 
    {
        Zi z = new Zi("  ");


    }
}
/*現在の問題:親の機能はサブクラスの需要を満たすことができません。
方法書き換えの前提:引き継ぎの関係が必要です。
方法の書き換え:子の父類は同名の関数を出して、これは方法の書き換えと呼びます。
いつ使用方法の書き換えが必要ですか?父の機能が子供の需要を満たすことができない時。
方法書き換えに注意すること、1.書き換え方法は、メソッド名とイメージリストが一致していなければなりません。2.方法を書き換えた場合、サブクラスの権限修飾子は親クラスの権限修飾子よりも大きいか、または同じでなければなりません。3.方法書き換えの場合、サブクラスの戻り値の種類は、親クラスの戻り値の種類より小さいか、または等しい必要があります。4.メソッドを書き換えた場合、サブクラスから投げられた異常タイプは、親が投げた異常タイプよりも小さいか、または等しいです。Exception(最悪)RuntimeException(小悪い)
方法の再負荷:同じ名前の関数が一つのクラスに2つ以上存在し、方法として再負荷されます。
メソッドの再ロードには、関数名が一致します。2.参照リストが一致していません。3.戻り値タイプには関係ありません。
*/
class Animal{  //        
}

class Fish extends Animal{  //Fish       。
}


class Fu{

    String name;

    public Fu(String name){
        this.name = name;
    }

    public Animal eat() throws RuntimeException {
        System.out.println(name+"   ...");
        return new Animal();
    }
}


class Zi extends Fu{

    String num;

    public Zi(String name){
        super(name);//              
    }


    //     eat  
    public Animal eat() throws Exception{
        System.out.println("     ..");
        System.out.println("   ....");
        System.out.println("    ....");
        System.out.println("   ....");
        System.out.println("   ....");
        System.out.println("    ...."); 
        return new Animal();
    }

}

class Demo10{

    public static void main(String[] args) 
    {
        Zi z = new Zi("    ");
        z.eat();

    }
}
//*instance ofキーワード
instance ofキーの役割:オブジェクトが指定されたカテゴリに属するかどうかを判断します。
instance ofキーワードの使用前提:判断の対象と指定されたカテゴリは継承または実現の関係がある必要があります。
instance ofキーの使用フォーマット:
        instanceof   
instance ofキーワードの役割:現在は役に立たない。でも、あさっては多态まで勉强してからとても役に立ちます。普通、私たちは強制的なタイプの転換をする前に、このキーワードを使ってまず判断してから変換します。
*/
class Animal{

    String name;

    String color;

    public Animal(String name, String color){
        this.name = name;
        this.color = color;
    }
}


//         
class Dog extends Animal {

    public Dog(String name,String color){
        super(name,color); //                。
    }

    public void bite(){
        System.out.println(name+"  !!");
    }
}

//            
class Mouse extends  Animal{

    public Mouse(String name,String color){
        super(name,color);
    }

    public void dig(){
        System.out.println(name+"  ..");
    }

}

class Demo12{

    public static void main(String[] args) 
    {
        Dog d = new Dog("   ","  ");
        System.out.println("     ?"+ (d instanceof Dog));
        System.out.println("      ?"+ (d instanceof Animal));   
        //System.out.println("      ?"+ (d instanceof Mouse));      // false true

        Animal a = new Animal("  ","  "); //    
        System.out.println("      ?"+ (a instanceof Dog));


    }
}