多态
要用到多态,一定是已经有子父类关系或者类实现接口等前提
格式:
父类类型 变量名称 = 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;
考虑到静态调用,总体来说:编译都看左边的父类
运行若是静态方法,运行父类中的静态方法(静态方法是类
不是对象,不属于多态范畴)
运行若是非静态方法,运行子类重写方法,
对于成员变量,编译运行全看父类!