封装性
一.思想
把该隐藏的隐藏起来,该暴露的暴露出来。
二.问题的引入
创建一个类的对象之后,可以通过"对象.属性"的方式对对象的属性进行赋值。赋值操作要受到数据类型和存储范围的制约。在实际情况中,我们往往需要给属性加额外的制约条件,这个条件不能在属性声明时体现,只能通过方法对其进行添加。
为了避免客户再用"对象.属性"的方式对对象的属性进行赋值,则需要把属性设为私有的(private)。此时属性体现了封装性。
三.封装性的体现
我们将类的属性私有化(private),同时提供公共(public)的方法来获取(getXxx)和设置(setXxx)此属性的值。
拓展:封装性的体现:①如上 ②不对外暴露的私有的方法 ③单例模式…
四.封装性的体现,需要权限修饰符来配合。
- Java规定的4种权限修饰符(从小到大):private,缺省,protected,public
- 4种权限修饰符可以修饰类及其类的内部结构:属性,方法,构造器,内部类
具体而言,4种都可以修饰类的内部结构:属性,方法,构造器,内部类。修饰类的话,只能使用缺省,public。 - 总结封装性:Java提供了4种权限修饰符来修饰类及其类的内部结构,体现类及其类的内部结构被调用时可见性的大小。
继承性
一.好处
1.减少了代码的冗余,提高了代码的复用性。
2.便于功能的扩展。
3.为之后多态性的使用提供前提。
二.格式
class A extends B{}
A:子类,派生类,subclass
B:父类,超类,基类,superclass
1.体现:一旦子类A继承父类B之后,子类A就获取了父类B中声明的所有的属性和方法。
特别 :父类中声明的private的属性或方法,子类继承父类之后,仍然认为获取了父类私有的结构。只是因为封装性的影响,使得子类不能直接调用父类的结构而已。
2.子类继承父类之后,还可以声明自己特有的属性或方法,实现功能的拓展。
子类和父类的关系,不同于子集和集合的关系。
extends:延展,拓展。
三.Java中关于继承性的规定
1.一个类可以被多个子类继承。
2.Java中类的单继承性:一个类只能有一个父类。
3.子父类是个相对概念。子类直接继承的父类,称为直接父类。间接继承的父类,称为间接父类。
4.子类继承父类之后,就获得了直接父类以及所有间接父类的属性和方法。
5.子类可以获取父类中private权限的属性和方法。(继承性和封装性 不冲突)。
四.注意点
1.如果我们没有显式一个类的父类的话,则此类继承于Java.lang.Object类。
2.所有的Java类(除了Java.lang.Object类之外)都直接或间接的继承于Java.lang.Object类。
五.子类对象实例化的过程
1.从结果上来看:(继承性) 子类继承父类之后,就会获得所有父类声明的属性和方法。创建子类的对象,在堆空间中,就会加载所有父类中声明的属性。
2.从过程上来看:通过子类的构造器创建子类对象时,我们一定会直接或间接的调用父类的构造器,进而调用父类的父类的构造器,直到调用了java.lang.Object类中空参的构造器。正因为加载过所有的父类的结构,所以才可以在内存中看到父类的结构,子类对象才可以考虑调用。
ps:虽然调用了多个构造器,但是至始至终都只创建了一个对象,即当下new的子类对象。
多态性(运行时行为)
1.可以理解成一个事物的各种形态。
2.对象的多态性:父类的引用指向子类的对象(子类的对象赋给父类的使用)。
3.多态的使用:虚拟方法的调用
有了对象的多态性,编译期只能调用父类声明的方法,运行期实际执行的是子类重写父类的方法。
总结:编译看左边,运行看右边。
4.使用前提: ①类的继承关系 ②方法的重写
5.对象的多态性,只适用于方法,不适用于属性(编译和运行都看左边)。
6.重载不表现多态性,重写表现多态性。
7.抽象类,接口的使用肯定体现多态性。(抽象类,接口不能实例化)
向下转型:使用强制类型转换符。
使用强转时,可能会出现ClassCastException异常。为了避免在向下转型时出现此异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,则继续向下转型;否则不进行。
a instanceof A :判断对象a是否是类A的实例。如果是,返回true;否则返回false。
如果a instanceof A返回true,a instanceof B也返回true,则说明类B是类A的父类。