1.前言
上一讲我们讲到,面向对象的三大特性,今天我们就来对这三大特性作简单介绍。
2.封装
对于一个程序,我们通常会要求它的构成代码要满足高聚合,低耦合的前提,也就是我们同一种语句,或作用差不多的代码段是可以重复利用的。比如:
如果,我们在多个地方都要重复以上三句话,是直接调用一个方法好呢?还是不停的重写这三句话,显然,当然是将这三句话装到一个方法更好了。
在比如:
如果这是一个私密程序,我们肯定不希望别人,可以这样直接修改我们的预设定。
但如果我们先给预设定上锁,在通过别的别的方法去给这个属性进行修改,无疑可以保证我们的安全性。更可以达到对某一属性进行修改的作用。
所以,封装的概念便由此而生。我不想去讲一大长串令人头大的概念,简单的来说,封装就是一个减少代码重复性;隐藏代码防止被随机访问的概念。要想访问某一属性或方法,都必须经过封装层的检测。
3.继承
在继承的开篇,我就要强调的一点是java的继承机制是单继承机制。牢记这个概念!
什么是继承,说到继承,在现实中,什么人能够继承,一般来说便是父母与孩子的关系,是最常见的继承,一个孩子继承了父母的基因,所以他们长相相似,继承了父母的说话方式,眼界等一系列人际间的、生物间的关系。
而在java中也引入了这个概念,假如一个A类自由的调B类的方法和属性,我们就把B称作A的父类,A作为B的子类。有人会问,如果B也有父类C,那A可以继承C的方法和属性吗?答案是可以的,此时我们称C类为超类。
可以看到,在B和C中都可以使用A中的hh方法,所以继承是存在的。在java中,继承符号位 extends, 写类名的后面,格式为 class 类名 extends 要继承的类名。
但是继承也不是可以完美的继承的,子类对父类的继承,只能是继承父类公开的方法和属性,这里涉及到了修饰符的概念。
修饰符
这个很简单就不多讲了。
子类不能继承父类私有的属性和方法。
如图,当我们将hh的修饰符换成了私有后,bb并不可以调用这个方法了,也就是说,BB完全没有继承这个方法。
接着,我们要讲一个和继承有关的关键字,super,super是子类用来调用父类中的方法和属性的媒介。比如:
如果,我们想直接在类中使用父类的属性,我们就可以使用super关键字去调用。
细节:
在我们实例化一个子类时,子类必须调用父类的构造器,去完成父类的初始化。比如:
所以,我们可以看到,子类的构造器在实例化一个对象时,是会使用super()方法去调用父类的无参构造器,如果父类有多个构造器,我们可以通过super(参数)去调用不同的父类构造器。并且当我们使用super(参数)时,super()必须放在构造器的第一行。还记得我们讲过的this吗,如果我们一个构造器中,希望去调用其他构造器,就用this(参数),但是this()也必须放在第一行,由此可见,this()和 super()是不能一起用的。注:this是关键字,this()是函数,super是关键字,super()是函数。
有人会问了,如果我们在子类和父类都定义了同样的方法,同样属性,那么我们实例化调用的时候,是使用的父类的属性还是子类的属性呢?请看图解:
如果,我们在子类中定义了某个方法,该方法的名称、返回类型、参数都一样,我们就称子类的方法重写了父类的方法,这个概念和前面的重载是不是很像呢?重载是在类中的,重写是对于父类与子类的。
如图,这种行为就叫做重写,@Override是重写标志,当然我们可以不在里面去调用父类的方法也可以自己写。
当然,实例化后,调用的顺序和属性是一样的,从子类开始寻找。
5.结语
今天的内容到这来就结束了,明天我们来讲解三大特性中的最后一个,多态!