Java自学笔记(十)

多态

要用到多态,一定是已经有子父类关系或者类实现接口等前提


格式:

父类类型 变量名称 = new 子类型行();
变量名称.方法();


具体体现(父子类,抽象类,接口)
 
   
class Fu {}class Zi extends Fu { public void method(){ System.out.println(“重写父类抽象方法”);} }//类的多态使用
Fu f = new Zi();//这其实就是向上转型
 
  
abstract class Fu {
         public abstract void method();
	     }
class Zi extends Fu {
public void method(){
        System.out.println(“重写父类抽象方法”);
}
}
//类的多态使用
Fu fu= new Zi();   //父类 变量名称 = new 子类();
interface Fu {
		     public abstract void method();
}
class Zi implements Fu {
		     public void method(){
              System.out.println(“重写接口抽象方法”);
}
}
//接口的多态使用
Fu fu = new Zi();   //接口 变量名称 = new 接口实现类()

另外,父类被不同子类的同名方法重写,执行的方法看子类重写的步骤,下面是理解方式:

   Person p1 = new xiaoxuesheng();
   Person p2 = new daxuesheng();
   p1.work(); //p1会调用xiaoxuesheng类中重写的work方法,可能是背古诗,看子类重写方法是什么
   p2.work(); //p2会调用daxuesheng类中重写的work方法,可能是敲代码,看子类重写方法是什么

多态框架下的两条规则:

多态的成员变量编译和运行依据父类(new等式的左边)
多态的成员方法编译看左边(编译中父类必须重写方法),运行看右边(运行过程中如果子父类方法同名,运行子类)
class Fu {
	int i = 1;
}
class Zi extends Fu {
	int i = 2;
}
class Demo {
	public static void main(String[] args) 	{
		Fu f = new Zi();
		System.out.println(f.i); //1
		Zi z = new Zi();
		System.out.println(z.i);  //2
	}
}
class Fu {
	int i = 1;
	void func()	{
		System.out.println("Fu");
	}
}
class Zi extends Fu {
	int i = 2;
	void func()	{
		System.out.println("Zi");
	}
}
class Demo {
	public static void main(String[] args) 	{
		Fu f = new Zi();
		f.show();  //Zi
	}
}


instanceof关键字,用于判断对象是否属于某种类型,会基于返回值true or false
使用格式:boolean a = 对象名称 instanceof 数据类型;
profession a = new Doctor();
boolean i = a instanceof Worker; //false
boolean i = a instanceof Doctor; //true 

向下转型

父类类型  变量名 = new 子类类型();
如:Person p = new Doctor();
子类类型 变量名 = (子类类型) 父类类型的变量;
如:Doctor nur = (Doctor) p;  

考虑到静态调用,总体来说:编译都看左边的父类
运行若是静态方法,运行父类中的静态方法(静态方法是类 不是对象,不属于多态范畴)
运行若是非静态方法,运行子类重写方法,
对于成员变量,编译运行全看父类!

猜你喜欢

转载自blog.csdn.net/weixin_40211315/article/details/79577625