回顾总结9

抽象类

  • 当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,这个类就成了抽象类。

  • 抽象类的价值更多作用是在于设计,设计者设计好之后,让子类继承并实现抽象类。

  • 框架和设计模式使用较多。

details

  1. 抽象类不能被实例化

  2. 抽象类不一定包含抽象方法

  3. 一旦类包含了抽象方法,则类必须声明为抽象类

  4. abstract只能修饰类和方法,不能修饰属性和其他

  5. 抽象类的本质还是类,只是不能new对象

  6. 抽象类不能有方法体

  7. 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,或者自己也声明为抽象类

  8. 抽象方法不能用private、final、static来修饰,因为这三个关键字都是和重写违背的。

我们首先要明知,抽象类设计出来是为了继承使用的。

  • private:如果把父类的抽象方法设计成私有的,那么子类是不能访问和重写的。(继承是能继承过来的)
  • final:如果方法被设计成final,那么是不能够改变的,也破坏了子类的重写。如果类被设计成final,那么是不能被继承的,违背了抽象类的本质。
  • static:静态方法是在类加载的时候加载,并且只加载一次的,不可修改,可随类直接使用,但是抽象方法是没有方法体的,在没有重写之前不能被调用

模板设计模式

实例

统计运行代码时间

在代码运行前获取时间,在代码运行后获取时间,时间相减。

这一部分是通用的,中间是代码各不相同。

每次都要重复这些步骤,只是三行代码不算困难,但是重复步骤变多了,会很麻烦。

解决方法。我们把这重复的代码,封装到一个模板类里面做成一个方法,中间各不相同的代码封装到一个方法里面,再把这个方法嵌套在前面模板方法的中间位置。

//Template类
public abstract class Template{
    public abstract void job();
    public void calculateTime(){//模板方法
    //模板前部分代码
    //中间变换代码job()
    //模板后部分代码
    }
}

把模板类做成抽象类,然后写子类(重写job方法)去继承这个模板类

接口

    • 接口不能被实例化(所有方法默认都是抽象方法)

    • 抽象类也不能被实例化

      原因:存在没有方法体的抽象方法

    • 接口中的所有方法默认都是public,接口中所有方法默认都是abstract,可以省略。

    • 抽象类抽象方法不能为private,这会破坏子类的继承实现

      原因:抽象类属于类,类有的属性他也能有,可以有方法和属性

    • 接口可以继承接口

    • 类可以继承类,实现接口

      原因:类和接口不是一个概念,只提供了类实现接口。

Java8,接口的静态方法,关键字default

作用

接口(like a):设计,设计好各种规范(方法),让其他类去实现这些方法,更加的灵活

继承(is a):解决代码的复用性和维护性

多态

同继承的多态

可以让接口指向实现了接口的类

内部类

分类

  • 外部类局部位置(如方法内)
    1. 局部内部类(有类名)
    2. 匿名内部类(没有类名,重点)
  • 外部类成员位置
    1. 成员内部类(普通)
    2. 静态内部类(静态)

details

  1. 可以直接访问外部类的所有成员,包括私有的

  2. 不能添加访问修饰符(局部变量的属性),可以用final修饰,可以防止别的类继承

  3. 作用域:只在方法或代码块中生效

  4. 外部类访问内部类成员,需要new一个内部类的对象,通过对象调用内部类成员

  5. 外部其他类不能访问局部内部类(因为局部内部类是一个局部变量)

  6. 外部类和局部内部类成员重名时,遵循就近原则。如果想访问外部类的成员,则可以使用(对象调用,外部类.this返回调用的具体对象)外部类.this.成员,当外部类成员为静态时成员,可以直接(类调用)外部类.成员调用

  7. 内部类是依附于外部类存在的,如果要创建内部类的对象,首先要存在一个外部类的对象,通过外部类的对象实例,去new内部类对象。(静态内部类不依附于外类,可直接类调用)

  8. 局部内部类不能访问普通的局部变量,这是因为局部变量会随着方法的结束而销毁,但是局部内部类的对象

posted @ 2021-07-30 20:32  灰线  阅读(30)  评论(0)    收藏  举报