面向对象流水线

有理数的类封装

public class Rational {
    int numerator = 1;//分子分母初始值都设1
    int denominator =1;
    //设置分子的值,化简的过程
    void setNumerator(int a){//a为暂时的分子
        int c=f(Math.abs(a),denominator);
        numerator = a/c;
        denominator=denominator/c;
        if (numerator<0&&denominator<0){
            numerator = -numerator;
            denominator = -denominator;
        }
    }
    //设置分母,化简的过程
    void setDenominator(int b){
        int c=f(numerator,Math.abs(b));
        numerator = numerator/c;
        denominator=b/c;
        if (numerator<0&&denominator<0){
            numerator = -numerator;
            denominator = -denominator;
        }
    }
    int getNumerator(){
        return numerator;
    }
    int getDenominator(){
        return denominator;
    }
    //求最大公约数
    int f(int a,int b){
        if (a==0){
            return 1;
        }
        if (a<b){
            int t = 0;
            t = a;
            a = b;
            b = t;
        }
        int r = a%b;
         while (r!=0){
             a = b;
             b = r;
             r = a%b;
         }
        return b;
    }
    //加法运算
    Rational add(Rational r){
        int a = r.getNumerator();//获取所算的分数的分子
        int b = r.getDenominator();//获取分母
        int newNumerator = numerator*b+denominator*a;
        int newDenominator = denominator*b;
        Rational result = new Rational();//新建一个结果
        result.setNumerator(newNumerator);
        result.setDenominator(newDenominator);
        return result;
    }
    Rational sub(Rational r){
        int a = r.getNumerator();//获取所算的分数的分子
        int b = r.getDenominator();//获取分母
        int newNumerator = numerator*b-denominator*a;
        int newDenominator = denominator*b;
        Rational result = new Rational();//新建一个结果
        result.setNumerator(newNumerator);
        result.setDenominator(newDenominator);
        return result;
    }
    Rational muti(Rational r){
        int a = r.getNumerator();//获取所算的分数的分子
        int b = r.getDenominator();//获取分母
        int newNumerator = numerator*a;
        int newDenominator = denominator*b;
        Rational result = new Rational();//新建一个结果
        result.setNumerator(newNumerator);
        result.setDenominator(newDenominator);
        return result;
    }
    Rational div(Rational r){
        int a = r.getNumerator();//获取所算的分数的分子
        int b = r.getDenominator();//获取分母
        int newNumerator = numerator*b;
        int newDenominator = denominator*a;
        Rational result = new Rational();//新建一个结果
        result.setNumerator(newNumerator);
        result.setDenominator(newDenominator);
        return result;
    }
}
public class RationalTest {
    public static void main(String[] args) {
        Rational r1 = new Rational();
        Rational r2 = new Rational();
        r1.setNumerator(3);
        r1.setDenominator(5);
        r2.setNumerator(1);
        r2.setDenominator(6);
        Rational result = r1.add(r2);
        int a = result.getNumerator();
        int b = result.getDenominator();
        System.out.println("3/5 + 1/6 = "+a+"/"+b);
    }
}
  • Shift+Tab代码整体向前移,Tab代码整体向后移

搭建流水线

public class SingGame {
    public static void main(String[] args) {
        Line line = new Line();
        line.giveScore();
    }
}
public class Line {
    InputScore inputScore;//先定义对象,不分配内存空间
    DelScore delScore;
    ComputerAver computer;

    Line() {//创建流水线对象后自动给各个类分配空间
        computer = new ComputerAver();
        delScore = new DelScore(computer);//b对象含有c对象的引用
        inputScore = new InputScore(delScore);//a对象含有b的引用,
    }
    public void giveScore(){
        inputScore.inputScore();
    }
}
public class InputScore { //录入分数,a对象
    DelScore delScore;//定义b对象
    InputScore(DelScore delScore) {
        this.delScore = delScore;//构造方法的参数是b,
    }

    public void inputScore(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入评委数:");
        int count = scanner.nextInt();
        System.out.println("请输入分数:");
        double[] a = new double[count];
        for (int i = 0; i <count ; i++) {
            a[i] = scanner.nextDouble();
        }
        delScore.doDelete(a);//调用b对象的方法,在执行完a后自动执行b
    }

}
public class DelScore {//去掉一个最高分和最低分,b对象
    ComputerAver computer;

    DelScore(ComputerAver computer) {
        this.computer = computer;
    }
    public void doDelete(double[] a){
        Arrays.sort(a);
        System.out.println("去掉一个最高分:"+a[a.length-1]);
        System.out.println("去掉一个最低分:"+a[0]);
        double[] b = new double[a.length-2];
        for (int i = 0; i < b.length; i++) {
            b[i]=a[i+1];
        }
        computer.giveAver(b);
    }
}
public class ComputerAver {//求平均分,c对象

    public void giveAver(double[] b){
        double sum = 0;
        for (int i = 0; i < b.length; i++) {
            sum+=b[i];
        }
        double aver = sum/b.length;
        System.out.println("选手最后得分:"+aver);
    }
}
  • 子类和父类在同一个包中时,除了private定义的属性方法,其他都可以继承
  • 子类和父类不在同一个包中时,private和友好变量度都不能继承,可以继承protected和public
  • 创建子类对象时,父类的成员变量也都分配了内存空间
  • 子类有一部分方法是从父类继承的,这些方法可以操作子类未继承的变量