欢迎来到天天文库
浏览记录
ID:40797448
大小:16.53 KB
页数:4页
时间:2019-08-07
《变量没有多态》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、多态中的方法是可以重写的,但是变量不能重写,你运行一下这个看看结果就知道了,父类声明,子类实例化,用这个对象去调方法是子类的方法,但是去调属性,就是父类的了。publicclassA{publicStringa="a";publicvoidA(){System.out.println("我是A类中的A方法");}}publicclassBextendsA{publicStringa="b";publicvoidA(){System.out.println("我是B类中的A方法");}publicstaticvoidmain(String[]args){Ab=newB();b.A();
2、System.out.println(b.a);}}结果:我是B类中的A方法aJava向上转型之后调用子类的同名变量/方法的问题(多态)2012-10-17 0 个评论 收藏 我要投稿直接引用百度知道上面的一个问题吧,问得很详细,答得很明确,我自己就不总结了。 java中向上转型时变量类型由声明时决定还是由new决定 比如classFather{ Stringname="父"; voidf(){System.out.print("父类");} }classSon{ Stringname="儿子"; voidf(){System.out.print(
3、"儿子");} voidf2(){}}Fathers=newSon();s.name;//1s.f();//2s.f2();//3我的疑问:不是说类型是由new决定的而不是由声明决定的吗?即Fathers=newSon()此时s的具体类型是什么?若是Father那上面的2就应该输出“父类”而不是“儿子”?若是Son类那就应该能调用f2()呀?另外还有name疑问,s.name怎么会是"父"呢?真是绕来绕去啊 首先classson改一下classSonextendsFather接下来分析:Fathers=newSon();表示定义了一个Father类型的引用,指向新建的Son类型的
4、对象。由于Son是继承自它的父类Father,所以Father类型的引用是可以指向Son类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。 所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;因此s.name调用父类的属性!f2方法父类没有,出错! 同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用; 对于父类中定义
5、的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就我总结一下(向上转型):1、同名字段的话是父类的。 2、如果子类覆盖了父类的方法,调用的是子类方法。 3、如果父类没有子类定义的方法,会编译错误。哎,结果是知道了。能不能帮我理解一下这句话:对象的类型是由创建它的类决定的,而不是由声明它的变量决定的。要是这样的话,那Son的class对象不是能够查找出f2()吗?回答记住哦,我们现在创建的是父类的引用指向子类Son的对象。子类中定义的方法f2在父类中不存在,所以用这父类
6、的引用去调用他没有的方法是错误的。 对于多态,可以总结它为: 一、使用父类类型的引用指向子类的对象; 二、该引用只能调用父类中定义的方法和变量; 三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用) 四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。java多态是一个难点,希望你多练多想,很快就会学通的,这个在做项目的时候很有用。
此文档下载收益归作者所有