一、复习
1、封装
该隐藏隐藏,该公开的公开
属性隐藏,同时提供get/set方法
有些方法应该隐藏
方法声明公开,实现隐藏。实现的改变对架构的影响最小
2、继承
一般->特殊
单继承:一个类最多只能有一个直接父类。类之间可以形成树状关系
根据访问权限,子类如果可以访问父类的属性和方法,就能继承
private 私有 不能继承
default 本类+同包 同包子类可以继承,不同包子类不能继承
protected 本类+同包+不同包子类 可以继承
public 公开 可以继承
方法的覆盖(Override):
方法名相同,参数表相同,返回值相同,访问修饰符比父类相同或更宽,抛出的异常不能比父类更宽
继承关系下对象的构造过程
1)递归的构造父类对象
2)分配本类空间
3)初始化本类属性
4)调用本类的构造方法
super:
super. ->父类对象,访问父类被覆盖的方法或者父类被遮盖的属性
super() ->用在构造方法时,用来指明调用父类的哪个构造方法,放在构造方法的第一行,默认调用父类无参构造方法
3、多态
编译时多态:方法的重载
运行时多态:
子类对象当作父类对象来用!!!屏蔽同一父类下,不同子类差异
Animal a = new Dog();
允许引用类型和对象类型不同,但要求引用类型是对象类型的父类。
对象类型代表了对象自身客观的实际类型,引用类型代表了主观上把对象当作什么类型来看待。
引用类型:编译时类型,主观类型
对象类型:运行时类型,客观类型
1)对象运行时类型不变
2)只能对对象调用其编译时类型定义的方法
3)运行时根据对象类型去匹配对象类型中覆盖之后的方法
Super s1;
Sub s2;
s1=s2;
s2=s1; //error , s2=(Sub)s2
强制类型转换:当我们把父类的引用赋值给子类引用的时候,需要强制类型转换。强制类型转换失败:类型转换异常.
为了避免类型转换异常,使用instanceof判断
引用 instanceof 类名 引用指向的对象的类型与后面的类名是否兼容
多态的作用:通用编程
我们可以把不同子类的对象都当作父类对象看待,评比不同子类的差异。
二、CARP(组合/聚合复用原则)
实现代码重用最好的方法不是继承
两种复用
白盒复用,也就是继承复用,破坏封装,父类中的可以被子类访问到的就可以被继承,这样会有些不需要的内容被继承下来,所以这种方式不太好。
黑盒复用,也叫组合复用,也就是把要复用代码的类的对象作为本类中的一个属性,然后再通过方法的委托来实现由选择的复用。
方法的委托就是在本类的方法内部通过该类的对象调用要使用类的方法,不破坏封装。
注意:尽量用组合复用替代继承复用。
三、多态
1、多态用于参数,可以在方法的参数中传入其父类类型,在运行时会根据实际的运行时类型来在方法中进行相应的操作。
多态一般用在方法的参数上
void feed(Animal a){
a.eat();
}
调用的时候feed(new Dog()); //运行时,调用的是Dog类中覆盖的eat()方法
2、多态用于返回值,可以在方法的返回值类型上是用其实际返回值的父类型,在使用其返回值时也不关心其实际类型。
public static Animal getAnimal(int type){
if (type==0) return new Dog();
else return new Cat();
}
屏蔽子类差异,可扩展(只修改方法的实现,不必修改方法的声明)
3、Animal a = new Dog();
a.age; //访问属性是没有多态的,访问的是引用的age属性
a.eat(); //调用Dog类中覆盖Animal类中的eat()方法,多态
4、Animal a = new Dog();
method(a);
运行结果调用参数是Animal类对象的那个method()方法
方法的重载只看引用类型,跟引用指向的对象类型没有关系
四、对象的比较
String s1 = new String("abc");
String s2 = new String("abc");
s1 == s2; -> false 判断两个引用是否指向同一对象,即地址是否相同
s1.equls(s2); -> true 判断两个引用指向的对象的内容是否相同
练习:
(继承,多态)
银行的客户分为两类,储蓄账户(SavingAccount)和信用账户(CreditAccount),区别在于储蓄账户不允许透支
而信用账户可以透支,并允许用户设置自己的透支额度.
注意:CreditAccount需要多一个属性 ceiling 透支额度
为这两种用户编写相关的类
同时要求编写Bank类,属性:
1.当前所有的账户对象的集合,存放在数组中
2.当前账户数量
方法:
1.用户开户,需要的参数:id,密码,密码确认,姓名,身份证号码,邮箱,账户类型,返回新创建的Account对象
提示:用s1.equals(s2) 可以比较s1,s2两个字符串的值是否相等.账户类型是一个整数,为0的时候表示储蓄账户,为1的时候表示信用账户
2.用户登录,参数:id,密码 返回Account对象
3.用户存款,参数:id,存款数额,返回修改过的Account对象
4.用户取款,参数:id,取款数额,返回修改过的Account对象
5.设置透支额度 参数:id,新的额度 ,返回修改过的Account对象.这个方法需要验证账户是否是信用账户
用户会通过调用Bank对象以上的方法来操作自己的账户,请分析各个方法需要的参数
另外,请为Bank类添加几个统计方法
1.统计银行所有账户余额总数
2.统计所有信用账户透支额度总数
写个主方法测试你写的类
1、封装
该隐藏隐藏,该公开的公开
属性隐藏,同时提供get/set方法
有些方法应该隐藏
方法声明公开,实现隐藏。实现的改变对架构的影响最小
2、继承
一般->特殊
单继承:一个类最多只能有一个直接父类。类之间可以形成树状关系
根据访问权限,子类如果可以访问父类的属性和方法,就能继承
private 私有 不能继承
default 本类+同包 同包子类可以继承,不同包子类不能继承
protected 本类+同包+不同包子类 可以继承
public 公开 可以继承
方法的覆盖(Override):
方法名相同,参数表相同,返回值相同,访问修饰符比父类相同或更宽,抛出的异常不能比父类更宽
继承关系下对象的构造过程
1)递归的构造父类对象
2)分配本类空间
3)初始化本类属性
4)调用本类的构造方法
super:
super. ->父类对象,访问父类被覆盖的方法或者父类被遮盖的属性
super() ->用在构造方法时,用来指明调用父类的哪个构造方法,放在构造方法的第一行,默认调用父类无参构造方法
3、多态
编译时多态:方法的重载
运行时多态:
子类对象当作父类对象来用!!!屏蔽同一父类下,不同子类差异
Animal a = new Dog();
允许引用类型和对象类型不同,但要求引用类型是对象类型的父类。
对象类型代表了对象自身客观的实际类型,引用类型代表了主观上把对象当作什么类型来看待。
引用类型:编译时类型,主观类型
对象类型:运行时类型,客观类型
1)对象运行时类型不变
2)只能对对象调用其编译时类型定义的方法
3)运行时根据对象类型去匹配对象类型中覆盖之后的方法
Super s1;
Sub s2;
s1=s2;
s2=s1; //error , s2=(Sub)s2
强制类型转换:当我们把父类的引用赋值给子类引用的时候,需要强制类型转换。强制类型转换失败:类型转换异常.
为了避免类型转换异常,使用instanceof判断
引用 instanceof 类名 引用指向的对象的类型与后面的类名是否兼容
多态的作用:通用编程
我们可以把不同子类的对象都当作父类对象看待,评比不同子类的差异。
二、CARP(组合/聚合复用原则)
实现代码重用最好的方法不是继承
两种复用
白盒复用,也就是继承复用,破坏封装,父类中的可以被子类访问到的就可以被继承,这样会有些不需要的内容被继承下来,所以这种方式不太好。
黑盒复用,也叫组合复用,也就是把要复用代码的类的对象作为本类中的一个属性,然后再通过方法的委托来实现由选择的复用。
方法的委托就是在本类的方法内部通过该类的对象调用要使用类的方法,不破坏封装。
注意:尽量用组合复用替代继承复用。
三、多态
1、多态用于参数,可以在方法的参数中传入其父类类型,在运行时会根据实际的运行时类型来在方法中进行相应的操作。
多态一般用在方法的参数上
void feed(Animal a){
a.eat();
}
调用的时候feed(new Dog()); //运行时,调用的是Dog类中覆盖的eat()方法
2、多态用于返回值,可以在方法的返回值类型上是用其实际返回值的父类型,在使用其返回值时也不关心其实际类型。
public static Animal getAnimal(int type){
if (type==0) return new Dog();
else return new Cat();
}
屏蔽子类差异,可扩展(只修改方法的实现,不必修改方法的声明)
3、Animal a = new Dog();
a.age; //访问属性是没有多态的,访问的是引用的age属性
a.eat(); //调用Dog类中覆盖Animal类中的eat()方法,多态
4、Animal a = new Dog();
method(a);
运行结果调用参数是Animal类对象的那个method()方法
方法的重载只看引用类型,跟引用指向的对象类型没有关系
四、对象的比较
String s1 = new String("abc");
String s2 = new String("abc");
s1 == s2; -> false 判断两个引用是否指向同一对象,即地址是否相同
s1.equls(s2); -> true 判断两个引用指向的对象的内容是否相同
练习:
(继承,多态)
银行的客户分为两类,储蓄账户(SavingAccount)和信用账户(CreditAccount),区别在于储蓄账户不允许透支
而信用账户可以透支,并允许用户设置自己的透支额度.
注意:CreditAccount需要多一个属性 ceiling 透支额度
为这两种用户编写相关的类
同时要求编写Bank类,属性:
1.当前所有的账户对象的集合,存放在数组中
2.当前账户数量
方法:
1.用户开户,需要的参数:id,密码,密码确认,姓名,身份证号码,邮箱,账户类型,返回新创建的Account对象
提示:用s1.equals(s2) 可以比较s1,s2两个字符串的值是否相等.账户类型是一个整数,为0的时候表示储蓄账户,为1的时候表示信用账户
2.用户登录,参数:id,密码 返回Account对象
3.用户存款,参数:id,存款数额,返回修改过的Account对象
4.用户取款,参数:id,取款数额,返回修改过的Account对象
5.设置透支额度 参数:id,新的额度 ,返回修改过的Account对象.这个方法需要验证账户是否是信用账户
用户会通过调用Bank对象以上的方法来操作自己的账户,请分析各个方法需要的参数
另外,请为Bank类添加几个统计方法
1.统计银行所有账户余额总数
2.统计所有信用账户透支额度总数
写个主方法测试你写的类