顯示具有 Java SE::物件繼承 標籤的文章。 顯示所有文章
顯示具有 Java SE::物件繼承 標籤的文章。 顯示所有文章

2015年9月21日 星期一

巢狀式類別

內部類別示範:
public class Car {

    private boolean running = false;
    private Engine engine = new Engine();

    private class Engine {
        public void start(){
            running = true;
            System.out.println("引擎起動中....");
        }
    }
    
    public void start(){
        engine.start();
        System.out.println("汽車狀態: 準備行駛.....");
    }
}

public class Demo {
    public static void main(String[] args){
        Car c1 = new Car();
        c1.start();
    
    }
}

暱名內部類別示範:
public class CarBrand {

    //建立一個內部有暱名類別的物件
    public LandRover l1 = new LandRover(){

        @Override
        public String toString() {
            return ("Land Rover : " + l1.getBrand1());
        }    
    }; //注意節尾的結束符號
            
    // 這是一般的內部類別用法
    private class LandRover {
        private String brand1 = "Defender !";
        public String getBrand1(){
            return brand1;
        }
    }
}

public class Demo {
    public static void main(String[] args){
        CarBrand c1 = new CarBrand();
        System.out.println(c1.l1);
    }
}

Singleton Design Pattern 的範例

Singleton Design Pattern 的類別,只能實例化一次:
public class Husband {

  private static final Husband yourlover = new Husband();
  private static String name = "Peter" ;
  
  private Husband(){}

  public static Husband getYourLover(){
      System.out.println("Your Husband: " + name);
    return yourlover;
  }
} 

public class Demo {
    public static void main(String[] args){
        Husband.getYourLover();
    }
}

2015年9月18日 星期五

Enum 使用方式

Java 的 Enum:
public enum PowerState {
   OFF("This System is off"),
    ON("This System is on"),
    SUSPEND("This System is Suspend");
    
    private String description;
    
    private PowerState(String d){
        description = d;
    }
    public String getDescription(){
        return this.description;
    }
}

測試一下:
public class Computer {

    void setState(PowerState powerState) {
    
        switch(powerState){
            case OFF:
                System.out.println(powerState.getDescription());
                break;
            case ON:
                System.out.println(powerState.getDescription());
                break;
            case SUSPEND:
                System.out.println(powerState.getDescription());
                break;
        }
    }  
}

public class Demo {
    public static void main(String[] args){
    
        Computer comp = new Computer();
    
        comp.setState(PowerState.OFF);
        
    }
}

物件的比較


物件的比較,原則上必須 Override Object 物件內的 equals() 方法:
public class Employee {
    
    private int empId;
    private String name;
    private String ssn;
    private double salary;

    public Employee(int empId, String name, String ssn, double salary) {
        this.empId = empId;
        this.name = name;
        this.ssn = ssn;
        this.salary = salary;
    }

    @Override
    public boolean equals(Object obj) {
        boolean result = false;
        
        if ((obj != null) && (obj instanceof Employee)){
            Employee e = (Employee)obj;
            if ((e.empId == this.empId) &&
                    (e.name.equals(this.name)) &&
                    (e.ssn.equals(this.ssn)) &&
                    (e.salary == this.salary)){
                    result = true;
            }
        }
        
        return result; 
    }

   //......請參考這一篇程式內容......

}

測試用程式:
public class Demo {
    public static void main(String[] args){
           
        Employee e = new Employee(101, "Jim Smith", "011-12-2345", 100_000.00);
        Employee m = new Manager(102, "Joan Kern", "012-23-4567",110_450.54, "Marketing");
        Employee es = e;
        Employee es2 = new Employee(101, "Jim Smith", "011-12-2345", 100_000.00);
        
        if ( e ==  es ){
            System.out.println("1.同一物件");
        }
        
        if ( e.equals(es)){
            System.out.println("1.物件內容相同");
        }
        
        if ( e ==  es2 ){
            System.out.println("2.同一物件");
        }
        
        if ( e.equals(es2)){
            System.out.println("2.物件內容相同");
        }
        
        if ( e ==  m ){
            System.out.println("3.同一物件");
        }
        
        if ( e.equals(m)){
            System.out.println("3.物件內容相同");
        }
    }
}

2015年9月16日 星期三

Polymorphism 用法

Polymorphism (多型)用法:
public class Employee {

    //....參考這一篇內容.....
     protected int calculateStock() {
        return 10;
    }
}

public class Manager extends Employee{

    //....參考這一篇內容.....
    public int calculateStock() {
        return 20;
    }
}

新的類別:
public class EmployeeStackPlan {

    private float stockMultiplier = 1.5f;

    // 使用父類別當引數:
    public int grantStock (Employee e){
        return (int)(stockMultiplier * e.calculateStock());
    }
}

執行的執行:
public class Demo {
    public static void main(String[] args){
    
    Employee e = new Employee(101, "Jim Smith", "011-12-2345", 100_000.00);    
    Manager m = new Manager(102, "Joan Kern", "012-23-4567",110_450.54, "Marketing");
    Employee em = new Manager(103, "Williams Tim", "014-87-5679",123_560.54, "Production");

    System.out.println("Stock: " + e.calculateStock());
    System.out.println("Stock: " + m.calculateStock());
    System.out.println("Stock: " + em.calculateStock());
    

Override 用法

Java 的Override 用法:
public class Employee {
    
    private int empId;
    private String name;
    private String ssn;
    private double salary;

    public Employee(int empId, String name, String ssn, double salary) {
        this.empId = empId;
        this.name = name;
        this.ssn = ssn;
        this.salary = salary;
    }

    public String getDetail(){
        return ("Employee ID : " + getEmpId() +
                " Employee Name: " + getName());
    }

    //......一堆 getter & setter ......
}

public class Manager extends Employee{
    
    private String deptName;

    public Manager(int empId, String name, String ssn, double salary, String deptName) {
        super(empId, name, ssn, salary);
        this.deptName = deptName;
    }
    public String getDetail(){
        return (super.getDetail() + 
                " Department: " + getDeptName());
    }
 //......一堆 getter & setter ......
}

public class Demo {
    public static void main(String[] args){
    
        Employee e = new Employee(101, "Jim Smith", "011-12-2345", 100_000.00);
        Manager m = new Manager(102, "Joan Kern", "012-23-4567",110_450.54, "Marketing");
        System.out.println(e.getDetail());
        System.out.println(m.getDetail());
    }
}

2015年9月14日 星期一

物件與多型

Java 多型 (Polymorphism) 的使用:
範例:Employee
public class Employee {
    
    private int empId;
    private String name;
    private String ssn;
    private double salary;

    public Employee() {
    }

    public Employee(int empId, String name, String ssn, double salary) {
        this.empId = empId;
        this.name = name;
        this.ssn = ssn;
        this.salary = salary;
    }

    //......一堆 getter 與 setter ......

   public void raiseSalary(double increase){
        salary += increase;
    }

}

Manager 繼承 Employee :
public class Manager extends Employee{
    
    private String deptName;

    public Manager() {
    }

    public Manager(int empId, String name, String ssn, double salary, String deptName) {
        //super();
        super(empId, name, ssn, salary);
        this.deptName = deptName;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }   
}

最後來個大Demo :
public class Demo {
    public static void main(String[] args){
    
        Manager mgr = new Manager(102, "Barbara Jones", "107-99-9078", 109345.67, "Marketing");
        mgr.raiseSalary(10000.00);
        String dept = mgr.getDeptName();
        
        Employee emp = new Manager();
        //錯誤
        //emp.setDeptName("Marketing");
        ((Manager)emp).setDeptName("Marketing");
    }
}

2015年9月11日 星期五

Package & Import 用法

利用 Package 來將專案內的檔案,進行分類:
package com.HR;

public class Employee {

    private String name;
    private int empID;
    private String ssn;
    private double salary;

    public Employee() {
    }

    public Employee(int empID, double salary, String ssn, String name) {
        this.empID = empID;
        this.salary = salary;
        this.ssn = ssn;
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public String getSsn() {
        return ssn;
    }

    public String getName() {
        return name;
    }

    public int getEmpID() {
        return empID;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public void setSsn(String ssn) {
        this.ssn = ssn;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setEmpID(int empID) {
        this.empID = empID;
    }
}

Import 進來上述的 Class :
import com.HR.Employee;

public class Demo {
    public static void main(String[] args){
    
        Employee e1 = new Employee();
    
    }
}

2015年9月2日 星期三

Java 繼承方式

利用繼承來減少程式碼:
public class Clothing{

 private int shirtID = 0;
 private String description = "-----";
 private char colorCode = 'U' ; //R=red,G=green,B=blue,W=white
 private double price = 0.0;
 
 //constructors
 public Clothing(int shirtID, String description, char colorCode, double price){
  setShirtID(shirtID);
  setDescription(description);
  setColorCode(colorCode);
  setPrice(price);
 }
 public void setPrice(double price){
  this.price = price;
 }
 public double getPrice(){
  return this.price;
 }
 public void setDescription(String content){
  this.description = content;
 }
 public String getDescription(){
  return this.description;
 }
 public void setShirtID(int shirtID){
  this.shirtID = shirtID;
 }
 public int getShirtID(){
  return this.shirtID;
 }
 public char getColorCode(){
  return colorCode;
 }
 public void setColorCode(char newChar){
  switch(newChar){
   case 'R':
   case 'G':
   case 'B':
   case 'W':
   this.colorCode = newChar;
   break;
   default:
   System.out.println("This ColorCode is wrong!");
  } 
 }
 
 //顯示 Shirt 相關資料
 public void display(){
 
  System.out.println("Cloth ID: " +  shirtID);
  System.out.println("Description: " + description);
  System.out.println("Cloth Color: " + colorCode);
  System.out.println("Cloth's price: " + price);
 }
}

Shirt 繼承 Clothing 的方式:

public class Shirt extends Clothing{

 private char fit = 'U'; //'S','M','L'
 
 //constructors
 public Shirt(int shirtID, String description, char colorCode,
              double price, char fit){
  super(shirtID,description,colorCode,price);
  setFit(fit);
 }
 public char getFit(){
  return fit;
 }
 public void setFit(char newFit){
  switch(newFit){
   case 'S':
   case 'M':
   case 'L':
   this.fit = newFit;
   break;
   default:
   System.out.println("This Fit is wrong!");
  }
 }
 //Overriding Clothing display method
 public void display(){
  System.out.println("Shirt ID: " +  getShirtID());
  System.out.println("Description: " + getDescription());
  System.out.println("Shirt Color: " + getColorCode());
  System.out.println("Shirt's price: " + getPrice());
  System.out.println("Shirt Fit: " + getFit());
 }
}

執行方式:
public class Demo{

 public static void main(String[] args){
 
  Shirt myShirt = new Shirt(
      321,"NET new Shirt Style!",'B',121.22,'L');
  
  myShirt.display();
 }
}