一、多态
1.概念:
一个对象有多种形态,必须是在接口或者继承中实现
语法:父类类名 对象名=new 子类类名()
2.多态访问成员变量特点
编译看左边,运行看左边
3.多态访问成员方法的特点
编译看左边,运行看右边
以以下代码为例,可以看出编译时无法编译xiaoming.numZi和xiaoming.showZi(),子类独有的资源,在运行后打印出来的num=100,show()方法打印出来的是子类中的show()中的语句
代码-父类
package stu.qf.Demo1;
public class Fu {
int num=100;
int numFu=200;
public void showFu(){
System.out.println("父类独有方法");
}
public void show(){
System.out.println("这是一个方法");
}
}
代码-子类
package stu.qf.Demo1;
public class Zi extends Fu {
int num=400;
int numZi=300;
public void showZi(){
System.out.println("这是子类独有的方法");
}
public void show(){
System.out.println("这是show方法重写之后");
}
}
代码-测试类
package stu.qf.Demo1;
public class Test {
public static void main(String[] args) {
Fu xiaoming=new Zi();
//访问成员变量:编译看左边,运行看左边
System.out.println(xiaoming.num);
System.out.println(xiaoming.numFu);
//访问方法:编译看左边,运行看右边
xiaoming.showFu();
xiaoming.show();
}
}
4.多态向上转型
语法:父亲的类名 对象名=new 子类的类名()
问题:多态向上转型不能访问到子类的独有资源
5.多态向下转型
语法:子类的类名 对象名=(子类的类名)父类对象的引用
问题:会发生类型转换异常 java.lang.ClassCastException
解决:在转换前判断是可以还原成功
语法:父类对象名 instanceof 子类类名
代码-父类
package stu.qf.demo3;
public class Pet {
public void show(){
System.out.println("这是一个父类方法");
}
}
代码-子类1
package stu.qf.demo3;
public class Dog extends Pet{
public void show(){
System.out.println("这是一个狗类方法");
}
public void showInfo(){
System.out.println("这是一个狗类独有的方法");
}
}
代码-子类2
package stu.qf.demo3;
public class Cat extends Pet{
public void show(){
System.out.println("这是一个cat类对象");
}
public void showInfo(){
System.out.println("这是cat类独有的方法");
}
}
测试类
package stu.qf.demo3;
public class Test1 {
public static void main(String[] args) {
Pet p=new Dog();
if (p instanceof Dog){
Dog d=(Dog)p;
d.showInfo();
d.show();
}else if (p instanceof Cat){
Cat c=(Cat) p;
c.showInfo();
c.show();
}
}
}