java中的继承 多态详解
2016-08-19 10:27
204 查看
java中最重要的是抽象、继承、多态、封装
其中最难的就是多态,因为多态包含了继承,方法重写等知识
1、多态的定义:多态是面向对象的重要特性,表示同一个符号在不同的语义环境下有不同的解释,简单的说:“一个接口,多种实现“。2、多态的分类: 具体类多态(一般不用) 、 抽象类多态(常用) 、 接口多态(最常用)
3、多态的三要素: 继承、重写、父类引用指向子类对象。
从三要素中知道多态要用到继承:
子类继承父类的特征和行为,使得子类具有父类的属性和方法。特点:在继承关系中,父类更通用,子类更具体。父类具有一般的属性和行为,子类具有特殊的属性和行为。
在继承关系中,子类和父类要满足is-a关系,子类是父类的一个特例实现。
继承的好处:继承可以实现代码的复用,避免重复代码的出现。
继承的实现:
在java中,用extends(扩展)关键字来表示一个类继承另一个类。
在父类中只定义通用的属性和方法,子类自动继承父类的属性和方法,子类中定义自己特有的属性和方法,或子类重新定义 父类的属性,重写父类的方法可以获得与父类不同的功能实现。
举个例子看一下:
public class Father extends GrandFather{ public Father(){ super(); //注意》默认情况,系统会自动加入super(),表示调用父类的默认构造方法 System.out.println("父类的构造方法"); } public static void main(String[] args){ //this(); Son s = new Son(); } } class Son extends Father{ public Son(){ //当子类调用构造方法时,先调用父类的构造方法 super(); //注意》默认情况,系统会自动加入super(),表示调用父类的默认构造方法 System.out.println("子类的构造方法"); } } class GrandFather{ public GrandFather(int h){ System.out.println("h:" + h); } public GrandFather(){ super(); //注意》默认情况,系统会自动加入super(),表示调用父类的默认构造方法 System.out.println("爷爷的构造方法"); } }这段代码执行后的结果是:
爷爷的构造方法
父类的构造方法
子类的构造方法
由此可以看出:当通过new关键字创建子类对象时,不仅调用了父类的构造方法还调用了父类的父类的构造方法,这是因为当通过 new关键字创建子类对象时,如果不通过super关键字显示的调用父类的构造方法,虚拟机会自动添加super();来调用父类的构造方法,以此类推一直调用到Object类的构造方法。
下面通过内存图分析说明:
通过上图可以清楚看到继承关系中继承关系中的执行顺序;
当代码执行时先将class文件加载到方法区中,再将方法加载到方法区,执行main()方法,创建一个son对象,在栈区有一个 S s 指向堆中的new Son,
在执行构造方法时先执行父类的构造方法,父类的构造方法执行完后执行自己的构造方法。执行自己的构造方法时,先创建属性并初始化(类型的初始化),再赋你给出的值,如果后面还有赋值再继续,之后向下执行。
多态关系中的方法重写:
如果在子类中定义的一个方法,其名称,返回值类型和参数列表与父类中的方法相同,那么说子类的方法重写了父类的方法。方法的重写要与方法的重载区别开来:
方法重写:两个方法存在于不同的类中(父类和子类),方法名相同、参数列表也相同,返回类型相同,子类方法的访问权限要大于父类的访问权限。
方法重载:两个方法存在于同一个类中,方法名相同、参数列表也相同,返回类型可以相同也可以不同。
看下面这个例子:
public class Father{ protected void show(){ System.out.println("父类的方法"); } private double makeMoney(){ System.out.println("种田"); return 1.0; } } public class Son extends Father{ public void show(){ System.out.println("子类的方法"); } //子类方法的访问权限可以大于等于父类方法的返回权限 public int makeMoney(){ //子类方法的返回值类型, 方法名,参数列表必须与父类相同. System.out.println("互联网+"); return 1; } } public class A{ public static void main(String[] args){ Father f= new Father();//创建的实例是父类的对象 f.show(); Son s = new Son();//创建的实例是子类的对象 s.show(); Father father = new Son(); //隐式类型转换 ->父类的引用指向子类对象 fathe.makeMoney(); //调用子类的方法 new的是谁就是谁的对象 } }这段代码的执行结果是:
父类的方法
子类的方法
互联网+
多态:
多态的特性是表现出多种形态,具有多种实现方式。就是同一个接口,使用不同的实例而执行不同的操作。多态的好处:可以增强程序的可扩展性及可维护性,使代码更加简洁。
多态的实现:一般的做法是写一个方法
相关文章推荐
- [置顶] JAVA从零单排4-----继承、封装和多态详解
- JAVA从零单排4-----继承、封装和多态详解
- Java学习系列(四)Java面向对象之修饰符、封装、继承、多态详解
- Java面向对象的三大特征:封装、继承和多态的详解
- java 学习笔记——类之间的关系之封装、继承与多态的详解
- Java学习系列(四)Java面向对象之修饰符、封装、继承、多态详解
- java基础 继承、封装、多态、抽象详解
- Java基础之封装、继承、多态、接口详解
- Java中继承、接口、多态的作用详解(纯理论)
- 黑马程序员----Java中的封装,继承和多态详解
- 详解Java中的封装、继承、多态
- C++/java 继承类的多态详解及实例代码
- 【Java】Java的继承和多态详解
- Java基础与案例开发详解の继承和多态
- JAVA中继承、封装和多态详解
- Java学习系列(四)Java面向对象之修饰符、封装、继承、多态详解
- JAVA从零单排4-----继承、封装和多态详解
- Java基础-继承、重写、多态详解
- java继承、多态实题详解加载顺序
- 【Java】Java的继承和多态详解