java13面向对象深入3
大纲
面向对象-封装性
理解
封装( encapsulation)怎么去理解,一台电脑利用一个外壳包裹,保护了里面的电器元件,提供了少量的按键与其对接使用。我要看电视,只需要按一下开关和换台就可以了。有必要了解电视机内部的结构吗?有必要碰碰显像管吗?制造厂家为了方便我们使用电视,把复杂的内部细节全部封装起来,只给我们暴露简单的接口,比如:电源开关。具体怎么内部实现的,我们不需要操心。
需要让用户知道的暴露出来,不需要让用户了解的全部隐藏起来。这就是封装,白话: “ 该露的露,该藏的藏”。
概念
我们程序设计要追求“ 高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他部分只有通过包裹在数据外面的被授权的操作来与这个抽象数据类型交流与交互。也就是说,用户无需知道对象内部方法的实现细节,但可以根据对象提供的外部接口(对象名和参数)访问该对象。
作用
a)、实现了专业的分工。将能实现某一特定功能的代码封装成一个独立的实体后,各程序员可以在需要的时候调用,从而实现了专业的分工,即工作中的分模块、分功能开发。
b)、隐藏信息,实现细节。通过控制访问权限可以将可以将不想让客户端程序员看到的信息隐藏起来,如某客户的银行的密码需要保密,只能对该客户开发权限。
javabean
规则
在编写 javabean 中的有一些常用的规则如:
1)、属性尽可能私有化 private
2)、访问器: setter 与 getter 访问器 >private ,一般 public 居多 setterXxx: 存储> 与 getterXxx: 查看
代码
public class Person { //姓名
private String name; //年龄
private int age; //性别
private boolean sex;
public Person() {
}
//setter与getter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
}
经典MVC思想
概述
MVC是一种分层思想,一种设计模式。
M:Model层(模型层 )
处理数据、业务,再把处理后的数据提供给视图层
V:View层(视图层)
为用户展示数据,是数据最直观的体现。
C:Controller层(业务逻辑层)
接收界面层的数据,对接受到的数据进行封装和类型转换。
调用模型层的服务进行业务逻辑的处理。
调用合适的视图去渲染数据。
优点
- 减少代码量,提升性能(效率);
- 提高代码的扩展性(需求改动,无需改动太多的代码)
- 遵循高内聚、低耦合的原则
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mW6i5bco-1606188308960)(/1581945749553.png)]
权限修饰符
public: 一览无遗;
protected:子承父业 (儿子自己使用);
default :家庭和睦;
private :占为已有
面向对象-多态性
女朋友把我带到家,丈母娘一看,疯了!原来是像“曾志伟”!
概述
多态 polymorphism,主要是用来实现动态联编的,换句话说,就是程序的最终状态只有 在执行过程中才被决定而非在编译期间就决定了。这对于大型系统来说能提高系统的灵活性和扩展性。
java中如何实现多态?使用多态的好处?
引用变量的两种类型: • 编译时类型(模糊一点,一般是一个父类)
• 由声明时的类型决定。
• 运行时类型(运行时,具体是哪个子类就是哪个子类)
• 由实际对应的对象类型决定。
多态的存在要有3个必要条件:要有继承,要有方法重写,父类引用指向子类对象
代码
这里没有写
引用数据类型的类型转换
• 子类转换为父类:自动转换
上转型对象不能操作子类新增的成员变量和方法。
上转型对象可以操作子类继承或重写的成员变量和方法
如果子类重写了父类的某个方法,上转型对象调用该方法时,是调用的重写方法。
• 父类转换为子类:强制转换
(绝不是做手术,而是父类的真面目就是一个子类,否则会出现类型转换错误
抽象类
概述
使用了关键词 abstract 声明的类叫作”抽象类”。
抽象类是对抽象的世界建模,是作为父类使用的。比如: 请求出一个图形的面积? 这是你的思考究竟是什么图形?这个图形太抽象了?是三角形还是原型?图形怎么求面积?这个时候就可以把图形定义为抽象类。
几个要点
- 抽象方法和抽象类均必须用abstract来修饰。
- 抽象方法没有方法体,只需要声明不需实现。
- 有抽象方法的类只能定义能抽象类 。
- 相反抽象类里面的方法不一定全是抽象方法,也可能没有抽象方法。
- 抽象类可以包含属性、方法、构造方法。
- 抽象类不能实例化,及不能用new来实例化抽象类,只能用来被子类调用。
- 抽象类只能用来继承。
- 抽象方法必须被子类实现。抽象类的子类必须覆盖所有的抽象方法才能被实例化,否则还是抽 象类。
代码
这里没有写
接口
概述
接口(interface ),比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专 业地实现了:规范和具体实现的分离
如何定义
• 格式:
• [访问修饰符] interface 接口名 [extends 父接口1,父接口2…] {
• 常量定义 //总是public static final
• 方法定义 //总是:public abstract •
}
如何实现
- 子类通过implements来实现接口中的规范
- 接口不能创建实例,但是可用于声明引用变量类型。
- 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。
- Java的类只支持单继承,接口支持多继承
空接口
只是给 JVM 的一种标识而已,就是 JVM 的通行证。
1)、java.lang.Cloneable :不是所有的对象都可以被克隆 否则CloneNotSupportedException
2)、java.io.Serializable
实际开发中,一个业务逻辑处理类永远不要去继承一个实现好的类,要么继承抽象类,要么实现接口,优先使用接口,避免单继承的局限 :abstract class表示的是"is a"关系,interface表示的是"like a"关系
1)、java.lang.Cloneable :不是所有的对象都可以被克隆 否则CloneNotSupportedException
2)、java.io.Serializable
实际开发中,一个业务逻辑处理类永远不要去继承一个实现好的类,要么继承抽象类,要么实现接口,优先使用接口,避免单继承的局限 :abstract class表示的是"is a"关系,interface表示的是"like a"关系