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类的构造方法。


下面通过内存图分析说明:




java的继承和多态 java中的继承和多态_java



通过上图可以清楚看到继承关系中继承关系中的执行顺序;


当代码执行时先将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的是谁就是谁的对象
	}
}

这段代码的执行结果是:


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



多态:


多态的特性是表现出多种形态,具有多种实现方式。就是同一个接口,使用不同的实例而执行不同的操作。


多态的好处:可以增强程序的可扩展性及可维护性,使代码更加简洁。


多态的实现:一般的做法是写一个方法