方法重写、向上转型、向下转型

本文详细介绍了Java中方法重写和多态性的概念及其应用场景。方法重写用于子类对父类方法的扩展,而多态性体现在编译时的静态多态(方法重载)和运行时的动态多态(方法重写)。文章通过实例展示了向上转型、动态绑定机制以及向下转型的过程,并强调了向下转型时使用instanceof关键字的重要性。
摘要由CSDN通过智能技术生成

方法重写:

应用场景:在有继承关系的子类中。对父类中的方法进行重写。

目的:当父类中的方法无法满足子类时,子类可以在此基础上进行功能的扩展

定义:子类重写父类中的方法要和父类中方法名、返回值类型、参数列表完全一致。而且访问修饰符的范围不能被缩小。

public class Demo6{ 
public static void main(String[]args){
 Tiger tiger=new Tiger(); 
tiger.eat(); tiger.sleep();
 Animal animal=new Animal(); 
animal.eat(); animal.sleep();
     } 
 }
//父类 class Animal{ 
public void eat(){ 
System.out.println("-动物吃饭-");
     }
public void sleep(){
 System.out.println("-动物睡觉-"); 
    } 
}
//子类
 class Tiger extends Animal{ 
//对父类中eat方法进行重写 
public void eat(){
 System.out.println("-老虎吃肉-");
 }
public void sleep(){
 System.out.println("-老虎趴着睡觉-"); 
    } 
}

多态

多态有两种表现形式:

方法重载:(也被称为 编译时多态,也就是说编译期间已经明确了,要调用哪个方法)

方法重写(也被称为 运行时多态,因为动态绑定机制的原因,只有运行时才能知道这个对象
是谁)

向上转型

向上转型,就是把一个子类对象赋值给父类,类似于基本数据中的自动类型转换。因为父类本身就包含了这种子类对象。
语法:父类 对象名=new 子类 (参数列表);
向上转型的对象属于父类对象还是子类对象?
向上转型的对象一定要当做父类对象来用,它可以调用父类中所有属性和方法;但是如果调用的方法是被子类重写的,那么此时执行的是子类重写的方法。 因为向上转型的对象调用被子类重写的方法时会发生动态绑定机制。
动态绑定机制: 在程序运行时,会判断当前对象的真正创建者(通过构造方法来决定的),谁真正创建的这个对象,就调用谁里面的方法。
public class Demo6{
 public static void main(String[]args){ 
//向上转型
 Animal animal=new Tiger();
 System.out.println(animal.name);
 animal.t1();
 //调用方法是被子类重写的 
animal.eat(); 
animal.sleep(); 
} 
}
//父类 
class Animal{
 String name="动物";
 public void eat(){ 
System.out.println("------动物吃饭------");
 }
public void sleep(){
 System.out.println("------动物睡觉------");
 }
public void t1(){ 
System.out.println("-----父类中的t1方法------");
 }
 }
//子类 
class Tiger extends Animal{
 int age=22;
 //对父类中eat方法进行重写
 public void eat(){ 
System.out.println("-------老虎吃肉--------");
 }

public void sleep(){ System.out.println("--------老虎趴着睡觉----------");
 } 
}

向下转型

向下转型,类似于基本数据类型中的强制类型转换;把一个父类对象,强制转换成子类对象,需要加上强制类型转换符。

语法:子类 对象名=(子类) 对象;

向下转型,一定是建立在向上转型的基础上,做类型的还原。不能直接把一个父类对象,强制转换成子类。

因为,向下转型容易发生ClassCastException类型转换异常,所以,在进行向下转型的时候,建议 通过 instanceof关键字,来判断当前对象是否属于某个类,如果返回的结果是true,则表明可以进 行向下转型;否则,就转不了。

instanceof关键字用法:对象名 instanceof 类或接口名

public class Demo7{
 public static void main(String[]args){
 //向上转型
 Animal animal=new Tiger();
 System.out.println(animal.name);
 animal.t1();
 //调用方法是被子类重写的
 animal.eat();
 animal.sleep();
 //向下转型,类型还原
 if(tiger instanceof Tiger){
 Tiger tiger=(Tiger)animal;
 System.out.println(tiger.age);
 }
System.out.println(animal instanceof Animal);
 System.out.println(animal instanceof Tiger); 
System.out.println(animal instanceof Rabbit); 
}
 }
//父类
 class Animal{
 String name="动物";

public void eat(){
 System.out.println("------动物吃饭------");
 }
public void sleep(){
 System.out.println("------动物睡觉------");
 }
public void t1(){
 System.out.println("-----父类中的t1方法------");
 } 
}
//子类
 class Tiger extends Animal{
 int age=22;
 //对父类中eat方法进行重写
 public void eat(){
 System.out.println("-------老虎吃肉--------");
 }
public void sleep(){
 System.out.println("--------老虎趴着睡觉----------");
 } 
}
class Rabbit extends Animal{
 public void eat(){ 
System.out.println("---------兔子吃草---------");
 } 
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值