一、复习
static
属性 类变量 全类共有 类加载时初始化,类名访问
方法 静态方法 类名调用,静态方法中不能访问类的非静态成员,可以覆盖,只能被静态方法覆盖,没有多态
初始代码块 类加载时运行
类加载:
一个类编译之后会形成.class文件,储存了类的全部信息。
当JVM第一次使用一个类的时候,会根据ClassPath找到对应的.class文件,用输入流把文件中的信息读入JVM并保存起来,这样,JVM就“认识”了这个类
类加载时机:第一次用这个类的时候
1. 第一次创建类的对象,会加载
2. 访问类的静态成员,会加载
3. 声明类的引用,不会加载
4. 加载子类,必然先加载父类
5. 如果调用的是子类从父类中继承下来的静态方法,只会加载父类
6. 如果访问的是类的静态常量,如果在编译的时候能够确定这个常量的值,则运行时不会加载,
否则,编译时无法确定常量值,那么运行时就会加载
设计模式:单例模式
用途:一个类只能有一个对象
实现:会有一个静态的属性,就是该类的一个对象。提供一个静态方法,来获得这个唯一的静态属性(单例),同时构造方法私有
final
变量:常量,一旦赋值,不能改变,为属性常量赋值的时机:对于实例常量,初始化或者构造方法中可以赋值;
对于类常量(static final),初始化或者静态初始代码块中可以赋值
方法:不能被覆盖
类 :不能被继承 所有方法默认都是final的
abstract
方法 :只有定义,没有实现
类 :不能构造对象,但可以用来声明一个引用(作为编译时类型)
如果一个类有抽象方法,这个类必须是抽象类,如果一个类是抽象类,不一定有抽象方法
子类继承一个抽象类,就必须覆盖(实现)父类(抽象类)中的所有抽象方法,否则,子类就也得是抽象类
抽象类有构造方法,给子类继承
通过abstract,我们可以把一个方法的定义放在父类,留给子类实现。
二、接口
接口是一种程序结构,是特殊的抽象类。
接口中的方法必须都是公开的抽象方法(public abstract),接口中的属性都是公开静态常量(public static final)。
接口中没有构造方法
abstract class ClassA{
public static final int A = 10;
public static final double B = 3.14;
public abstract void m1();
public abstract void m2();
}
interface IA{
int A = 10;
double B = 3.14;
void m1();
void m2();
} //与上面的抽象类逻辑上等价,编译之后,也会生成一个IA.class文件
所以一个源文件中可以写多个接口,但只能有一个公开接口,并且要与源文件的名字一致
接口可以继承,但是只能由接口继承。
在用类去继承时要换用 implements 关键字,这时类和接口也不叫做继承关系,而是实现关系,但其实质也是继承。
一个类可以继承也只能继承另外一个类,但是可以实现多个接口,其语法是在implements后面写接口名,多个接口以“,”分隔。
接口之间是可以多继承的,其语法和类的继承语法是相同的。
在接口多继承时,在extends后写接口名如果要继承多个接口,接口名以“,”分隔,接口的继承关系只是把其父接口中的抽象方法继承到子接口中。
要实现接口就必须实现接口中的所有方法。
一个类可以在继承一个类的同时,还可以实现一个或多个接口。采用接口就绕开了单继承限制。
class Impl extends ClassE implements IA,IB{……}
接口类型也可以做为编译时类型使用,但其实际的运行时类型必须是完全实现接口的类的对象实例,这样就使多态变得很灵活了
接口类型的引用指向接口某一个实现类的对象
接口的意义:
1,接口可以实现多继承。
2,用接口可以实现混合类型(主类型,副类型),java中可以通过接口分出主次类型。主类型使用继承,副类型,使用接口实现。
3,接口进一步深化了标准的思想,接口本身就是一个标准,
他起到了降低耦合性的作用,接口可以使方法的定义和实现相分离,也就是将接口的定义者和实现者相分离,
接口也可以用于降低模块间或系统间的耦合性。
针对接口编程可以屏蔽不同实现间的差异,看到的只是实现好的功能。
练习:
在原有的雇员练习上修改代码:
公司会给SalariedEmployee每月另外发送2000元加班费
给BasePlueSalesEmployee发放1000元加班费
改写原有的代码,加入以上的逻辑
并写一个方法,打印出本月公司总共发放了多少加班费
练习:
验证歌德巴赫猜想,输入一个大于6的偶数,请输出这个偶数能被分解为哪两个质数的和
如 10=3+7 12=5+7
质数:除了1和自身,不能被任何数整除的数
要求:两个人一组合作完成,一个人负责拆数,另一个人负责写方法,判断一个数是不是质数
接口:定义标准,
接口的实现:实现标准
接口的调用者:标准的使用
针对接口编程原则,也就是按照标准实现。
接口的定义者定义好了标准,接口的使用者就可以写使用代码,接口的实现者写好实现之后把实现对象传入接口的使用者中。
他调用接口中方法也就是掉用接口实现中的方法。
这种过程叫做接口的回调(先有标准使用者,后有标准实现者,把标准的实现者对象传给使用者,再由使用者通过接口调用标准实现者的方法)。
作业:
1、体验接口回调
根据文档和给定的class文件,实现接口,并且将实现类的对象作为参数调用Match类中的match方法,实现石头剪刀布的游戏
2、接口
为SavingAccount和CreditAccount各自添加一个子类
LoanSavingAccount类:用户可以贷款,不可以透支
LoanCreditAccount类:用户可以贷款,可以透支
说明:贷款和透支是不一样的,透支指的是账户余额小于0,而贷款用户需要一个贷款额的属性.
在ATM机上,用户可以选择贷款,也可以选择还贷款,而还贷款就是要把账户余额上的资金转到贷款额上
例如:用户余额10000元,贷款额100000元,用户可以选择还款5000元,则用户余额变为5000,贷款额变为95000元.
利用接口来抽象出LoanSavingAccount类和LoanCreditAccount类的共性
接口中的方法:
requestLoan:贷款
payLoan:还贷
getLoan:获取用户贷款总额
为Bank类添加三个方法,
贷款:参数 id,贷款额,返回修改过的Account对象
还贷款:参数 id,还款额,返回修改过的Account对象
统计所有账户贷款的总数