先写一些,有时间补充完整
首先要理解几个概念:
1、对象与对象变量。
举个一般书中常见的栗子:比如要构造一个Date类的对象,语法为new Date(),有基础人的都知道这叫通过构造器构造了一个Date类的对象(至于什么叫构造器,就请百度......)回归正题,通常,我们希望自己构造出的对象可以多次使用,所以一个东西去表示它,这时就出现了对象变量,将对象存放在对象变量中,语法为Date time=new Date(),等号代表的也就是所谓的
方法的名字和参数和在一起成为签名比如 f(int),其中f就是方法名,括号内的int就是参数名,注意签名不包括返回的类型。
4、函数的重写与重载。
如果在子类中定义一个与父类签名相同的方法,就叫做重写,也就是此时子类的方法覆盖了父类的方法。而如果具有相同的方法名却有不同的参数,那么就是重载,重载的目的在于以统一的方式去处理不同不同类型的数据,在调用方法时通过判断所传递的参数去判断去决定具体调用哪一个方法,这也是多态性的一种体现。
5、继承
继承具体太多不展开,与题主的问题不符。简单点说,继承就是父类继承一个子类,使得子类能够重用父类的代码,同时也是实现多态的前提,BTW:面向对象编程的三大特征:即封装、继承、多态。
6、下面来讲多态性:
基本概念:发送消息给某个对象,让对象自行决定响应何种行为。
多态性机制的针对的是什么:对象变量
基础:Java运行时多态性的基础是动态方法调度,本质上是一种在运行时而不在编译时调用重载方法的机制。
多态性机制的直观体现:
栗子:Father child= new Child();//当然右边为Grandson也行.......
也就是说:一个类的对象变量可以引用其任何一个子类的对象(反之不成立),换句话说:通过将子类对象的对象引用赋值给超类(父类)对象的对象变量来实现动态方法的调用。为什么一个类的对象变量只能引用自己的子类而不能引用自己的父类呢?因为编译器在处理此类问题的时候可以自动实现向上转型,也就是将被引用的对象转型成引用它的超类。如果要向下转型,则需要显式表示并且强制转换。当然,当一个方法的型参中只提供程序运行时传进的实参的父类类型是,也会进行向上转换。
多态性的机制所遵循的规则:当出现一个类的类型变量引用指向其子类对象时(也就是多态性出现的时候),在接下来的程序中,是由被引用的对象(子类)的类型而不是引用对象(父类)的类型来决定调用谁的方法,但是有前提条件:这个方法能被调用的前提在于它已经在超类中定义了该变量(或者说是被子类覆盖了)。当一个父类对象变量指向一个子类的对象时,父类对象变量无法调用子类特有的方法(注意子类对父类方法重载后就算两个不同的方法了),并且当父类中的方法被子类重写后(也就是签名相同时),那么父类对象变量就会调用子类所重写的这个方法,这也就是所说的动态连接。当然,如果将原对象强制转换为子类对象,那么也就可以调用子类中特有的方法了。
PS:方法调用的优先顺序 ,优先级由高到低依次为:this.show(Object)、super.show(Object)、this.show((super)Object)、super.show((super)Object)。(super是单级父类)
当然,上述的优先级原则顺序一定建立在多态性成立的前提下。
首先要理解几个概念:
1、对象与对象变量。
举个一般书中常见的栗子:比如要构造一个Date类的对象,语法为new Date(),有基础人的都知道这叫通过构造器构造了一个Date类的对象(至于什么叫构造器,就请百度......)回归正题,通常,我们希望自己构造出的对象可以多次使用,所以一个东西去表示它,这时就出现了对象变量,将对象存放在对象变量中,语法为Date time=new Date(),等号代表的也就是所谓的
2、引用的概念。翻译过来就是对象变量引用了一个对象。当然这里需要强调一点,一个对象变量并没有实际包含一个对象,而仅仅引用了一个对象。
3、签名。方法的名字和参数和在一起成为签名比如 f(int),其中f就是方法名,括号内的int就是参数名,注意签名不包括返回的类型。
4、函数的重写与重载。
如果在子类中定义一个与父类签名相同的方法,就叫做重写,也就是此时子类的方法覆盖了父类的方法。而如果具有相同的方法名却有不同的参数,那么就是重载,重载的目的在于以统一的方式去处理不同不同类型的数据,在调用方法时通过判断所传递的参数去判断去决定具体调用哪一个方法,这也是多态性的一种体现。
5、继承
继承具体太多不展开,与题主的问题不符。简单点说,继承就是父类继承一个子类,使得子类能够重用父类的代码,同时也是实现多态的前提,BTW:面向对象编程的三大特征:即封装、继承、多态。
6、下面来讲多态性:
基本概念:发送消息给某个对象,让对象自行决定响应何种行为。
多态性机制的针对的是什么:对象变量
基础:Java运行时多态性的基础是动态方法调度,本质上是一种在运行时而不在编译时调用重载方法的机制。
多态性机制的直观体现:
栗子:Father child= new Child();//当然右边为Grandson也行.......
也就是说:一个类的对象变量可以引用其任何一个子类的对象(反之不成立),换句话说:通过将子类对象的对象引用赋值给超类(父类)对象的对象变量来实现动态方法的调用。为什么一个类的对象变量只能引用自己的子类而不能引用自己的父类呢?因为编译器在处理此类问题的时候可以自动实现向上转型,也就是将被引用的对象转型成引用它的超类。如果要向下转型,则需要显式表示并且强制转换。当然,当一个方法的型参中只提供程序运行时传进的实参的父类类型是,也会进行向上转换。
多态性的机制所遵循的规则:当出现一个类的类型变量引用指向其子类对象时(也就是多态性出现的时候),在接下来的程序中,是由被引用的对象(子类)的类型而不是引用对象(父类)的类型来决定调用谁的方法,但是有前提条件:这个方法能被调用的前提在于它已经在超类中定义了该变量(或者说是被子类覆盖了)。当一个父类对象变量指向一个子类的对象时,父类对象变量无法调用子类特有的方法(注意子类对父类方法重载后就算两个不同的方法了),并且当父类中的方法被子类重写后(也就是签名相同时),那么父类对象变量就会调用子类所重写的这个方法,这也就是所说的动态连接。当然,如果将原对象强制转换为子类对象,那么也就可以调用子类中特有的方法了。
PS:方法调用的优先顺序 ,优先级由高到低依次为:this.show(Object)、super.show(Object)、this.show((super)Object)、super.show((super)Object)。(super是单级父类)
当然,上述的优先级原则顺序一定建立在多态性成立的前提下。