目录
封装
封装的概念
封装也称为信息隐藏,是利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其它部分只有通过包裹在数据外面的被授权的操作来与这个抽象数据类型交流与交互。也就是说,用户无需知道对象内部方法的实现细节,但可以根据对象提供的外部接口(对象名和参数)访问该对象。
封装的好处
通过方法来控制成员变量的操作,提高了代码的安全性;把代码用方法进行封装,提高了代码的复用性。
封装的原则
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问;成员变量private,提供对应的getXxx()/setXxx()方法。
关键字
private关键字:
作用是保护成员不被别的类使用,被private修饰的成员只在本类中才能访问;
针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作;
提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰;
提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰。
this关键字:
this修饰的变量用于指代成员变量;解决局部变量隐藏成员变量;使用this:代表所在类的对象引用
继承
继承的概念
继承可以让类与类之间产生关系,子父类关系; 产生子父类后,子类则可以使用父类中非私有的成员。可以使得子类具有父类的属性和方法,还可以在子类中重新定义, 以及追加属性和方法;通过extends关键字实现继承。
继承的好处和弊端
好处:
提高了代码的复用性(多个类相同的成员可以放到同一个类中) 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)。
弊端:
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性。
继承的应用场景
使用继承,需要考虑类与类之间是否存在is..a的关系,不能盲目使用继承 is..a的关系:谁是谁的一种,例如:猫和狗是动物的一种,那动物就是父类,猫和狗就是子类。
关键字
子类如果想要直接调用父类的对象就需要使用super关键字。this关键字代表本类对象的引用。
this和super的使用分别
成员变量:
this.成员变量 - 访问本类成员变量
super.成员变量 - 访问父类成员变量
成员方法:
this.成员方法 - 访问本类成员方法
super.成员方法 - 访问父类成员方法
构造方法: this(…) - 访问本类构造方法
super(…) - 访问父类构造方法
访问特点
变量访问特点:
在子类方法中访问一个变量,采用的是就近原则。 子类局部范围找 子类成员范围找 父类成员范围找 如果都没有就报错(不考虑父亲的父亲…)。
构造方法访问特点:
子类中所有的构造方法默认都会访问父类中无参的构造方法 子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化 每一个子类构造方法的第一条语句默认都是:super() 如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢? 通过使用super关键字去显示的调用父类的带参构造方法 在父类中自己提供一个无参构造方法 推荐:自己给出无参构造方法。
成员方法的访问特点:
通过子类对象访问一个方法 子类成员范围找 父类成员范围找 如果都没有就报错(不考虑父亲的父亲…)。
多态
概念
同一个对象,在不同时刻表现出来的不同形态。例如:猫
我们可以说猫是猫,也可以说猫是动物。
或者人吃饭:吃中餐用筷子,吃西餐牛排用刀叉。
前提条件:
要有继承/实现关系;
要有方法重写;
要有父类引用指向子类对象。
访问特点
成员变量和成员方法的访问特点是编译看左边、运行看右边。
好处和弊端
好处:
提高了代码的扩展性。
定义方法时,如果将父类型作为参数,在使用方法时,可以传递任意子类对象。
弊端:
不能使用子类特有的成员。
解决方法:
使用向下转型
将父类型的引用转换成具体的子类对象。
转换格式:子类 对象名 = (子类)父类引用;