学过JAVA的都知道OOP(面向对象)三大特征是什么:封装,继承,多态。但是到目前为止,还真没浏览过介绍他们之间关系的文章,所以在下就不免生出点小心思,在这里给晕乎乎的新手介绍一下,从大体来看,可能要好理解一点。
我们先来看一下对于这三者的定义:
封装:将对象信息状态通过访问权限修饰符隐藏在对象内部,不允许外部程序直接访问对象内部信息。简单来说,封装就是要找出某一类事物的共性然后提取出来。
继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展,也就是说如果子类继承了父类,那么它除了拥有属于自己的属性和方法,还会自动拥有父类的所有属性和方法。
多态:所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式,简单来说,我们都是人,都会唱歌,但是你是音痴,我是歌神~。
而关于封装,相信大家都读过这句话,属性可用来描述同一类事物的特征, 行为可描述一类事物可做的操作,封装就是要把属于同一类事物的共性(包括属性与行为)归到一个类中(当然不是说封装只是局限于类)。什么意思呢,举个例子:
class Person{
String name;
int age;//属性---成员变量
void run(){
}
void speak(){//行为----方法
}
}
就像每个人都用的共性,姓名和年龄,这就是人类的一个属性,所以可以简单的将其理解为我们定义类时的成员变量,而行为,人类都会跑,都会讲话,这就是我们定义在类里面的方法。所以封装,就是找出某些事物的共性,然后将之提取出来。
而封装仅仅只是这一点作用吗?当然不是,我们在java中经常把封装用作解决数据的安全性问题。如下:
class Person{
private String sex="man";
String name;
int age;//属性---成员变量
void run(){
}
void speak(){//行为----方法
}
}
class Wallet{
private String card;
...
public wallet getCard(){
return card;
}
}
用private把类里面的某些属性或方法与外界隔离,而要访问这些属性或者方法的唯一途径就是通过这个类本身,这个类才有资格调用它。在上面的例子中,类wallet里面有一个private修饰的私有属性card,一个公有的colour,就相当于你的钱包里有张信用卡,别人想要用,必须要经过你的同意(也就是new个对象才能拿到卡getCard())。那这么做的好处是什么呢?(下面新手只做了解即可,别强求理解,会炸)
1)确保属性的安全性,通过private修饰成员变量或者方法并强制和使用某个方法去设置或者改变这些特定的值,可以确保只设置合法的值。如上例中的private String sex=”man”;
2)通过private修饰做到了与外界隔离,只允许外部对类做有限的访问,开发中可以自由改变类的内部实现,而无需修改使用该类的那些程序。换言之,做到了调用与被调用代码的分离,可自由改变,各取所需。
那么接下来我们继续讲 继承跟封装 又有什么联系呢?
我们知道,由于封装,所以使有共同特征的一类事物的所有描述信息都被归于一类之中,但是我们知道,这些事物有共性,但肯定还存在区别,比如人类都会跑,都会讲话,但是每个人都会跳舞唱歌吗?显然是不可能的。再举个例子:
class Person{
String name;
int age;
}
class Student extends Person{
String studyNum;//学号
void study(){
}
}
class Teacher extends Person{
String teachNum;//教职工号
void teach(){
}
}
类person中有两个属性姓名(name)和年龄(age),学生(student)和教师(teacher)都属于人类(person),难道我们每次写一个属于人类的别的职业的时候都要重新把这些公用的属性都定义一遍吗?当然不,这就用到了继承,子类继承了父类所有的成员方法和属性,并且可以拥有自己特性(属性或方法)。学生(student)不仅有name和age,还有自己的学号(studyNum),教师也一样,有自己的(teachNum)。从此可以看出,继承解决了代码的重用问题。
那么继承和多态又有什么关系呢?
首先,什么是多态?简单的举个例子,如下:
class Person{
void eat(){
System.out.println("正常人吃饭都用两只手!");
}
}
class OneHandHandicapped extends Person{
void eat(){
System.out.println("一只手的残疾人只能用一只手吃饭");
}
}
class Normal extends Person{
}
class Test{
Person p=new Normal();//
Person p1=new OneHandHandicapped();//同一种引用类型指向不同类型的对象
p.eat();//正常人吃饭都用两只手!
p1.eat();//一只手的残疾人只能用一只手吃饭
}
如上:声明了两个同一引用类型(Person类)的变量p和p1,调用同样的eat方法却有不同的输出,这就是多态的体现。可以这么理解:同一种方法用于不同的对象(当然可能是相同的引用类型)会出现不同的体现。从这个例子我们能看出,多态解决了代码的扩展问题,而要想实现多态,必须要符合以下三种条件:
1)有继承;2)有方法的重写;3)父类引用指向子类对象(向上造型);
本帖主要是为了给新手理清思路的,感觉还是比较浅显易懂的,如果想多了解一点的可以私我~不喜勿喷~