多态
-
面向对象三大特性:封装性,继承性,多态性
-
extends继承或者implements实现是多态的前提
-
一个对象拥有多种形态,即对象的多态性
多态的格式
-
类的多态其实就是指父类引用指向子类对象(子类对象被当作父类)
父类名称 对象名 = new 子类名称();
对于接口也可写作:
接口名称 对象名 = new 实现类名称();
package property; public class Item { String name; int price; public void buy(int price){ System.out.println("使用" + price + "钱购买"); } public void method(String name){ System.out.println("父类方法,使用可以有效"); } } //////////////////////////////// package property; public class LifePotion extends Item { @Override public void method(String name) { System.out.println(name + "可以回血"); } public void LiMethod(){ System.out.println("血瓶特有方法"); } } ///////////////////////////////// package property; public class MagicPotion extends Item{ @Override public void method(String name) { super.method(name); } } /////////////////////////////// package property; public class ItemMutil { public static void main(String[] args) { Item xueping = new LifePotion(); Item lanping = new MagicPotion(); xueping.method("血瓶");//调用子类方法 xueping.buy(30);//子类未覆盖重写时调用父类方法 lanping.method("蓝瓶"); } }
多态中成员变量和成员方法
-
通过对象名访问成员变量,等号左边是谁优先用谁,没有则向上找
-
通过成员方法访问成员变量,该方法属于谁优先用谁,没有则向上找
-
成员方法访问规则为,new的是谁优先用谁,没有则向上找
成员变量:编译看左边,运行看左边
成员方法:编译看左边,运行看右边
对象的转型
-
向上转型(多态写法):
父类名称 对象名 = new 子类名称();
-
右侧创建一个子类对象,把它当作父类看待使用
- 向上转型一定是安全的,因为是小范围转向了大范围
-
一旦向上转型为父类,那么无法调用子类特有方法(未覆盖重写父类的方法),因为编译不通过
-
向下转型(还原):
-
子类名称 对象名 = (子类名称)父类对象;
-
将父类对象还原成原本子类对象
-
向下转型必须保证,对象转换为的是原本的子类对象
-
package property;
public class ItemMutil {
public static void main(String[] args) {
Item xueping = new LifePotion();//多态,也是向上转型
Item lanping = new MagicPotion();
//向下转型
LifePotion one = (LifePotion)xueping;
one.LiMethod();//向下转型后可以调用子类方法
//向上转型后向下转型还原对象
//编译不会报错但是运行会报错,java.lang.ClassCastException
//MagicPotion two = (MagicPotion)xueping;
}
}
-
instanceof关键字:
-
对象 instanceof 类名称
-
判断对象能不能当作后面类型的实例,将会得到一个boolean结果
-
package property;
public class ItemMutil {
public static void main(String[] args) {
Item xueping = new LifePotion();//多态,也是向上转型
Item lanping = new MagicPotion();
xueping.method("血瓶");//调用子类方法
xueping.buy(30);//子类未覆盖重写时调用父类方法
lanping.method("蓝瓶");
useItem(xueping);//可以通过instanceof的方法随时向下转型
useItem(lanping);
}
public static void useItem(Item Item){
if(Item instanceof LifePotion){
LifePotion one = (LifePotion)Item;
one.LiMethod();
}
if(Item instanceof MagicPotion){
MagicPotion two = (MagicPotion)Item;
two.MagiMethod();
}
}
}