方法重写:
应用场景:在有继承关系的子类中。对父类中的方法进行重写。
目的:当父类中的方法无法满足子类时,子类可以在此基础上进行功能的扩展
定义:子类重写父类中的方法要和父类中方法名、返回值类型、参数列表完全一致。而且访问修饰符的范围不能被缩小。
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("---------兔子吃草---------");
}
}