本帖最后由 gulup 于 2013-8-26 17:12 编辑
你感觉会乱,是因为面向对象的思想还没有形成,这个不能急,只能靠自己慢慢理解,有些人一听就能理解,有些人一个月都理解不了。
回过头来回答你的问题。
1.重写和重载是不是一种多态的体现?
面向对象中,多态这个特性主要表现就是在两方面
1,方法的重写和覆盖(我比较喜欢这样叫,比较不会容易混淆)
2,对象的多态性(这个主要就是说对象的上下转型)
2.类B继承类A,子类B具有父类A的形态;类D是接口C的实例化,类D具有接口C的形态。这里的形态指的是什么?
什么叫多态?就是多种形态。一个人你能认出他,主要是因为他的外貌,名字等,这些就是这个人的形态,他的儿子,肯定会像他,而且肯定是和他一个性的,所以说他儿子就具有了他爸爸的形态。一个类A,具有各种方法和属性,这些方法和属性,就是这个类的形态的构成,当另一个类B继承了这个类之后,就拥有了类A的所有属性和方法,那么如果这个类B不去扩展任何属性和方法的前提下,它除了类名和类A不一样,其他有区别吗?没有。所以说一个类继承了另一个类之后,就具有了另一个类的形态。那什么叫多?当子类扩展了它自身的属性和方法等,那么它就不仅具有父类的形态,它还具有了自己的形态,那就是多种形态。它可以向上转型为父类。这就是多态。接口同理。
3.继承多态在声明或调用时有什么要注意的,具体怎么操作?接口多态呢? 回到第一题,多态主要就表现在方法和对象中。不管你是继承还是实现。当你实现了方法覆盖,重写,或者对象的转型。你就具体操作出了多态。
3.1 什么是访问,什么是调用?访问和调用分别用在哪里?(继承和接口中是否一样?) 访问和调用,其实可以差不多,也可以说不一样。你想想,一个人,你需要知道他的名字,你可以直接问他,他告诉你他的名字了,这时候可以称之为你访问了他的名字这个属性吧?同时,其实你是在调用他一个叫做讲名字的方法,他通过这个方法来告诉你的。
3.2 访问和调用如何使用?(继承和接口中是否一样?)上面的比喻说完了,相信你应该能理解访问和调用。我要访问一个类中的某个属性,其实也称之为我调用了其属性。继承和接口到底有啥不同?JAVA因为只支持单继承,为了弥补这个缺陷,就有了接口实现。多重实现,实现多个接口,以达到类似多重继承的目的。继承会继承父类的所有方法和属性,父类中一般都会实现好这些元素,一旦父类的一些东西是你不满意的,你想修改就会不灵活。接口的实现,因为接口里面都是常量和抽象方法,需要子类自己去做实现,灵活多变,接口更倾向于作为一个标准使用。因为多态,我可以向上转型为接口类型,那我的某个方法就可以直接设计成接受接口类型作为参数,把实现了接口的子类传入,不同的子类有不同的实现,这也是多态的表现。如果要继承,也应该继承抽象类。千万不要去继承一个已经实现好所有方法和属性的类。因为这个类你已经实现好了,当你继承了它,那么你可能避免不了的就会去覆盖掉了某些方法,多态下,调用的,肯定是被覆盖的方法,那么,那个父类已经实现好的方法就等于做了无用功。
4.我的课堂笔记上关于多态的访问记有以下一段,现在回顾时却不知道怎么去理解,我感觉是一个关键,请帮我看下这段是什么意思: 父类类型 变量名 = 子类对象; 变量名.调用成员变量 → 声明类型 变量名.调用成员方法 → 看实现内存
抱歉,这个我解释不了。
5.老师总结过一句话叫做“编译看声明,运行看实现。”,该如何理解
这句话我也不是很能理解,我的理解是,例如,B继承了A B b = new B(); A a = b; 编译时,a是A类型,b是B类型。 当类被加载到虚拟机中,在内存中分配内存的时候,A类型的a指向了B类型的b,那么它现在是否可以成为有A形态的B?这时候如果你要调用a的方法,那么是否就要看B类型具体的实现了?好吧,这里解释得太生硬了。。 |