回顾总结9
抽象类
-
当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,这个类就成了抽象类。
-
抽象类的价值更多作用是在于设计,设计者设计好之后,让子类继承并实现抽象类。
-
框架和设计模式使用较多。
details
-
抽象类不能被实例化
-
抽象类不一定包含抽象方法
-
一旦类包含了抽象方法,则类必须声明为抽象类
-
abstract只能修饰类和方法,不能修饰属性和其他
-
抽象类的本质还是类,只是不能new对象
-
抽象类不能有方法体
-
如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,或者自己也声明为抽象类
-
抽象方法不能用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):解决代码的复用性和维护性
多态
同继承的多态
可以让接口指向实现了接口的类
内部类
分类
- 外部类局部位置(如方法内)
- 局部内部类(有类名)
- 匿名内部类(没有类名,重点)
- 外部类成员位置
- 成员内部类(普通)
- 静态内部类(静态)
details
-
可以直接访问外部类的所有成员,包括私有的
-
不能添加访问修饰符(局部变量的属性),可以用final修饰,可以防止别的类继承
-
作用域:只在方法或代码块中生效
-
外部类访问内部类成员,需要new一个内部类的对象,通过对象调用内部类成员
-
外部其他类不能访问局部内部类(因为局部内部类是一个局部变量)
-
外部类和局部内部类成员重名时,遵循就近原则。如果想访问外部类的成员,则可以使用(对象调用,外部类.this返回调用的具体对象)外部类.this.成员,当外部类成员为静态时成员,可以直接(类调用)外部类.成员调用
-
内部类是依附于外部类存在的,如果要创建内部类的对象,首先要存在一个外部类的对象,通过外部类的对象实例,去new内部类对象。(静态内部类不依附于外类,可直接类调用)
-
局部内部类不能访问普通的局部变量,这是因为局部变量会随着方法的结束而销毁,但是局部内部类的对象

浙公网安备 33010602011771号