多态是一个事物不同的表现形式,比如人这个事物,可以是学生,可以是老师。学生,老师都属于人。
在java中表现为,父类的变量可以引用父类的实例,也可以引用子类的实例。
public class Poly {
public static void main(String[] args) {
Father fa = new Father();
fa.say();//父类的方法。1
fa = new Dom();
fa.say(); //Child子类的方法。2
Systen.out.println(fa.num);// 1 成员变量取到的是父类中的。
}
}
class Father{
public int num = 1;
public void say(){
System.out.println("父类的方法。" + this.num);
}
}
class Child extends Father{
public int num = 2;
public void say(){
System.out.println("Child子类的方法。" + this.num);
}
}
多态存在的三个必要条件:要有继承、要有重写、父类变量引用子类对象。
instanceof
instanceof 判断一个变量实际引用的对象的类型。
public class Poly {
public static void main(String[] args) {
People po = new People();
if(po instanceof Student){
System.out.println("我是一个学生");
}
if(po instanceof People){
System.out.println("我是一个人类");
}
if(po instanceof Teacher){
System.out.println("我是一个教师");
}
if(po instanceof Scum){
System.out.println("我是一个人渣");
}
System.out.println(" ———————————————————————————— ");
po = new Student();
if(po instanceof Student){
System.out.println("我是一个学生");
}
if(po instanceof People){
System.out.println("我是一个人类");
}
if(po instanceof Teacher){
System.out.println("我是一个教师");
}
if(po instanceof Scum){
System.out.println("我是一个人渣");
}
System.out.println(" ———————————————————————————— ");
po = new Scum();
if(po instanceof Student){
System.out.println("我是一个学生");
}
if(po instanceof People){
System.out.println("我是一个人类");
}
if(po instanceof Teacher){
System.out.println("我是一个教师");
}
if(po instanceof Scum){
System.out.println("我是一个人渣");
}
//最后输出
我是一个人类
————————————————————————————
我是一个学生
我是一个人类
————————————————————————————
我是一个人类
我是一个人渣
}
}
class People{}
class Student extends People{}
class Teacher extends People{}
class Scum extends People{}
如果变量引用的是当前类或它的子类的实例,instanceof 返回 true,否则返回 false。
多态的类型转换
多态的转型分为向上转型和向下转型两种。
子类向父类转换称为“向上转型”,将父类向子类转换称为“向下转型”。
向上转型:多态本身就是向上转型过的过程
父类类型 变量名=new 子类类型();
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
子类类型 变量名=(子类类型) 父类类型的变量
public class Poly {
public static void main(String[] args) {
People po = new People();
Student su = new Student();
//运行时会抛出异常 java.lang.ClassCastException ,但是编译可以通过。
//Student su1 = (Student)po;
// 先向上转型,再向下转型
po = su;
Student su1 = (Student)po;
po.show();
su1.work();
su1.show();
//运行输出
子类的show2方法
子类自己的方法
子类的show2方法
}
}
class People{
public void show(){
this.show2();
}
public void show2(){
System.out.println("父类的show2方法");
}
}
class Student extends People{
@Override
public void show2(){
System.out.println("子类的show2方法");
}
public void work(){
System.out.println("子类自己的方法");
}
}
class Teacher extends People{}
class Scum extends People{}
@Override
可以理接为一行注释,表示方法是对父类方法的重写,提高代码可读性。
编译器可以给你验证@Override下面的方法名称是否是你父类中所有的,如果没有就会报错。