引言
封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。
在面向对象程序设计方法论中,封装是防止对实现细节的访问,根据具体的需要,设置使用者的访问权限,并通过访问修饰符
来实现。
I 封装
1.1 封装的步骤
将属性私有化,使用private修饰符,修饰需要隐藏的方法和属性
提供共有的方法,访问私有属性(getter,setter)
注:封装的目的是减少类与类的关联度
1.2 封装的规范
修饰属性的可见度,来限制对属性的访问
为每个属性创建一对赋值和取值方法
在setter和getter方法中加入对属性的限制
1.3 好处
增加了数据的访问限制,增强了程序的安全性。
为属性提供了一系列的规则,从而对属性起到保护的作用。
从广义的角度上隐藏了实现细节
注:方法签名是方法名+参数列表,重载跟返回值无关。
1.4 C# 支持的访问修饰符
public:所有对象都可以访问; private:对象本身在对象内部可以访问; protected:只有该类对象及其子类对象可以访问 internal:同一个程序集的对象可以访问; protected internal:访问限于当前程序集或派生自包含类的类型。
II 继承
事物之间存在相同的特性且存在包含关系,一个事物拥有另一个事物的特征,且具备自己的独立性。
2.1 语法
extends: 表名正在构建的类,派生于一个已经存在的类
注:在父类中定义一般的属性和方法
2.2继承的特性
java是单继承的
子类继承父类中非private的属性和方法
子类被初始化之前,父类会先被初始化(父类的构造器先于子类的构造器调用执行,先进行子类的构造器,却先执行父类的构造器,可使用debug来进行测试)
子类没显示的调用父类的构造器,则JVM会默认调用父类的无参构造器(父类的默认构造器可调用;即父类没有其他的构造器,或者显示的提供父类的默认构造器)
用super方法显示调用父类的构造器,且他必须在子类构造器的第一行
this,和super不能同时出现在构造器中,因为他们都要求在第一行
注:在创建子类时,如果子类的构造器中没有显式的调用父类构造器,在javac时,在子类的构造器的第一行自动加上super();
III 重写
子类中拥有父类相同的方法,但功能实现却不同。在调用时,优先使用子类的方法来完成功能。(前提是,父类的方法不能被私有化)
重写的要求:
- 存在继承关系
- 方法签名和放回值必须相同
- 访问的修饰符的可见性不能降低,声明的异常不能比父类方法的异常范围大。
IV 多态
行为多态:重写和重载
引用多态:基类对象的引用指向子类的对象
4.1 行为多态
重载:
- 在子类中,有多个相同的方法名,而参数列表不同
- 在子类和父类中,如果父类中的方法被子类继承,而子类中拥有和父类相同方法名,参数列表不同
重写:子类方法的修饰符不能小于父类的修饰符范围,异常不能大于父类的范围
4.2 引用多态
java变量两种类型: 一种是编译类型,一种是运行类型。
编译类型由变量的类型决定,运行时类型是实际对象类型决定。如果这两种类型不一致,这种现象为动态绑定,又叫引用多态。
例:Human h=new Teacher();
- 在编译阶段,涉及到类型转换,从小的转换到大的
- 在执行阶段:使用基类引用指代堆区中的子类对象
基类引用.子类属性,将编译出错。
因为,基类的引用对象是子类类型,这是java阶段的内存结构;而java代码执行需要javac,java两个阶段,所以他在javac阶段无法通过编译。
V 类型转换
自动转换(向上转换):小类型--->大类型
强制转换的语法:子类型 变量名=(子类型)
注:转换的前提是,存在继承关系
instanceof 用于判断对象的类型