1、多态中的方法是可以重写的,但是变量不能重写,你运行一下这个看看结果就知道了,父类声明,子类实例化,用这个对象去调方法是子类的方法,但是去调属性,就是父类的了。public class A public String a=“a“;public void A()System.out.println(“我是 A 类中的 A 方法“);public class B extends A public String a=“b“;public void A()System.out.println(“我是 B 类中的 A 方法“);public static void main(String args) A
2、b = new B();b.A();System.out.println(b.a);结果:我是 B 类中的 A 方法aJava 向上转型之后调用子类的同名变量/方法的问题(多态)2012-10-17 0 个评论 收藏 我要投稿直接引用百度知道上面的一个问题吧,问得很详细,答得很明确,我自己就不总结了。java 中向上转型时变量类型由声明时决定还是由 new 决定比如class FatherString name=“父“;void f()System.out.print(“父类“); class SonString name = “儿子“;void f()System.out.print(“儿子
3、“);void f2()Father s = new Son();s.name;/1s.f();/2s.f2();/3我的疑问:不是说类型是由 new 决定的而不是由声明决定的吗?即 Father s=new Son()此时 s 的具体类型是什么?若是 Father 那上面的 2 就应该输出“父类”而不是“儿子”?若是 Son 类那就应该能调用 f2()呀?另外还有 name 疑问,s.name 怎么会是“父“呢?真是绕来绕去啊首先 class son 改一下class Son extends Father接下来分析:Father s = new Son();表示定义了一个 Father 类型
4、的引用,指向新建的 Son 类型的对象。由于 Son是继承自它的父类 Father,所以 Father 类型的引用是可以指向 Son 类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的; 因此 s.name 调用父类的属性! f2方法父类没有,出错!同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类
5、型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就 我总结一下(向上转型):1、同名字段的话是父类的。2、如果子类覆盖了父类的方法,调用的是子类方法。3、如果父类没有子类定义的方法,会编译错误。哎,结果是知道了。能不能帮我理解一下这句话:对象的类型是由创建它的类决定的,而不是由声明它的变量决定的。要是这样的话,那 Son 的 class 对象不是能够查找出 f2()吗?回答记住哦,我们现在创建的是父类的引用指向子类 Son 的对象。子类中定义的方法f2 在父类中不存在,所以用这父类的引用去调用他没有的方法是错误的。对于多态,可以总结它为:一、使用父类类型的引用指向子类的对象;二、该引用只能调用父类中定义的方法和变量;三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。java 多态是一个难点,希望你多练多想,很快就会学通的,这个在做项目的时候很有用。