知识点总结之一

作者: Mr_SuX | 来源:发表于2016-12-24 14:21 被阅读45次
类与类之间的三种关系

1.is-a关系 -- 继承 --学生和人
2.has-a关系 -- 关联(聚合/合成) -- 扑克和一张牌
3.user-a关系 -- 依赖 -- 人和房子

类和它实现的接口直接的关系

1.play-a/like-a -- 扮演/看起来像

缺省适配模式
  • 在使用接口时,必须实现接口中所有的方法,如果需要使用某个方法,则需要创建一个类(适配器)实现该接口,从而可以直接实现适配器,选择性重写需要的方法。
对于实现接口Java8新增

1.java8以后,接口可以进行默认实现,从而在实现接口后,可以选择行重写需要的方法。

public default name(){
  此处省略10000行代码
}

2.如果一个接口中只有一个方法且没有默认实现,那么就可以使用如下方法(Lambda表达式/匿名函数:e ->{})。如给按钮添加监听器

okButton.addActionListener(e -> {
  此处省略10000行代码
});
final/native

1.由final修饰的方法,子类不能在重写;
2.final修饰的类,不能被继承(即没有子类);
3.final修饰的变量,即为常量。
4.native修饰的方法,代表其是由C或C++实现的

对象的克隆

-- 如果一个对象在使用中如要多次创建,那么则可以使用对象克隆来增加效率

实现Cloneable接口,子类重写父类(Object)的clone方法
// 重写父类克隆的方法
    @Override
    public Object clone() {
        Student temp = null;
        try {
            // 调用Object父类的clone(克隆)方法
            temp = (Student) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return temp;
    }
数组排序(Arrays.sort())
  • 排序的前提:
    1.两个对象可以比较大小
    2.需要实现Comparable接口,重写compareTo方法。
// 重写Comparable接口的compareTo方法
    @Override
    public int compareTo(Student o) {
        /*
         * 比较this和other谁大谁小(返回负数、0、正数)
         * 后面减前面为升序(this.age-o.age) 
         * 前面减后面为降序(o.age-this.age)
         */
        return this.age - o.age;// 升序
        // return o.age - this.age;// 降序
        // return o.name.compareTo(this.name); // 升序
        // return this.name.compareTo(o.name);// 降序
    }
模版方法设计模式
  • 抽象类作为多个子类的通用模版,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式
  • 解决问题
    1.当功能内部一部分实现是确定的,一部分实现是不确定的,这时候就可以把不确定的内容暴露出来,让子类去实现。
    2.编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其他子类实现,就是一种模版模式。
abstract class Template {
    // 未确定部分
    public abstract void code();
    // 已确定部分
    public void speedTimes() {
        long start = System.currentTimeMillis();
        code();
        long end = System.currentTimeMillis();
        System.out.println("运行时间:" + (end - start));
    }
}
class SubTemplate extends Template {
    @Override
    public void code() {
        for (int i = 2; i <= 100000; i++) {
            boolean flag = true;
            for (int j = 2; flag && j <= Math.sqrt(100000); j++) {
                if (i % j == 0) {
                    flag = false;
                }
            }
            if (flag) {
                System.out.println(i);
            }
        }
    }
}

相关文章

网友评论

    本文标题:知识点总结之一

    本文链接:https://www.haomeiwen.com/subject/xhwlvttx.html