您的位置:首页 > 编程语言 > Java开发

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的是谁就是谁的对象
}
}
这段代码的执行结果是:

父类的方法
子类的方法
互联网+

多态:

多态的特性是表现出多种形态,具有多种实现方式。就是同一个接口,使用不同的实例而执行不同的操作。
多态的好处:可以增强程序的可扩展性及可维护性,使代码更加简洁。
多态的实现:一般的做法是写一个方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息