2019年6月22日 星期六

java - 繼承 inher itaue

 繼承  inher itaue     => 就是繼承父類別
( 一 ) 條件:
   同一機構(同一資料)
   多個Class 中將相同意思
   的 attribute (  field metlod)
   同定義在 Class

範例:

1)A => A () ;
=> reference
=> is a

A is a A
A is a school


A has a   eng
A has a shour()
A has a name
A has a chi


B  is a B
B  is a school
B har a math
B  has  a shiw( )
B has a name
B has a chi







例子:
class A extends school
{

int eng;

void show()
{
System.out.println("名:"+name+
"\t國文:"+chi+
"\t英文:"+eng);
}
}


class B extends school
{

int math;

void show()
{
System.out.println("名:"+name+
"\t國文:"+chi+
"\t數學:"+math);
}
}


class add
{
public static void main(String args[])
{
A a=new A();
B b=new B();

a.show();
b.show();

}
}

class school
{
String name;
double chi;

}
執行結果:







繼承 ( 應用 )
( 一 ) 先處理 1s - a 關係( 繼承 成功 )
  =>  coustrutors
 1.一定要繼承 一定會要執行
=> superClass  的建構式

2.superClass  與  subClass 都有建構式
執行 順序為 => super => sud
                           (父 ===>子)

3.superClass 的建構式 有設計需要為 合引數 =>   繼承的子類別 需透過子類別的建構式 給 superClass 引數
=> ※super (值; 變數);

4.父類別建構式為 Overloading
=> 繼承的子類別只需要選一個繼承 即可










( 二 ) 分析方式  = > 每個class
             1. coupling   => 耦合 = > 相依性 => 相同意思的屬性,每個class  共同屬性
 
             2.cohesion = > 內聚力 => 相關性=> 每個class 自己才有個屬性其他class沒有


          (  父 )                   ( 子 )                 ( 繼承 )
(三) superClass     ,     subClass        ,     extends


( 四 ) 新增物件方式 =>   new 子類別物件

( 五 ) 判斷物件的類型 (reference ) 與 屬性 (  field  , method )

先 => 1  is   a => 確定此子類別一共具有多少class  reference
          ( 包括自己與   super class  數量 )


在 =>  2. has - a => 確定 reference 後 在查找有多少屬性可以使用
              (  field  , method )    =>  cal  by value






給定下面程式碼,哪些選項的描述是對的?(選擇3個) (答案) : A .C .E
 02. class Dog extends Animal{Tail tail;}
 03. class Beagle extends Dog{public void jumper(){}}
 04. class Cat extends Animal{public void jumper(){}}

 A. Cat is-a Animal
 B. Cat is-a jumper
 C. Dog is-a Animal
 D. Dog is-a jumper
 E. Beagle has-a Tail




1.程式碼如下,請問最後結果為何?   
 01. class Excute{
 02.    public static void main(String args[]){
 03.       int[] a={4,3,2};
 04.       int i=a.length>0 ? a[0]:null;
 05.       System.out.println(i);
 06.     }
 07.  }

 A. 4
 B. 3
 C. 2
 D. null
 E. 編譯失敗

\\ 答案LB    length 為3  因{4,3,2}

2.程式碼如下,請問最後結果為何?  

   
 01. import java.util.Arrays;
 02. class Search{
 03.    public static void main(String args[]){
 04.       String a[]={"b","r","g","y","o"};
 05.       Arrays.sort(a);
 06.       int i1=Arrays.binarysearch(a,"o");
 07.       int i2=Arrays.binarySearch(a,"v");
 08.       System.out.println(i1+""+i2);
 09.   }
 10. }

 A.  3-4
 B.  3-5
 C.  2-5
 D.  2-4
 E.  編譯失敗
 F.  執行失敗

答案 :  C  因為 Arrays.sort會進行排序  順序變成
 a[]={"b","g","o","r","y"};    因為沒有 V  所以回傳 負數   
3.程式碼如下,請問最後結果為何? 01. import java.util.Arrays; 02. class Execute{ 03. public static void main(String args[]){ 04. String[] a[]={{"1","2"},{"3","4","5"}}; 05. String[][] b=a; 06. System.out.println(b[1][2]); 07. } 08. } A. 1 B. 2 C. 3 D. 4 E. 5 F. 編譯失敗 G. 執行失敗

答案 :  G     a 會傳直 給 B    所以 a 跟 B 一樣   [1][2] 會是 5 
4.程式碼如下,請問最後結果為何? 01. String[] str=null; 02. System.out.println(str.length); A. 0 B. null C. 1 D. 編譯失敗 E. 執行失敗 答案是 E 因length 是陣列數量 但值為空值 故找不到 所以抱錯! 如果改成 System.out.println(str); 答案會換成B 空值 5.程式碼如下,請問最後結果為何? 01. import java.util.Arrays; 02. class Execute{ 03. public static void main(String args[]){ 04. String[] s1={"1","2","3"}; 05. String[] s2={"4","5","6"}; 06. s1=s2; 07. for(String str:s1) 08. {System.out.println(str);} 09. } 10. } A. 123 B. 456 C. 編譯失敗 D. 執行失敗

答案是 B  同第三題  S1 會跟S2 一樣 故打印出來 是 456

舉例:

class school
{
private String name;
private int chi;


school(String name)
{
this.name=name;
System.out.println("新增一位school學生 name="+this.name);
}

school(String name,int chi)
{
this.name=name;
System.out.println("新增一位school學生 name="+this.name+chi);
}




}
class A extends school
{
    ing eng;

A(String name,int eng)
{
super(name);
this.eng = eng;
System.out.println("A班學員"+this.eng);

}

A(String  name,int chi,int eng)
{
/*建構式的兩個值 (name,chi) 加上 eng

*/
super(name,chi);
this.eng=eng;   
System.out.println("A班學員 eng="+this.eng);
}

}
import java.util.Arrays;
class add
{
public static void main(String args[])
{

school s=new school("a",75);
//A a = new A("rr",98);


}

}

class A_1  extends A
{
private int word;
A_1(String name, int chi ,int eng.int word)
{
super(name,chi,eng);
this.word = word
System.out.println("111");
}
}

class B extends school
{
   private int math;
 
   B(String name,int chi ,int math)
   {
     super (name,chi);
this.math =math;
   }
}
class B_1 extends B
{
         private  int exxel;
         B_1 (String name,int chi ,int math,int excel)
{
super(name,chi,math);
this.exxel = excel;

}
}
執行結果:





繼承
( 三 ) has - a =>( field,method)
1.field  => 沒有 設定 封裝 直接繼承

2.method => 應用狀況
a)  Overriding => 多種狀況   同 一 classs 或 不同 class  都可設計


      1). 多稱一樣
     2)  引數不一樣

b) Override   => 子類別方法把反類別方法  至換掉.

               1) 名稱 一樣 引數 一樣
               2) 類型(傳值 ,不傳值) 也要一樣   只要符合第一點會強制要求

              3) 如果父類別的方法有設定封裝權限 子類別方法的權限 要比父類別大 或 相等
             
              => public > protected > (沒寫)   > private
              => super ".點"  方法


類別     變數    =   new      類別(引數);


類別 =>  call    by  referene    => 確定物件類型 (所有 is  - a)  => 檢查方法(名稱)

















class school
{
private String name;
private int chi;


school(String name)
{
this.name=name;
System.out.println("新增一位school學生 name="+this.name);
}

school(String name,int chi)
{
this.name=name;
this.chi = chi;
//System.out.println("新增一位school學生 name="+this.name+chi"\t國文:" + chi);
}
 
String getName()
{
return name;
}

int getChi()
{
return chi;
}

void setName(String name)
{

this.name=name;
}

void setChi(int chi)
{

this.chi=chi;
}

void change(String name)
{
this.name=name;
}

void change(int chi)
{

this.chi=chi;
}
void change(String name,int chi)
{
this.name=name;
this.chi=chi;
}

protected String show()
{

return "名:"+name+"\t國文:"+chi;
}

}

class A extends school
{
    private  int eng;

A(String name,int eng)
{
super(name);
this.eng = eng;
System.out.println("A班學員"+this.eng);

}

A(String  name,int chi,int eng)
{
/*建構式的兩個值 (name,chi) 加上 eng

*/
super(name,chi);
this.eng=eng; 

//System.out.println("A班學員 eng="+this.eng);
}

int getEng()
{
return eng;
}
void change(String name,int chi,int eng)
{

}

void setEng(int eng)
{

this.eng=eng;

}

public String show()
{
return super.show()+"\t英文:"+eng;
}

/*
public String show()
{
return "名字:"+getName()+"\t國文 :"+getChi()+"\t英文:"+eng;
}
*/
}

import java.util.Arrays;
class add
{
public static void main(String args[])
{

//school s=new school("a",75);
//A a = new A("rr",98);
 


A a=new A("a",78,89);
System.out.println(a.show());
/*
System.out.println("======================");

a.setName("qq");

System.out.println("名:"+a.getName());
System.out.println(a.show()); //原本國文60  下面使用  方法修改
System.out.println("======================");
//a.setChi(60); //修改成60
achange("qq")

System.out.println("名:"+a.getChi());
System.out.println(a.show());
*/

}

}

class A_1  extends A
{
private int word;
A_1(String name, int chi ,int eng.int word)
{
super(name,chi,eng);
this.word=word;
}
}
執行結果:







Polymorphic  多型 (new 物件)
(一) 條件背景 => 繼承應用
        多個子類別  有共同 父類別
(二)   new  物件語法 :   異質 宣告物件

父類別    物件名  = new    子類別(引數)

.上面  父類別 跟 子類別   需要有  繼承關係


 父類別
1.call  by  refereme 
2. 物件  15 - a
3.確定 物件呼叫方法  有此名子

 子類別
1.call   by  value
2.執行時找內容的起點  class

※使用得方法 使限定
1.override
2.繼承

(三) 真正活用  => 搭配陣列




















class student
{
private String name;

student(String name)
{
this.name=name;
}

String show()
{
return "名:"+name;
}


void setName(String name)
{

this.name=name;
}

void setWord(int word)
{
}


}

class SA extends student
{
private int word;

SA(String name,int word)
{
super(name);
this.word=word;

}
String show()
{

return super.show()+"\tword:"+word;
}
   
void setWord(int word)
{
this.word=word;
}

}


class SB extends student
{
private int excel;

SB(String name,int excel)
{
super(name);
this.excel=excel;

}
String show()
{

return super.show()+"\texcel:"+excel;
}

}


class add2
{
student[][] s=
{

{
new SA("a1",78),
new SA("a2",78),


}
,
{

new SB("b1",77),
new SB("b2",77),
new SB("b3",77),

}



};

for(int i=0;i<s.length;i++)
{
for(int j=0;j<s[i].length;j++)
{
System.out.println("s["+i+"]["+j+"]="+s[i][j]+"\t"+s[i][j].show());

}
System.out.println();

}
System.out.println("==========================");

s[0][0].setWord(88);
for(int i=0;i<s.length;i++)
{
for(int j=0;j<s[i].length;j++)
{
System.out.println("s["+i+"]["+j+"]="+s[i][j]+"\t"+s[i][j].show());

}
System.out.println();

}

/*
SA s1=new SA("a",78);
SB s2=new SB("b",77);


student s1=new SA("a",78);
student s2=new SB("b",77);

System.out.println(s1.show());
System.out.println(s2.show());

System.out.println("==========================");

s1.setName("rrr");
s1.setWord(88);

System.out.println(s1.show());
System.out.println(s2.show());
*/


}


}

執行結果: