# [Java] 類別(3) 建構元的多載
###### tags: `Java` `建構元` `多載`
---
```java=
class Car
{
private int age;
private String brand;
public Car(int a, String b) {
age = a;
brand = b;
}
public Car(int a) {
age = a;
}
public Car(String b) {
brand = b;
}
public void show() {
System.out.println("Brand is " + brand + ", Age is "+age);
}
}
public class app2_1
{
public static void main(String args[])
{
Car cir1 = new Car(5, "benz");
Car cir2 = new Car(5);
Car cir3 = new Car("benz");
cir1.show();
cir2.show();
cir3.show();
}
}
```
output:
Brand is benz, Age is 5
Brand is null, Age is 5
Brand is benz, Age is 0
---
再使用更多的多載建構元
```java=
class Car
{
private int age;
private String brand;
public Car(int a, String b) {
age = a;
brand = b;
}
public Car(int a) {
age = a;
}
public Car(String b) {
brand = b;
}
public Car() {
age = 1;
brand = "toyota";
}
public void show() {
System.out.println("Brand is " + brand + ", Age is "+age);
}
}
public class app2_1
{
public static void main(String args[])
{
Car cir1 = new Car(5, "benz");
Car cir2 = new Car(5);
Car cir3 = new Car("benz");
Car cir4 = new Car();
cir1.show();
cir2.show();
cir3.show();
cir4.show();
}
}
```
output:
Brand is benz, Age is 5
Brand is null, Age is 5
Brand is benz, Age is 0
Brand is toyota, Age is 1
---
多載的建構元呼叫另一個多載的建構元
```java=
class Car
{
private int age;
private String brand;
public Car(int a, String b) {
age = a;
brand = b;
}
public Car() {
this(5, "toyota"); // 呼叫第5行的建構元Car(int a, String b)
}
public void show() {
System.out.println("Brand is " + brand + ", Age is "+age);
}
}
public class app2_1
{
public static void main(String args[])
{
Car cir1 = new Car(); // 呼叫第9行的建構元Car()
cir1.show();
}
}
```
output:
Brand is toyota, Age is 5
---
透過類別變數來計算呼叫建構元的次數
```java=
class Car
{
private int age;
private static int count=0; //宣告count為類別變數
private String brand;
public Car(int a, String b) {
age = a;
brand = b;
}
public Car() {
this(5, "toyota");
count++;
}
public void show() {
System.out.println("Brand is " + brand + ", Age is "+age);
}
public void show_count() {
System.out.println("count is "+count);
}
}
public class app2_1
{
public static void main(String args[])
{
Car cir1 = new Car(); // 呼叫一次建構元 count+1
cir1.show();
Car cir2 = new Car(); // 再呼叫一次建構元 count+1
cir2.show();
cir2.show_count();
}
}
```
output:
Brand is toyota, Age is 5
Brand is toyota, Age is 5
count is 2
---
將物件A設給物件B
再修改物件A的資料
去觀察物件A與物件B的資料內容
```java=
class Car
{
private int age;
private String brand;
public Car(int a, String b) {
age = a;
brand = b;
}
public Car() {
this(5, "toyota");
}
public void show() {
System.out.println("Brand is " + brand + ", Age is "+age);
}
public void set(int a, String b) {
age = a;
brand = b;
}
public void compare(Car c) {
if(this.age > c.age) {
System.out.println("car1's age is bigger than car2");
}else if(this.age < c.age) {
System.out.println("car2's age is bigger than car1");
}else {
System.out.println("the same");
}
}
}
public class app2_1
{
public static void main(String args[])
{
Car car1 = new Car();
car1.show();
Car car2 = new Car();
car2.show();
car1.compare(car2); // 比較兩個車子物件的age
car2.set(10, "benz"); // 更改物件car2的兩個資料成員內容
car2.show();
car1.compare(car2); // 再比較兩個車子物件的age
car1 = car2; // 物件car1指到物件car2,此時兩個物件的內容均等
car2.set(8, "mazda"); // 改變物件car2的兩個資料成員
car1.compare(car2); // 注意!上一行改變物件car2的兩個資料成員的同時,物件car2的兩個資料成員也同時改變
System.out.println("+++++++++++++++++++++");
int i=5,j=i; // 簡單的變數與物件不同
System.out.println("i = "+i+", j = "+j);
i = 6; // 不會改變j的值
System.out.println("i = "+i+", j = "+j);
}
}
```
output:
Brand is toyota, Age is 5
Brand is toyota, Age is 5
the same
Brand is benz, Age is 10
car2's age is bigger than car1
the same
+++++++++++++++++++++
i = 5, j = 5
i = 6, j = 5
可觀察程式碼第46行,將物件car2設給物件car1,其實等同於物件car1「指向」car2,而當物件car2資料成員變動時,物件car1的資料成員內容亦變動。
---
進階範例1.
兩個物件可以拿來比較是否相等
```java=
class Car
{
private int age;
private String brand;
public Car(int a, String b) {
age = a;
brand = b;
}
public Car compare(Car c) {
if(this.age > c.age) {
return this;
}else {
return c;
}
}
}
public class app2_1
{
public static void main(String args[])
{
Car car1 = new Car(5, "benz");
Car car2 = new Car(8, "toyota");
Car car3;
car3 = car1.compare(car2);
if(car3 == car1) {
System.out.println("car1的age比較大");
}else {
System.out.println("car1的age沒有比較大");
}
}
}
```
output:
car1的age沒有比較大
---
進階範例2.
學習使用物件陣列
```java=
class Car
{
private int age;
private String brand;
public Car(int a, String b) {
age = a;
brand = b;
}
public static String compare(Car a[]) {
int find_max = a[0].age;
String max_car = a[0].brand;
for(int i=0; i<a.length; i++) {
if(find_max < a[i].age) {
find_max = a[i].age;
max_car = a[i].brand;
}
}
return max_car;
}
}
public class app2_1
{
public static void main(String args[])
{
Car c[] = new Car[3]; // 宣告物件陣列c,此宣告3個車子物件
c[0] = new Car(3, "mazda");
c[1] = new Car(5, "toyota");
c[2] = new Car(10, "benz");
System.out.println(Car.compare(c)+"的age最大"); // 要記得compare函數是被宣告為static,也就是可以將類別名稱當作名稱空間來呼叫函數
}
}
```
output:
benz的age最大
---
撰寫內部類別
```java=
public class app2_1
{
public static void main(String args[])
{
Car c[] = new Car[3]; // 宣告物件陣列c,此宣告3個車子物件
c[0] = new Car(3, "mazda");
c[1] = new Car(15, "toyota");
c[2] = new Car(10, "benz");
System.out.println(Car.compare(c)+"的age最大"); // 要記得compare函數是被宣告為static,也就是可以將類別名稱當作名稱空間來呼叫函數
}
static class Car
{
int age;
String brand;
public Car(int a, String b) {
age = a;
brand = b;
}
public static String compare(Car a[]) {
int find_max = a[0].age;
String max_car = a[0].brand;
for(int i=0; i<a.length; i++) {
if(find_max < a[i].age) {
find_max = a[i].age;
max_car = a[i].brand;
}
}
return max_car;
}
}
}
```
output:
toyota的age最大
---
用建構元建立內部類別的物件
```java=
public class app2_1
{
public app2_1() {
Car car[] = new Car[3];
car[0] = new Car(3, "toyota");
car[1] = new Car(5, "benz");
car[2] = new Car(7, "mazda");
System.out.println(Car.compare(car)+"的age最大");
}
public static void main(String args[])
{
app2_1 app = new app2_1();
}
static class Car
{
int age;
String brand;
public Car(int a, String b) {
age = a;
brand = b;
}
public static String compare(Car a[]) {
int find_max = a[0].age;
String max_car = a[0].brand;
for(int i=0; i<a.length; i++) {
if(find_max < a[i].age) {
find_max = a[i].age;
max_car = a[i].brand;
}
}
return max_car;
}
}
}
```
output:
mazda的age最大
---
建立匿名物件
```java=
public class app2_1
{
public static void main(String args[]) {
(new Car() {
void set_brand(int a, String b) {
brand = b;
age = a;
System.out.println("brand is "+brand+", age is "+age);
}
}).set_brand(5, "toyota");
}
static class Car{
String brand;
int age;
}
}
```
output:
brand is toyota, age is 5
---
使用巢狀類別
```java=
class Car{ // 外部類別
private int age;
private int kilometer;
private Login login;
public Car(int a, int k, String b) {
age = a;
kilometer = k;
login = new Login(b);
}
class Login{ // 內部類別
private String brand;
public Login(String s) {
brand = s;
}
public void show() {
System.out.println("車子品牌: "+brand);
}
}
public void output() {
System.out.println("車子品牌: "+login.brand);
System.out.println("車齡: "+age+" 年");
System.out.println("已行駛公里數: "+kilometer+" km");
login.show();
}
}
public class app2_1
{
public static void main(String args[]) {
Car car1 = new Car(5, 30000, "toyota");
Car car2 = new Car(7, 38000, "benz");
car1.output();
System.out.println();
car2.output();
}
}
```
output:
車子品牌: toyota
車齡: 5 年
已行駛公里數: 30000 km
車子品牌: toyota
車子品牌: benz
車齡: 7 年
已行駛公里數: 38000 km
車子品牌: benz