面向对象的三个特征时:封装,继承,多态
1封装
将客观事物封装称抽象的类,每个类的属于自己的内部属性和方法有选择的让信任的类或对象操作,对不可信的进行隐藏。而且内部操作对外部不可见,封装这一特性体现了保护性
java以及C++中通过private 实现封装,要求成员变量要被private封装
2继承
在无需重新编写重复代码的情况下实现现有类的所有功能,并可以对其功能进行扩展,继承体现了可重用性。
** 那么什么样的实例可以使用继承关系实现呢?**
is-a的关系,比如女人是人,猫是动物,奥迪是汽车品牌。要继承的子类拥有父类所有的属性特征。只是更具体了,涵盖范围变小了。子类通过继承可以直接拥有全部父类的功能而且可以扩充自己的功能。
java中使用extends关键字修饰继承关系,和C++中的继承不同,java中的继承public继承(又叫显示继承)后还是public 。private继承(又叫隐式继承)后存在但不可见,都看不见就更不可以访问使用啦,所以父类中的私有属性都会定义setting,getting这样的接口方便子类操作父类属性。
class A{}
class B extends A{}
而且java中规定类只可以单继承。不允许多继承这就避免了C++中可怕的菱形继承啦。
子类中用super关键字表示父类。子类构造时要先调用super(参数列表)来构造父类,如果父类有无参构造可以不写super,当然此时调用的时无参数的父类构造啦。通过super.的形式访问父类成员。如果没有别覆写可以不写。(因为系统会在子类中找找不到再去父类找),但是注意super(参数列表)时要在方法首行,和this()要在首行冲突。所以不能同时存在使用。而且super并不能表示当前对象,这时this的特性。
3多态
一个类实例的相同方法在不同情形下的不同表现形式。多态使得不同的内部结构的对象共享相同的外部接口。
封装和继承都是为多态打基础的。
多态的最主要应用就是覆写(又叫重写)
如果子类定义类和父类完全相同的方法或者时属性的时候,就构成了覆写。
再经行方法覆写时,子类定义了与父类名称相同参数列表,返回值都完全相同的的方法。但是允许权限不同,子类方法的访问权限不能比要覆写的父类方法更加严格。覆写中不允许出现private因为private被继承后对子类不可见,就不存在覆写了。
那如果方法被覆写了我怎么知道调用的时父类的还是子类的方法呢
向上转型:
//前提B继承A覆写了A中的public void func()方法。
mian{
A a = new B();
a.func();
}
这里func调用的是被B覆写的因为这个a虽然是A类但是实际是通过B()new出来的。func()已经被B覆写了。也就是说 父类 父类引用 = new 子类();因为是通过子类New的所以被覆写了。
向下转型:
要向下转型必须有一个前提是发生了向上转型。想一下如果这个父类不是通过子类定义的必然没有子类拓展出来的功能,向下转型强转给子类?那么子类需要多出父类的那部分功能谁给啊。所以要求,这个父类必须是经过了向上转型的才可以再给子类向下转型。
...
A a = new B();
B b =(B)a;
b.func();
...
因为必须经过了向上转型后才可以再发生向下转型。那么我们怎么判定它是否进行过向下转型呢。如果不判断直接向下转型可能会发生运行时异常。
所以我们使用 :引用名 instanceof 类 --表示该类是否能够表示该类实例。从而判断是否进行过向上转型。举个例子:`` child instanceof Father;若返回为false则不可以。