刚学习多态和重写不太懂

/**

  • 父类
  • @author Administrator * / public class Base { public void method(){ System.out.println("Base method"); } } /*
  • 子类
  • @author Administrator * / public class Child extends Base{ public void method(){ System.out.println("Child method"); } } /*
  • 测试类
  • @author Administrator
    *
    */
    public class Sample {

    /**

    • @param args */ public static void main(String[] args) { Base base=new Child(); base.method();

    }

}
输出的是子类的“Child method”,不知道整个运行的过程,自己也调试过,看不懂,请大神赐教。

多态是同一个类中来说,重写是相对于父类来说的。

method方法是子类重写父类的实现,

Base base=new Child(); base.method();
这里就是因为多态的技术,才会打印子类的输出

对于一个司机,有必要了解引擎是怎么工作的才能开好车么?这个答案显然是否定的。学习编程也一样。
你首先应该了解的是函数的重写有什么用,它对于编程提供了什么有价值的意义。
在一个比较大型的项目中,涉及很多人编写同一个程序,每个人各负责一块,这是最好的。相反,对于某个代码,必须不同的人都去修改它才能添加新的功能,这是不好的。
函数重写的现实意义在于,一个开发者编写了一个类,另一个开发者希望修改或者添加代码实现对这个类的自定义,函数重写提供了一种办法,不直接修改这个类的本身,而是对它编写一个派生类,把需要自定义的代码写在派生类中,实现这个自定义的过程
理解这个现实意义非常重要。因为不同的编程语言尽管底层实现函数重写的机制各不相同,但是它提供给程序员的语言特性和功能都必须符合这个意义。好比无论是柴油车、汽油车还是电动车,引擎的构造千差万别,但是必须满足为汽车提供动力这个现实需求。
Base base=new Child(); base.method();
回到你的问题,看上面两行代码,Base就是一个允许别的程序员对它扩充和自定义修改的类,而Child正是这么修改它的。
现在的问题是,base.method()到底调用谁?如果调用的是基类的,那还怎么“扩充和自定义修改”?
所以这个问题就很明确了,至于幕后java怎么实现,C++怎么实现,xxx语言怎么实现,对你来说则无关紧要。
好比汽车的发动机,无论怎么实现,如果不能提供动力输出,那么显然它就是一台没用的发动机。

红字没有显示全,我重新写下
一个开发者编写了一个类,另一个开发者希望修改或者添加代码实现对这个类的自定义,函数重写提供了一种办法,不直接修改这个类的本身,而是对它编写一个派生类,把需要自定义的代码写在派生类中,实现这个自定义的过程。

关于多态是怎么回事,看我另一个问题的回答:http://ask.csdn.net/questions/364162

符合父类引用指向子类对象时,如果调用的方法被重写了就执行子类的,如果没重写就执行父类的

多态指的是同一个方法名不同的参数,因为在编译的时候,会为每一个方法提供一个唯一的标示,我们暂时理解为这个方法在jvm中的名字。那么,多态就可以支持
方法名相同

其次重写是在java体系种更加重要的概念。
继承父类,子类的成员变量是和父类相同的。比如说一个孩子的父亲有身高、腰围等等属性,那儿子一定也会有。
但是方法就是父亲的行为,儿子的行为有可能和父亲的不一致。这就是重写。比如有一个eat()方法。父亲喜欢吃茄子。而儿子喜欢吃别的。

new Child()的过程,会在内存中申请地址,开辟空间创建对象,这个地址,会被赋值给栈内存中的父类引用Base base;
那么这个base也就指向了new Child()创建出来的Child对象。
所以当base.method()时,实际是base指向的Child对象在调用method方法,所以会出现这个结果。
对多态前期的理解可以体现为两句话:
父类的引用指向了子类的对象;
一个对象有多种表现形式;
多态例子
如果不理解为什么base可以指向new Child(),那么需要再去学习学习继承。

首先你要明白两点:
1.多态有两种表现形式:重载和重写(覆盖);
2.要理解多态就要理解重写和重载的各自作用和两者之间的区别。相关资料网上很多。重写主要跟继承有关,重写父类的方法;
所以你要理解:面向对象->继承->重写 重载就是参数相同,方法名不同的两个方法 比如 int way(int b)和int way(int a,int b).具体的去网上查相关的概念

多态就是一个对象的多种形态,比如一只猫,我可以叫他猫,也可以叫他动物,我还可以给他取名字叫他“小狗”等!
多态必须建立在继承的基础上多态才有意义!
例如:
public class Anmial{
public void F1(){
system.out.println("anmial------");
}
}l
public class Cat extends Anmial{
//多态的体现,Anmial an=new Cat();后可以an.掉用父类的方法,也可以调用子类的方法,也可以Cat cat=new Cat();cat调用cat调用Cat中的方法,
//这样cat就有了多种叫法,可以使an,也可以是cat
Anmial an=new Cat();
public void F1(){
system.out.println(" Cat------");
}
}l
子类重新父类的方法后会覆盖掉父类的方法,Anmial an=new Cat();后,会先到父类中去查,然后到子类,发现如果子类重新写了父类的方法,
就会调用子类的方法,如果没有重新就调用父类的方法了!

Base base=new Child();
看到上面这句没有,其实你可以这样理解的:
例如:
人 a=new 女人();
如果是人,里面一定有一个撒尿的方法,方法可以使具体的,也可以是抽象的,
这个时候,女人一定继承于人的类,那么可以重写里面撒尿的方法,蹲下来撒尿.
虽然你是声明是人,不过你具体是一个女人,当你要取撒尿的时候,你应该蹲下来的.
理解了上面之后,java的多态机制也在于这里,以一个人的角度去看一个女人,
以一个父类的角度去看一个子类

面向对象的三大特征:
1.封装
2.继承
3.多态
多态:一个对象具备多种形态(父类的引用类型变量指向了子类的对象 或者 接口的引用类型变量指向了接口实现类的对象)
多态的前提:必须存在继承或者继承的关系
多态要注意的细节:
1.多态情况下,子父类存在同名的(静态和非静态)成员变量时,访问的是父类的成员变量
2.多态情况下,子父类存在同名的非静态成员函数时,访问的是子类的成员函数
3.多态情况下,子父类存在同名的静态成员函数时,访问的是父类的成员函数
4.多态情况下,不能访问子类特有的成员(成员变量和成员方法)
总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名的非静态函数时才是访问子类的

多态是子类和父类之间的关系,
重写是同一个类内部的方法之间的关系

其实刚开始,对刚学习Java的初学者来说,你只要明白方法是怎么调用的就可以了,学到后面你自然就会明白了.记住一点,父类方法如果子类重写了,那在调用方法的时候,输出结果就是子类重写的方法.否则,是父类的方法.

多态就是一个函数有多种实现形式,传递的参数不同而已。重写的话就是父类已经有这个方法了,在子类中又一次重新实现了这个方法,会优先调用子类的这个方法的实现。如果子类没有实现这个方法,就去调用父类的。子类实现了这个方法的话,父类的这个方法就没用了。(两个方法名字和参数一模一样)