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的是谁就是谁的对象
}
}
这段代码的执行结果是:
父类的方法
子类的方法
互联网+
多态:
多态的特性是表现出多种形态,具有多种实现方式。就是同一个接口,使用不同的实例而执行不同的操作。
多态的好处:可以增强程序的可扩展性及可维护性,使代码更加简洁。
多态的实现:一般的做法是写一个方法