JavaSE第十八讲:多态剖析
来源:互联网 发布:淘宝分享不了怎么办 编辑:程序博客网 时间:2024/06/08 12:24
1.方法重写(Override):又叫做覆写,子类与父类的方法返回类型一样、方法名称一样,参数一样,这样我们说子类与父类的方法构成了重写关系。
【举例重写程序如下】
public class InheritenceTest2{public static void main(String[] args){Dog dog = new Dog();dog.run();}}class Animal{public void run(){System.out.println("animal is running");}}class Dog extends Animal{public void run(){System.out.println("dog is running");}}执行结果:
D:\src>java InheritenceTest2
修改程序如下(以下程序不可成为重写):
public class InheritenceTest2{public static void main(String[] args){Dog dog = new Dog();dog.run(1);}}class Animal{public void run(){System.out.println("animal is running");}}class Dog extends Animal{public void run(int i){System.out.println("dog is running");}}执行结果:
D:\src>java InheritenceTest2
dog is running
【说明】次处就不应该是重写,子类从父类当中继承了run()方法,而本省一个带参数的run(int i)的方法,所以只能说子类对父类的run()方法进行了重载,此时子类当中应该有两个run方法,一个是带参数的,一个是不带参数的,所以如果main方法中传递不带参数的run方法,则程序执行结果不同,参考以下程序。
public class InheritenceTest2{public static void main(String[] args){Dog dog = new Dog();dog.run();}}class Animal{public void run(){System.out.println("animal is running");}}class Dog extends Animal{public void run(int i){System.out.println("dog is running");}}执行结果:
D:\src>java InheritenceTest2
animal is running
2.方法重写与方法重载之间的关系:重载发生在同一个类内部的两个或多个方法。重写发生在父类与子类之间。重载是一种平行的关系,重写是一种层次关系,伴随着继承而发生的。
3.当两个方法形成重写关系时,可以在子类方法中通过super.run()形式调用父类的run()方法,其中super.run()不必放在第一行语句【此处super.run()与super();是不同的】,因此此时父类对象已经构造完毕,先调用父类的run()方法还是先调用子类的run()方法是根据程序的逻辑决定的。
修改以上程序
public class InheritenceTest2{public static void main(String[] args){Dog dog = new Dog();dog.run();}}class Animal{public void run(){System.out.println("animal is running");}}class Dog extends Animal{public void run(){super.run();//调用父类的run方法System.out.println("dog is running");}}执行结果:
D:\src>java InheritenceTest2
animal is running
dog is running
修改上一个程序第20行那段代码,修改如下:
public void run(){//super.run();//调用父类的run方法System.out.println("dog is running");super.run();}
执行结果:
D:\src>java InheritenceTest2
dog is running
animal is running
【说明】:Dog是继承了父类,super是对父类对象的引用,注意此处不是调用父类的构造方法与super();的区别,只是调用父类的普通方法【容易出错的地方】,此时父类对象已经生成了,所以只是顺序的调用方法而已。
4.在定义一个类的时候,如果没有显式指定该类的父类,那么该类就会继承于java.lang.Object类(JDK提供的一个类,Object类是Java中所有类的直接或间接父类)。Object类是Java中所有类的直接或间接父类。Object中的定义的十个方法每个都很重要,有时间要整理出来。
继承中构造方法的调用顺序,
public class InheritenceTest3{public static void main(String[] args){Son son = new Son();}}class Grandpa{public Grandpa(){System.out.println("grandpa");}}class Father extends Grandpa{public Father(){System.out.println("father");}}class Son extends Father{public Son(){System.out.println("son");}}执行结果:
D:\src>java InheritenceTest3
grandpa
father
son
5.多态(Polymorphism):我们说子类就是父类(玫瑰是花,男人是人),因此多态的意思就是:父类型的引用可以指向子类的对象。多态是构建在封装和继承之上的。
public class PolyTest{public static void main(String[] args){Flower rose = new Rose(); //多态rose.sing();}}class Flower{public void sing(){System.out.println("flower is singing");}}class Rose extends Flower{}执行结果:
D:\src>java PolyTest
flower is singing
【说明】:Flower rose = new Rose(); //多态 Flower类型的引用指向Rose的对象。
- JavaSE第十八讲:多态剖析
- JavaSE第十七讲:继承剖析
- #笔记#圣思园 JavaSE 第18讲——多态剖析
- JavaSE第十六讲:方法重载剖析
- JavaSE第三十一讲:Java数组剖析
- JavaSE 第四十讲:ArrayList源代码深入剖析
- 第十八讲
- JavaSE第十九讲:多态详解
- JavaSE第二十讲:多态详解 续
- JavaSE第二十六讲:包与导入语句剖析
- JavaSE第二十九讲:String类源代码深剖析
- JavaSE第三十讲:String类陷阱深度剖析
- JavaSE第四十一讲:LinkedList源代码深入剖析
- JavaSE第四十二讲:LinkedList源代码剖析 续
- JavaSE第四十六讲:迭代器、TreeSet及Comparator深度剖析
- JavaSE第五十二讲:HashSet 与HashMap源代码深度剖析
- JavaSE第六十一讲:Java反射机制深度剖析
- JavaSE第六十五讲:静态代理模式深度剖析
- LINUX中SAMBA详细安装
- 工作一年了
- Bigloo 3.9a 发布,Schema 语言编译器
- java调用外部程序 并指定工作路径
- 各种字符串Hash函数比较
- JavaSE第十八讲:多态剖析
- js高级(二)
- smarty 调制解调器
- 几种Java性能工具的事儿
- 推荐一系列优秀的Android开发源码
- smarty 缓存
- html frameset边框问题
- 中文字符编码和pathon中文字符显示总结
- 黑马程序员之C#学习笔记:使用Stream.Read方法从流中读取字节