多态的了解及应用

1.1多态的概述
多态是面向对象的三大特征(封装 继承 多态)之一.
通俗理解:多态就是一种事物的多种形态,例如学生是人的一种,则一个具体的同学张三既是学生又是人,即出现了两种形态.
专业的术语说就是:同一个实现接口,使用不同的实例而执行不同的操作。
1.2多态的定义和使用格式
定义格式:父类的引用变量指向子类对象
父类类型 变量名 = new 子类类型();
变量名.方法名();
普通类多态的定义的格式:

class Fu{}
class Zi extends Fu{ }	
Fu fu = new Zi();   
抽象类多态的定义的格式:
abstract class Fu{	
public abstract void method();
}
class Zi extends Fu{
	@Override
        public void method() {	}
}
Fu fu = new Zi();
接口类多态的定义的格式:
interface Fu{
	public abstract void method();
}
class Zi implements Fu{
	@Override
	public void method() {
		System.out.println("重写接口的方法");
	}
}
Fu fu = new Zi();
注:当同一个父类的方法被不同子类重写,在调用方法的时候,调用的为各个子类重写后的方法:
Person p1 = new Student();
Person p2 = new Teacher();
p1.work(); //调用的是Student类重写后的work方法
p2.work();	//调用的是Teacher类重写后的work方法

1.3多态的成员变量和成员方法
1.3.1成员变量

//父类
class Fu{
	int num = 10;
}
//子类
class Zi extends Fu{
	int num = 15;
}
//多态成员变量
//第一种:父类和子类中都有同名的变量----结果是:10 结果是:15
//第二种:父类没有的情况---编译未通过
//第三种:子类没有的情况---结果是:10 结果是:10
public class Demo {
	public static void main(String[] args) {
		//多态的表现 父类的引用指向子类对象
		Fu f= new Zi();
		System.out.println("结果是:"+f.num);
		Zi z = new Zi();
		System.out.println("结果是:"+z.num);
	}
/*
 * 结论:当子父类中出现相同的成员变量时,多态调用该变量的时:
 *    编译时期:参考的是引用类型变量所属的类中是否有被调用的成员变量----如果没有,则编译失败
 *    运行时期:参考的是子类中的变量
 * 简单可记做:编译看左边,运行看右边
 */			
}

1.3.2成员方法

//父类
class Fu{
	void show(){
		System.out.println("运行结果:父类");
	}
}
//子类
class Zi extends Fu{
	void show() {
		System.out.println("运行结果:子类");
	}
}
//多态-----成员方法
//第一种:父类和子类中都有同名的方法----运行结果:子类
//第二种:父类没有的情况---编译时报错
//第三种:子类没有的情况---运行结果:父类
public class Demo {
	public static void main(String[] args) {
		//多态的表现 父类的引用指向子类对象
		Fu f= new Zi();
			f.show();
	}
/*
 * 结论:当子父类中出现相同的成员方法时,多态调用该变量的时:
 *    编译时期:参考的是引用类型变量所属的类中是否有被调用的成员变量----如果没有,则编译失败
 *    运行时期:参考引用对象所指的对象所属的类,并运行对象所属类中多的成员方法;
 * 简单可记做:编译看左边,运行看右边
 */			
}

1.4instanceof关键字
     instanceof关键字的作用: 可以用来判断某个对象是否属于某种数据类型;
        格式:Boolean flag = 对象 instanceof 数据类型

class Person{};//人类
class Teacher extends Person{};//老师类
class Student extends Person{};//学生类
public class Demo4 {
	public static void main(String[] args) {
		Person p1 = new Student();
		boolean flag1 = p1 instanceof Student; //true
		boolean flag2 = p1 instanceof Teacher; //false
		boolean flag3 = p1 instanceof Person; //true
		System.out.println(flag1+":"+flag2+":"+flag3);
	}
}

1.5多态的转型--向上转型和向下转型
        多态的转型分为两种:
                    向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程.
                    使用格式:父类类型 变量名 = new 子类类型(); 如 Person p = new Student();
                    向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转换为子类引用,
                    使用格式:子类类型变量名 = (子类类型)父类类型的变量;如 Student stu = (Student)p;
            注意:如果是直接创父类对象,则是无法向下转型的;

猜你喜欢

转载自blog.csdn.net/weixin_42228950/article/details/80862648