1、要有继承的关系
2、子类要重写父类中的方法
3、要有父类的引用指向子类对象
多态无法使用子类特有的方法
class Father1{ public void fun(){ System.out.println("这是父类中的fun方法"); } } class Son1 extends Father1{ public void fun(){ System.out.println("这是子类中的fun方法"); } public void show(){ System.out.println("这是子类中特有的show方法"); } } public class PolymorphicDemo1 { public static void main(String[] args) { //多态创建子类对象 Father1 f = new Son1(); f.fun();//这是子类中的fun方法(多态与成员方法的关系:编译看左,运行看右) //需求:现在我想调用子类中特有的方法,咋办 //f.show(); } }
需求:现在我想调用子类中特有的方法,咋办
f.show();
多态的弊端:
多态无法使用子类特有的方法
我就想使用子类特有的功能,能否使用? 能
可以,但是不推荐,很多时候会占用堆内存空间
class Father2 { public void fun() { System.out.println("这是父类的fun方法"); } } class Son2 extends Father2 { public void fun() { System.out.println("这是子类的fun方法"); } public void show() { System.out.println("这是子类的show方法"); } } public class PolymorphicDemo2 { public static void main(String[] args) { Son2 son2 = new Son2(); son2.show();
把父类的引用强制转换成子类的引用
子类类名 变量名 = (子类类名)父类的引用
class Father2 { public void fun() { System.out.println("这是父类的fun方法"); } } class Son2 extends Father2 { public void fun() { System.out.println("这是子类的fun方法"); } public void show() { System.out.println("这是子类的show方法"); } } public class PolymorphicDemo2 { public static void main(String[] args) { //多态创建子类对象(向上转型) Father2 f = new Son2(); f.fun(); //多态中的向下转型 Son2 s = (Son2) f; s.show(); } }
1、向上转型
其实就是多态创建对象的写法
Fu f = new Son();
2、向下转型
Son s = (Son)f;
int a = 10;
byte b = (byte)a;
要求必须是存在继承关系的
class Father2 { public void fun() { System.out.println("这是父类的fun方法"); } } class Son2 extends Father2 { public void fun() { System.out.println("这是子类的fun方法"); } public void show() { System.out.println("这是子类的show方法"); } } class Demo{ } public class PolymorphicDemo2 { public static void main(String[] args) { Father2 f = new Son2(); Demo d = (Demo) f;//报错。Demo类与Father2类不存在继承的关系 } }