Java面向对象(四)

Java面向对象(四)

1.1泛型(Generic Programming)

会有很多逻辑定义一致的程序,差别是他们的类型不一样。为了方便这样的程序能够重用所以引入泛型。

/**存储两个任意类型的变量*/
public class Pair<T> {
    private T first;
    private T second;

    public Pair(){
        first = null;
        second = null;
    }

    public Pair(T first, T second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() {
        return first;
    }

    public void setFirst(T first) {
        this.first = first;
    }

    public T getSecond() {
        return second;
    }

    public void setSecond(T second) {
        this.second = second;
    }
}

public class PairTest {
    public static void main(String[] args) {
        String[] words = {"apple","ice-cream","water","tea"};
        Pair<String> myPair = FindByPair.maxMin(words);
        System.out.println(myPair.getFirst());
        System.out.println(myPair.getSecond());
    }
}
class FindByPair{
    public static Pair<String> maxMin(String[] val) {
        String min = val[0];
        String max = val[0];
        for (int i = 0; i < val.length ; i++) {
            if (min.compareTo(val[i]) > 0){
                min = val[i];
            }
            if (max.compareTo(val[i]) < 0){
                max = val[i];
            }
        }
        //编译器会进行类型推断---泛型擦除
        return new Pair<>(min, max);
    }
}
import java.io.Serializable;
import java.time.LocalDate;

public class PairTest2 {
    public static void main(String[] args) {
        LocalDate[] birthdays ={
                LocalDate.of(1999,12,12),
                LocalDate.of(1996,12,3),
                LocalDate.of(1896,1,1),
                LocalDate.of(2020,5,30),
        };
        Pair<LocalDate> localDatePair = FindByPair2.maxMin(birthdays);
        System.out.println(localDatePair.getFirst());
        System.out.println(localDatePair.getSecond());
    }
}
class FindByPair2{
    //为类型变量T做限定,说明类型T实现了Comparable接口
    //T绑定的类型是某某接口的子类型,用&分隔多个父类型
//public static <T extends Comparable & Serializable> T min(T[] a){
//    if (a == null || a.length == 0){
//        return null;
//    }
//    T min = a[0];
//    for (int i = 1; i < a.length; i++) {
//        if (min.compareTo(a[i]) > 0){
//            min = a[i];
//        }
//    }
//    return min;
//}
    public static<T extends Comparable> Pair<T> maxMin(T[] val) {
        if (val == null || val.length == 0){
            return null;
        }
        T min = val[0];
        T max = val[0];
        for (int i = 0; i < val.length ; i++) {
            if (min.compareTo(val[i]) > 0){
                min = val[i];
            }
            if (max.compareTo(val[i]) < 0){
                max = val[i];
            }
        }
        return new Pair<>(min, max);
    }
}

未命名文件 (5).png

import java.time.LocalDate;

public class Employee {
    private String name;
    private double salary;
    private LocalDate hireDate;


    public Employee(String name, double salary, int year, int month, int day) {
        this.name = name;
        this.salary = salary;
        this.hireDate = LocalDate.of(year, month, day);
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {

        this.name = name;
    }
    public double getSalary() {
        return salary;
    }

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

    public LocalDate getHireDate() {
        return hireDate;
    }

    public void setHireDate(LocalDate hireDate) {
        this.hireDate = hireDate;
    }

    public void raiseSalary(double byPercent) {
        double raise = this.salary * byPercent / 100;
        this.salary += raise;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", salary=" + salary +
                ", hireDate=" + hireDate +
                '}';
    }
}
public class Manager extends Employee {
    private double bonus;


    public Manager(String name, double salary, int year, int month, int day) {
        super(name, salary, year, month, day);
        this.bonus = 0;
    }


    @Override
    public double getSalary() {
       double baseSalary = super.getSalary();
       return baseSalary + bonus;
    }

    public void setBonus(double bonus) {
        this.bonus = bonus;
    }

    public double getBonus() {
        return bonus;
    }

    @Override
    public String toString() {
        return "Manager{" + super.toString() +
                "bonus=" + bonus +
                '}';
    }

}
import com.oop.generic.Pair;

public class PairTest3 {
    public static void main(String[] args) {
        Manager ceo = new Manager("Tom",800000,1999,10,1);
        Manager cfo = new Manager("Jerry",600000,2000,9,23);
        Pair<Manager> buddies = new Pair<>(ceo,cfo);
        printBuddies(buddies);

        ceo.setBonus(1000000);
        cfo.setBonus(500000);

        Manager[] managers = {ceo,cfo};

        Pair<Employee> res = new Pair<>();

        minMaxBonus(managers,res);

        System.out.println("First " + res.getFirst().getName()
        + " Second " + res.getSecond().getName());

        maxMinBonus(managers,res);

        System.out.println("First " + res.getFirst().getName()
                + " Second " + res.getSecond().getName());
    }

    private static void maxMinBonus(Manager[] managers, Pair<? super Manager> res) {
        minMaxBonus(managers,res);
        FindByPair3.swapHelp(res);
    }

    private static void minMaxBonus(Manager[] managers, Pair<? super Manager> res) {
        if (managers.length == 0){
            return;
        }
        Manager min = managers[0];
        Manager max = managers[0];

        for (int i = 0; i < managers.length ; i++) {
            if (min.getBonus() > managers[i].getBonus()){
                min = managers[i];
            }
            if (max.getBonus() < managers[i].getBonus()){
                max = managers[i];
            }

            res.setFirst(min);
            res.setSecond(max);
        }
    }

    private static void printBuddies(Pair<? extends Employee> buddies) {
        Employee first = buddies.getFirst();
        Employee second = buddies.getSecond();
        System.out.println(first.getName() + " and " + second.getName() + " are buddies");
    }
}
class FindByPair3{
    public static boolean hasNull(Pair<?> p){
        return p.getFirst() == null || p.getSecond() == null;
    }
    public static void swap(Pair<?> p){
        swapHelp(p);
    }

    public static<T> void swapHelp(Pair<T> p) {
        T t = p.getFirst();
        p.setFirst(p.getSecond());
        p.setSecond(t);
    }
}

posted @ 2020-07-15 21:51  Dave-Mo  阅读(67)  评论(0)    收藏  举报