Day11Super和多态

本文详细介绍了Java中的方法重写与多态概念,包括方法重写的规则、super关键字的使用、向上转型与向下转型的过程,以及多态在方法参数和返回值中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Super和多态

第一节:方法的重写:

产生继承关系后,父类的方法无法满足子类需求时,子类可以定义和父类完全相同的方法,来满足自己的功能

称之为方法的覆盖(override)

方法覆盖的语法:

class Student{
	String name;
	String sex;
	public void study(){
		
	}
}
//产生继承关系后,xxx类继承过来一个方法study
class xxx extends Student{
	//父类的study方法无法满足需求,子类要进行重写
	public void study(){
		//逻辑代码
	}
}

方法重写的要求:
1.返回值类型、方法名称、参数列表要与父类完全相同
2.方法访问权限修饰符要么和父类相同,要么比父类更宽泛(private --> default -->protected --> public

方法覆盖的执行流程:

当子类覆盖父类方法后,调用时优先执行子类覆盖后的方法

注意事项:

当子类继承父类的方法后,在子类当中隐式存在,当要进行编写相同方法的时候,一定要注意:如果参数列表不同,则实现的方法的重载。如果完全相同,则实现的是方法的重写。

面试题:

1.方法的重载和重写的区别

1.1.语法不同

1.2.场景不同

第二节:super关键字

场景:当子类和父类拥有重名的属性或方法时,子类想父类的属性或方法,加super.进行区分。

super里面存放的是父类引用的地址

class Student{
	String name = "学生";
	int age;
	public void study(){
		System.out.println("在自习室里学习");
	}
}
class xxx{
    String name = "谭某某";
    public void study(){
        super.study();//调用的是父类的study方法
        System.out.println(super.name+name);
    }					 //调用的是父类的name属性
}

super可以访问:

父类中的属性

父类中的方法

在使用super关键字的时候,一定要对其加 以区分:

1、this所代表的是当前对象。 当前对象的地址。

2、super代表的是父类对象 父类的地址。

super.可以在子类的方法中访问父类的属性和方法。
格式:  super.name;  super.age = 19;

super访问父类构造方法:

super访问父类的无参构造方法:

super();//调用父类的无参构造方法。必须放在构造方法的首行,如若不书写,则默认隐式存在首行。

super(实参);//调用父类的有参构造方法。必须在构造方法的首行,如若不书写,则默认隐式提供一个super();无参的

注意:

在同一个构造方法中,this()和super()不能同时存在。

继承后的对象创建过程:

在这里插入图片描述

第三节 多态

父类引用指向子类对象,从而产生多种形态:

父类引用     指向   子类对象
Animal animal = new Dog();

当父类引用指向子类对象后,仅可调用父类自身的属性和方法,不可调用子类独有的属性和方法。

当父类方法被子类方法覆盖后,父类引用调用的是子类覆盖后的方法。

3.1多态应用场景一:

把父类作为方法的形参,根据实际传入的实参,来决定实际子类对象。

 //1.多态的体现:  父类作为方法的形参,调用该方法时,参数可以传子类。从而实现多种形态。
    public void goHome(Vehicle vehicle){//方法的参数是交通工具父类,可以根据传入的工具,调用不同的行驶
        System.out.println("我要回家了!");
        vehicle.run();//乘坐交通工具回家~具体是什么交通工具,则看方法的形参实际类型是什么
    }
以上的代码根据调用时传入的子类实际对象,来决定调用的是哪个子类的覆盖后的eat方法

3.2 多态应用场景二:

把父类作为方法的返回值类型,使方法可以返回不同的子类对象

 //2.多态的体现:  父类作为方法的返回值类型,调用完该方法后,返回的是子类,不关心具体类型,统一父类类型。从而实现多态
    public Vehicle ByVehicle(int money){ // 2块骑自行车  5块 做公交   100  打小汽车
        Vehicle vehicle = null;
        if(money >=100){
           vehicle = new Car();//装箱。 子类到父类!  向上转型!
            vehicle.type="宝马";
            vehicle.price = 1300000;
            vehicle.speed = 100;
        }else if(money >=5){
            vehicle =  new Bus();//装箱。 子类到父类!
            vehicle.type="金龙";
            vehicle.price = 2300000;
            vehicle.speed = 80;
        }else if(money >=2){
            vehicle =  new Bicycle();//装箱。 子类到父类!
            vehicle.type="捷安特";
            vehicle.price = 1500;
            vehicle.speed = 600;
        }
        //80个选择
        return vehicle;//如果一个交通工具都无法满足,那只能不乘坐交通工具!
    }

第四节:向上转型 & 向下转型

向上转型:

父类引用保存子类对象,称为向上转型(多态的核心概念)

注意:当父类引用当中保存的是子类的对象,父类就仅可调用自身得方法以及子类重写后的。

父类 引用名 = new 子类();

向下转型

将父类引用中的实际对象,强制转换为实际对象的类型,使用子类独有属性和方法。
子类类型 引用名 = (子类类型)父类引用名;

instanceof

		//父类引用里  是不是   子类真实类型
        if(v instanceof Car){
            Car car = (Car) v;//前后类型如果不匹配,则会报ClassCastException 类型转换异常
            car.name = "740i";
        }else if(v instanceof  Bus){
            Bus bus = (Bus)v;
            bus.sitNums = 300;
        }else if(v instanceof  Bicycle){
            Bicycle bicycle = (Bicycle)v;
            bicycle.color = "骚红";
        }
使用instanceof 可以在向下转型时。由于前后类型不匹配无法转换报错,避免ClassCastException异常。

00;
}else if(v instanceof Bicycle){
Bicycle bicycle = (Bicycle)v;
bicycle.color = “骚红”;
}
使用instanceof 可以在向下转型时。由于前后类型不匹配无法转换报错,避免ClassCastException异常。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值