- 面向对象的三大特征:封装、继承与多态
封装的概念
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
- 封装的好处:只能通过规定方法访问数据、隐藏类的实现细节、方便加入控制语句、方便修改实现
继承:在父类的基础上创建更为特殊的子类的一种机制
继承的最大功能:体现代码的复用
继承体现的是一种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 |
方法覆盖(方法重写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
去调用父类中的构造器。而且这行代码必须放在子类构造器的第一行,否则编译将出错。