java - 多态

本文介绍了Java中的多态性概念,包括其三个必要条件:继承、重写和父类引用子类对象。通过实例展示了`instanceof`关键字用于判断对象的实际类型,并讨论了多态的向上转型和向下转型。同时,`@Override`注解在代码可读性和编译错误检查中的作用也被提及。
摘要由CSDN通过智能技术生成

多态是一个事物不同的表现形式,比如人这个事物,可以是学生,可以是老师。学生,老师都属于人。
在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下面的方法名称是否是你父类中所有的,如果没有就会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值