2019年1月15日 星期二

java - 說說JAVA "New" 建構式 回傳值、封裝

(一) 如何執行(run)Java 程式
1.跨平台 => 使用jre 進行不同系統溝通


2.無法執行(run)  class 檔  已經有安裝JRE  且有產生出Class 檔案 卻無法執行 原因.
=> *.class =>  編譯完成
       a) 動態.class 檔案 =>  可以run  => main
       b) 靜態.class 檔案=>  不能run

class ex1     
{
 public static void main(String args[])
 {
 
 
 }


}
=======>> 可以被執行

class ex2
{



}
==========>> 不能被執行 沒有main 方法

(二)物件導向(objed)=> 很多物件導向 程式語言 都可以開發 Data Base
1.objet  (物件導向  多為服務 Data Base)
2.資料庫 => 資料表(Table) => 表格(所有資料物件)
a)每一筆資料物件的屬性,舉例: 可分為標題 欄名稱 、列名稱,  他們需要有相同的屬性 或類型 相同 但是內容可以不同  像是  姓名的欄位  都要填入個人名稱 不能填入  身高體中 等其他不同資料,填入的個人姓名可以不同。


(三) 新增物件的方法
語法:

類別  物件名 = new  類別[(引數)];

※類別  物件名 => 宣告物件名 => 確定物件的referemce = > 使用的 class

※new  類別[(引數)]; =>物件的實例化

※ 類別 跟 類別[(引數)]    要一樣或者有關係

(四).new  => 實例化 步驟
1.stack => 記憶體的堆疊區
2.hoap,初始值 => 存放值的位置
3.執行Constructors 建構式的內容

(五) Coustrudors 建構式
1."new"新增物件最後執行的步驟.
2.語法: 
建構式名([引數])
{
執行的步驟.....
}

建構式名與 class 名稱一樣,新增"NEW" 新增的時候就會啟動建構式


3.變數的生命週期
a) Local 區域
b)alobal 全區
c) 物件類的變數  => this.  變數(field)

4.Overloading
=>參載化多種狀況
a) 名稱一樣
b)引數不一樣

建構式 (英語: Constructor;別稱:構造方法建構函式、建構子)

1.主要用處是:初始化你的成員屬性(變量)
2.構造方法名和類名相同
3.構造方法沒有返回值
4.在創建新對象時,系統自動調用該類的構造方法
5.一個類可以有多個構造方法
6.每個類都有一個默認的構造方法



範例:
class add
{
public static void main(String args[])
{


member m1=new member();
member m2=new member();


System.out.println(m1);
System.out.println(m1.name);
System.out.println(m1.address);
System.out.println(m1.phone);
System.out.println(m1.x);
System.out.println(m1.x2);
System.out.println(m2);



}


}


class member
{
String name;
String address;
int phone;
double x;
boolean x2;

member()
{
System.out.println("新增一位會員"); //與class  同名時 自動啟用建構式

}


}
執行結果:












範例:
class Order
{
String name;
int lcd = 60;
int ram;
int mouse;
int sum;
//int lcd;  已有變數 無法編譯
Order()
{
int lcd; //不同作用域 可以編譯
System.out.println("新增訂單");
}


void show()
{
System.out.println("名:"+name+
"\tlcd:"+lcd+
"\tram:"+ram+
"\tmouse:"+mouse+
"\tsum:"+sum);

}


}
執行結果:






作用域:

class aa :
{

}






範例:
class Order
{
 String name;
 int lcd;
 int ram;
 int mouse;
 int sum;
 
 Order(int lcd)
 {
  this.lcd=lcd; //加上this後 lcd 會變成全局變數
  
  //int lcd=80;
  //System.out.println("新增訂單");
 }
 
 
 void show()
 {
  System.out.println("名:"+name+
  "\tlcd:"+lcd+
  "\tram:"+ram+
  "\tmouse:"+mouse+
  "\tsum:"+sum);
 
 }


}



class add2
{
 public static void main(String args[])
 {
  Order o1=new Order(60);
  
  
  o1.show();
 
 }



}
執行結果:





範例:
class Order
{
String name;
int lcd;
int ram;
int mouse;
int sum;

Order(String name,int lcd,int ram,int mouse)
//要傳入多少變數  就需要放多少值進去
{
this.name=name;
this.lcd=lcd;
this.ram=ram;
this.mouse=mouse;

sum=lcd*4999+ram*1280+mouse*650;
//sum 沒有轉成全局變數 所以可傳值回去
//this.sum=this.lcd*4999+this.ram*1280+this.mouse*650;

//int lcd=80;
//System.out.println("新增訂單");
}


void show()
{
System.out.println("名:"+name+
"\tlcd:"+lcd+
"\tram:"+ram+
"\tmouse:"+mouse+
"\tsum:"+sum);

}


}


class add2
{
public static void main(String args[])
{
Order o1=new Order("abc",1,1,1);//要傳入多少變數  就需要放多少值進去


o1.show();

}



}
執行結果:




範例:
class Order
{
String name;
int lcd;
int ram;
int mouse;
int sum;

Order(String name,int lcd,int ram,int mouse)//上面有加上名子所以 如果回傳參數有此值 會自動引用此方法
{
this.name=name;
this.lcd=lcd;
this.ram=ram;
this.mouse=mouse;

sum=lcd*4999+ram*1280+mouse*650;
//this.sum=this.lcd*4999+this.ram*1280+this.mouse*650;

//int lcd=80;
//System.out.println("新增訂單");
}

Order(int lcd,int ram,int mouse)//下方無名子所以  會自動引用此方法
{
this.lcd=lcd;
this.ram=ram;
this.mouse=mouse;

sum=lcd*4999+ram*1280+mouse*650;
}


void show()
{
System.out.println("名:"+name+
"\tlcd:"+lcd+
"\tram:"+ram+
"\tmouse:"+mouse+
"\tsum:"+sum);

}


}
class add2
{
public static void main(String args[])
{
Order o1=new Order(1,1,1); //根據的不同會傳的參數也會不相同


o1.show();

}



}
執行結果:




範例:
class Order
{
String name;
int lcd;
int ram;
int mouse;
int sum;

Order(String name,int lcd,int ram,int mouse)
{
this.name=name;
this.lcd=lcd;
this.ram=ram;
this.mouse=mouse;

sum=lcd*4999+ram*1280+mouse*650;
//this.sum=this.lcd*4999+this.ram*1280+this.mouse*650;

//int lcd=80;
//System.out.println("新增訂單");
}

Order(int lcd,int ram,int mouse)
{
this.lcd=lcd;
this.ram=ram;
this.mouse=mouse;

sum=lcd*4999+ram*1280+mouse*650;
}

Order(String name,int lcd)
{
}
Order(int lcd,int ram)
{
}
Order(int lcd,String name) //跟上方位置不同所可執行
{
}

/*Order(int x,int y) //執行會報錯 應為上限 以已經有相同 int + int 的類型
{
}*/
void show()
{
System.out.println("名:"+name+
"\tlcd:"+lcd+
"\tram:"+ram+
"\tmouse:"+mouse+
"\tsum:"+sum);

}


}


class add2
{
public static void main(String args[])
{
Order o1=new Order(1,1,1);


o1.show();

}



}



(六) UML (unified Modeling Language)
類別圖
Ex: 設計學員成就管理系統
需求 1
每一筆 學生成績紀錄多個引用
=> 名子 國 英文 數學  總分 平均
=> 資料庫要保密
需求2
新增方式
a) 列入 名稱 國 英文 數學
b) 計算 總分平均
c)分數需 0~ 100

(七) Methods 方法
1. 需先搭配封裝 原則
2. 主要目的應用 =>讀取與修改fild 內容

3.語法:
類型   方法名(引數)
{
步驟.........
}

4.類型分為
a. 不傳值類 => void
b) 傳值類  => return

代碼: 

class student
{
private String name;
     private int chi;
     private int eng ;
     private int math;
private int sum;
     private double ave ;

student(String name,int chi,int eng,int math)
{
if (chi >= 0 && chi <=100 && eng>=0 && eng<=100 && math>=0 && math<=100)
{this. name =  name;
         this. chi = chi;
         this. eng = eng ;
         this. math = math;

sum =  chi + eng + math;

ave =   sum/ 3;
     

}

}

void show()
{
System.out.println("姓名:"+name+
"\t國語:"+chi+
"\t英文:"+eng+
"\t數學:"+math+
"\t總分:"+math+
"\t平均:"+ave);

}

}
class add3
{
public static void main(String args[])
{
student o3=new student("王大名",21,11,21);


o3.show();
//s.eng =  85

o3.show();

}



}

#Methods(方法)
1.封裝原則 =>field
2.主要應用目的 =>設計程式開發完成後,所需的修改與讀取或其他功能
=> read ; write 

3.語法:

類型  方法名[ 引數 ]    => 宣告
{
步驟........ ) 方法內容 (body)
}

4.類型
a) 不傳值 =>void  
b) 傳值     =>return      與 "= " 等號( assign ) 的意思一樣
return 只能傳一個數值回來(傳回方法名)

5.overloading
a) 名稱一樣
b) 引數不一樣


6. 常使用命名習慣 getter / setter 
read => 讀取類型  = >  get 方法名( )  (傳值類)
write=> 修改類型 = >  set   方法名()  ; void 
class student
{
private String name;
     private int chi;
     private int eng ;
     private int math;
private int sum;
     private double ave ;
 
student(String name,int chi,int eng,int math)
{
if (chi >= 0 && chi <=100 && eng>=0 && eng<=100 && math>=0 && math<=100)
{this. name =  name;
         this. chi = chi;
         this. eng = eng ;
         this. math = math;
 
sum =  chi + eng + math;
 
ave =   sum/ 3;
         
 
}
 
 
 
}
 
void changeChi(int chi)  //執行完成後 消失
{
this.chi = chi;
sum =  chi + eng + math;
ave =   sum/ 3;
}
 
 
int changeChi2(int chi)   //前面如果為void  不會有回傳值
                          // 如果加上  int 代表有回傳值   需要跟reture  的類型相同
{
this.chi = chi;
sum =  chi + eng + math;
ave =   sum/ 3;
return  chi   ;   //需跟上面  同一個類型 都為 int
}
 
void setName(String name)  //set 命名可以被修改類
{
this.name=name;
}
String getName()            //get 命名可以被  讀取類
{
return name;
}
void setChi(int chi)        //set 命名可以被修改類  
{
this.chi=chi;

}

void setEng(int eng)        //set 命名可以被修改類
{
this.eng=eng;

}


void abc(int x)
{
}

void abc(int x,int y)
{

}

/*void abc(int a,int b)//會報錯 上面已有相同類性
{
}*/

int abc(double z,int a)
{
return 0;
}

int abc(double z,int a,int u)
{
return 0;
}

void show()
{   

    sum=chi+eng+math;
        ave=sum/3.;         //把最後結果寫在 輸出的地方  可以減少錯誤或忘記





System.out.println("姓名:"+name+
"\t國語:"+chi+
"\t英文:"+eng+
"\t數學:"+math+
"\t總分:"+math+
"\t平均:"+ave);

}
 

}


class add3
{
public static void main(String args[])
{
student o3=new student("王大名",21,11,21);
student o6=new student("陳牙牙",89,81,34);

System.out.println("=========================");
//s1.changeChi(80);
//s2.changeChi(77);
o3.changeChi2(80);
o6.changeChi2(77);
System.out.println("=========================");



o3.show();
//s.eng =  85
o3.changeChi(100);
o3.show();

System.out.println("加總="+(o3.changeChi2(1)+o6.changeChi2(2)));
o3.show();
o6.show();
}



}
執行結果:


沒有留言:

張貼留言