封装、继承与多态
2016-03-20 21:39
183 查看
面向对象的三大特征:封装、继承与多态
封装的概念
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装的好处:只能通过规定方法访问数据、隐藏类的实现细节、方便加入控制语句、方便修改实现
继承:在父类的基础上创建更为特殊的子类的一种机制
继承的最大功能:体现代码的复用
继承体现的是一种is-a关系
关联体现的是has-a关系
特点: java中的继承是单继承(extends关键字后面只能有一个父类)
Everything is Object,任何一个类都直接或者间接的继承了Object类
类继承父类的特征和行为,使得子类具有父类的非私有属性和方法
子类除了具有父类的特征和行为,还具有一些自己特殊的特征和行为。
带有继承关系的子类创建对象的步骤:
1.分配内存(父类对象和子类对象)
2.递归的构造父类对象(先调用父类构造器,默认调用父类无参构造器,如果父类没有无参构造器,子类也没有显示地调用父类的有参构造器,编译失败)
3.初始化属性
4.调用构造器
java中的访问修饰符(Access Modifier):
访问修饰符可以修饰:属性,方法,类 (接口,抽象类)
方法覆盖(方法重写Override ):
要求
1. 在继承关系中,子类有一个方法和父类的方法同名
2. 参数列表一致
3. 访问修饰符大于等于父类方法的访问修饰符
多态
( 参考文章:http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html )
程序的最终状态只有在执行过程中才能被决定,而非在编译期间就决定了。
父类的变量指向子类的对象;一个接口类型变量引用实现类的对象。
例如:Aimal dog=new Dog();
多态存在的3个必要条件
要有继承
要有方法重写
父类引用指向子类对象
引用对象的两种类型:
编译时类型(模糊一点,一般是一个父类),有声明的类型决定
运行时类型(运行时,具体是哪个子类就是那个子类),有实际对应的对象类型决定
多态中方法调用的特点:
子类有,父类没有,编译失败。
提示:找不到符号。因为引用变量是父类类型,编译器在父类的方法表中查找方法,找不到,编译失败。
子类重写了父类的非静态方法,调用子类方法
子类重写了父类的静态方法,调用当前引用类型变量类型中的方法(父类)。
编译期根据引用类型变量所属的类型方法表中是否有调用的方法,没有编译失败。
运行期根据在堆中创建对象的实际类型找到对应的方法表,从中确定具体的方法在内存中的位置。
总之:只有实例方法有多态作用,其他成员全部没有。
多态中成员变量的特点:
无论编译期还是运行期,都只参考引用类型变量所属的类中是否有对象的成员变量。
(参考文章: http://blog.csdn.net/xiaochuhe_lx/article/details/9126325 )
对象类型之间的类型转化:
class Animal
class Dog extends Animal
class Hashiqi extends Dog
class Cat extends Animal
1.向上自动转型
Hashiqi h=new Hashiqi();
Dog d=h;
Animal a=h;
Object aa=h;
Dog d=new Dog();
Animal a=d;//向上转型
Animal c=new Dog();
Object ages=new int[10];
2.向下强制转型
Animal a=new Hashiqi();
Dog d=(Dog)a;
Hashiqi h=(Hashiqi)a;
Cat c=(Cat)a;//ClassCastException(类型转化异常)
super关键字
构造器和方法,都用关键字super指向父类,但是用的方法不一样。
方法用这个关键字去执行被重写的父类中的方法。构造器使用super
去调用父类中的构造器。而且这行代码必须放在子类构造器的第一行,否则编译将出错。
封装的概念
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装的好处:只能通过规定方法访问数据、隐藏类的实现细节、方便加入控制语句、方便修改实现
继承:在父类的基础上创建更为特殊的子类的一种机制
继承的最大功能:体现代码的复用
继承体现的是一种is-a关系
关联体现的是has-a关系
特点: java中的继承是单继承(extends关键字后面只能有一个父类)
Everything is Object,任何一个类都直接或者间接的继承了Object类
类继承父类的特征和行为,使得子类具有父类的非私有属性和方法
子类除了具有父类的特征和行为,还具有一些自己特殊的特征和行为。
带有继承关系的子类创建对象的步骤:
1.分配内存(父类对象和子类对象)
2.递归的构造父类对象(先调用父类构造器,默认调用父类无参构造器,如果父类没有无参构造器,子类也没有显示地调用父类的有参构造器,编译失败)
3.初始化属性
4.调用构造器
java中的访问修饰符(Access Modifier):
访问修饰符可以修饰:属性,方法,类 (接口,抽象类)
本类 | 同包中的其它类 | 不同包的子类 | 任意类 | |
private(本类) | YES | NO | NO | NO |
(defult)(本包) | YES | YES | NO | NO |
protected(子类) | YES | YES | YES | NO |
public(公共) | YES | YES | YES | YES |
要求
1. 在继承关系中,子类有一个方法和父类的方法同名
2. 参数列表一致
3. 访问修饰符大于等于父类方法的访问修饰符
多态
( 参考文章:http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html )
程序的最终状态只有在执行过程中才能被决定,而非在编译期间就决定了。
父类的变量指向子类的对象;一个接口类型变量引用实现类的对象。
例如:Aimal dog=new Dog();
多态存在的3个必要条件
要有继承
要有方法重写
父类引用指向子类对象
引用对象的两种类型:
编译时类型(模糊一点,一般是一个父类),有声明的类型决定
运行时类型(运行时,具体是哪个子类就是那个子类),有实际对应的对象类型决定
多态中方法调用的特点:
子类有,父类没有,编译失败。
提示:找不到符号。因为引用变量是父类类型,编译器在父类的方法表中查找方法,找不到,编译失败。
子类重写了父类的非静态方法,调用子类方法
子类重写了父类的静态方法,调用当前引用类型变量类型中的方法(父类)。
编译期根据引用类型变量所属的类型方法表中是否有调用的方法,没有编译失败。
运行期根据在堆中创建对象的实际类型找到对应的方法表,从中确定具体的方法在内存中的位置。
总之:只有实例方法有多态作用,其他成员全部没有。
多态中成员变量的特点:
无论编译期还是运行期,都只参考引用类型变量所属的类中是否有对象的成员变量。
(参考文章: http://blog.csdn.net/xiaochuhe_lx/article/details/9126325 )
对象类型之间的类型转化:
class Animal
class Dog extends Animal
class Hashiqi extends Dog
class Cat extends Animal
1.向上自动转型
Hashiqi h=new Hashiqi();
Dog d=h;
Animal a=h;
Object aa=h;
Dog d=new Dog();
Animal a=d;//向上转型
Animal c=new Dog();
Object ages=new int[10];
2.向下强制转型
Animal a=new Hashiqi();
Dog d=(Dog)a;
Hashiqi h=(Hashiqi)a;
Cat c=(Cat)a;//ClassCastException(类型转化异常)
super关键字
构造器和方法,都用关键字super指向父类,但是用的方法不一样。
方法用这个关键字去执行被重写的父类中的方法。构造器使用super
去调用父类中的构造器。而且这行代码必须放在子类构造器的第一行,否则编译将出错。
相关文章推荐
- 《Mysql 公司职员学习篇》 第二章 小A的惊喜
- SQL SERVER-in,between,like
- [android] 采用httpclient提交数据到服务器
- 读书笔记 | 从0到1:开启商业与未来的秘密
- 了解STL库中的squeue
- 大话设计模式之代理模式
- css 学习笔记
- 两端移动输出一个字符串
- C++面向对象高级编程笔记03--GeekBand
- 常用网络访问方式的模板
- HttpFox插件安装和打开教程
- 几种常见网页布局设计
- FTP访问类
- SQL SERVER-union
- 5w2h-是什么,是什么时代的产物
- src与href的区别
- 构造MaxTree
- 机器学习之期望最大算法(EM算法)
- xaml中的依赖属性
- 安卓程序员个人角度浅析创业型公司败因