说到面向对象的思想,不得不说两个核心的概念--继承和多态,不得不说,以前刚学java的时候,确实没有感觉到继承和多态的威力,后来,做了一些东西,看了一些书,才发觉,我靠,原来,可以这么干的!多态原来这么神奇的!好吧,这其实只是我整理这篇博客的最重要理由,因为,我觉得java的核心灵魂之一,其实就在这了。
一、传统面向过程VS面向对象
传统的语言,很多时候一个模块是一个函数(在java里叫方法),而一个函数对应实际的某个模型的动作,面向过程其实就是将要解决的问题拆分为一个个动作,当所有动作完成时,问题便解决了。
而面向对象的语言,一个模块其实是一个对象(类),它对应实际某个模型的某个部分,这些一个个对象组成了整体解决问题的模型,要解决问题时,不再是直接函数调用,而是变成对象之间进行联系通讯,最后得出结果。
好吧,好像这些话说有些我也不知道有没有理解到位,仅供参考就好了,也欢迎指正。
二、继承,多态
1、什么是继承?
个人理解,某些java类之间对应于现实的从属关系,其实就是java的继承:学生属于人,那么,学生类可以继承人这个类。继承不仅仅是一种代码复用的手段,更是多态的基础。放小段代码简单说明下:
class Person{ public String sex; public String name; public void study(){ } } //Student继承了Person,表明这样一种关系:student是一种类型的person //这里使用extends关键字连接子类和父类 class Student extends Person{ }
2、子类,父类。子类和父类的关系可以理解为子类从属于父类,例如上述的学生属于人,它表示一种A是B的关系但是B不一定是A的关系,在这里,学生是人的子类。
3、覆盖。当子类和父类都有共同的动作时(对应类的共同方法),子类的该动作可以被允许有自己独特的实现。覆盖是实现多态的重要手段(还有就是接口和重载,重载是类本身内部多态的表现,二接口和覆盖则是子类表现出多态特性),很多时候我们会操作相同父类引用来进行对不同子类之间的操作,在这个过程,子类会表现出自己独特的方法实现方式,这其实就是下面的多态。
class Person{ public String sex; public String name; public void study(){ System.out.println("我是父类方法"); } } //Student继承了Person,表明这样一种关系:student是一种类型的person //这里使用extends关键字连接子类和父类 class Student extends Person{ //当我重写父类方法时,我便覆盖了父类的方法 public void study(){ System.out.println("我是子类方法"); } }
4、多态(这里讨论子类之间的多态)。多态的意思,就是同样的动作(即对应现实中的方法),在不同的子类中,会有不同的实现方式,在实际中只需要通过操作父类引用便可以使得同样的引用指向不同类型的实际对象(当然,这个对象还是需要在真正运行时作为参数传输进来的)的对应方法,这种方法名字一样但是内部实现或者说表现出来的效果不同的对象操作方式便是多态。下面接着上面的例子简单贴下代码展示多态的过程:
public class ClassExtends { Person person = null; public void setPerson(Person person){ this.person = person; } public static void main(String [] args){ Test t = new Test(); //如果这里传入student对象,则下面的执行方法将会执行student的学习方法 t.setPerson(new Student()); //如果这里传入coder对象,则下面的执行方法将会执行coder的学习方法 t.setPerson(new Coder()); t.person.study();//这种同一个方法名表现不同执行方法动作(实现)的行为就是多态 } } class Person{ public String sex; public String name; public void study(){ System.out.println("我是父类的学习方法,我利用大脑胡乱学习"); } } //Student继承了Person,表明这样一种关系:student是一种类型的person //这里使用extends关键字连接子类和父类 class Student extends Person{ //当我重写父类方法时,我便覆盖了父类的方法 public void study(){ System.out.println("我是学生的学习方法,我利用教课书进行学习"); } } class Coder extends Person{ public void study(){ System.out.println("我是程序员的学习方法,我利用电脑谷歌学习"); } }
上面代码关于多态的概念也将得差不多了,其实就是:多态其实就是同一方法在不同的子类中,拥有了不同的执行动作,而操作该方法的不是子类引用而是父类引用,后面会说到,很多时候也可以通过接口进行类似的操作方法。
三、访问权限问题
1、java有三中访问权限修饰词:public,default,protected,private的访问权限参考下图:
2、最后补充两个两个基语法:
A、父类方法为public,子类的方法也必须是public,也就是说,覆盖方法时,子类的方法访问权限不能小于父类同名方法的访问权限。其实这样是可以理解的:访问权限方面,子类应该遵循父类的设计,当出现一个父类方法是public而子类方法是private的时候,是不合理的,因为,父类方法在定义的时候就明确了:我应该对外开放,但是子类却禁止了外面访问,这明显是破换了原来父类的设计意图。当然,反过来就没问题,因为,子类方法明显可以运行自己有比父类更多的访问权限,因为有时候会通过子类访问父类的protected方法。
C、final关键字:final关键字表现了这样一个含义:我被final修饰后,我就不可变了。当基础变量被final修饰后,是不能改变的;当引用被final修饰后,引用指向的内存块不可变;当方法被final修饰后,表示该方法不可被子类覆盖;当类被final修饰时,表示类不能被继承。