多态

多态概述:
在这里插入图片描述

  • 代码当中提现多态性,其实就是一句话:父类引用指向子类对象。

多态的格式与使用

  • 代码:

父类名称 对象名 =new 子类名称();

  • 定义父类:

public class Fu{
public void method(){
System.out.println(“父类方法”);
}
public void methodFu(){
System.out.println(“父类特有方法”);
} }

  • 定义子类:

public class Zi extends Fu{
@Override
public void method(){
System.out.println(“子类方法”);
} }

  • 使用多态的写法:
public class Demo01Multi{
public static void main(String[] args){
//使用多态的写法
//左侧父类的引用,指向了右侧子类的对象。
Fu obj=new Zi();

    obj.method();	//子类方法。
    
    obj.methodFu(); //父类特有方法。
} }
  • 或者:

接口名称 对象名 =new 实现类名称();

多态中成员变量的使用特点

  • 访问成员变量的两种方式:

  • 直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。

  • 间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找。

  • 父类:

public class Fu /extends Object/{
int num=10;

public void showNum(){
    System.out.println(num);
} }
  • 子类:

ublic class Zi extends Fu{
int num=20;

int age=16;

@Override
public void showNum(){
System.out.println(num);
} } main:
public class Demo01MultiField{
public static void main(String[] args){
//使用多态的写法,父类引用指向子类对象
Fu obj =new Zi();

//看等号左边是谁,优先用谁,没有则向上找。

System.out.println(obj.num);	//优先用父  10

//错误写法! //        System.out.println(obj.age);
System.out.println("==============");


//看该方法属于谁,优先用谁,没有则向上找
//子类没有覆盖重写,就是父
//子类如果覆盖重写,就是子

//如果子类不覆盖重写(就是上面的子类的showNum()不写)
obj.showNum();	//子类没有覆盖重写,就是父:10

//如果子类覆盖重写(就是上面的子类的加上showNum()方法)
obj.showNum();	//子类覆盖重写,就是子:20

} }

多态中成员方法的使用特点

  • 在多态的代码当中,成员方法的访问规则是:

  • new的是谁,就优先用谁,没有则向上找。

  • 口诀:编译看左边,运行看右边。

  • 对比一下:

  • 成员变量:编译看左边,运行还看左边

  • 成员方法:编译看左边,运行看右边

  • 定义父类:

public class Fu{
public void method(){
System.out.println(“父类方法”);
}
public void methodFu(){
System.out.println(“父类特有方法”);
} }

  • 定义子类:

public class Zi extends Fu{
@Override
public void method(){
System.out.println(“子类方法”);
} }

  • 使用多态的写法:
public class Demo01Multi{
public static void main(String[] args){

//使用多态的写法
//左侧父类的引用,指向了右侧子类的对象。
Fu obj=new Zi();

//父子都有,优先用子类方法
obj.method();	 //子类方法

//子类没有,父类有
obj.methodFu();  //父类特有方法。

    
    //编译看左边,左边是Fu,Fu当中没有methodZi方法,所以编译报错。
    //obj.methodZi(); 错误写法
}

多态的好处:

  • 提高的代码的维护性(继承保证,即可以通过改写父类属性与方法同义改写子类共有属性与方法)
  • 提高了代码的扩展性(由多态保证,即父类为形式参数,接收任意子类对象,在开发的时候用多态,扩展性强)
    在这里插入图片描述

多态中调用子类特有方法:

  1. 父类强转转换为子类,调用特有方法
    详情查看另一个笔记(引用类型转换)
  • 好处:当已经有定义好一个子类时,我们常用强转方法,它有以下优点

  • 父类强转成子类后,可多次调用子类的特有方法,

  • 可灵活调用子类各种特有方法()

  1. 匿名内部类
  • 匿名内部类,对象定义特有方法,并对其调用

Animal a=new Animal(){
public void catchMouse(){
System.out.println(“catchmouse”);
} }; //相当于创建一个子类对象,并让a指向它 a.catmouse(); //此行会报错
父类a不能直接调用子类的特有方法。

  • 解决:不让他指向父类变量,直接调用方法

new Animal(){ public void catchMouse(){
System.out.println(“catch Mouse”); }
}.catchMouse(); //输出catch Mouse

  • 当我们没有定义好一个子类时,且也不想去定义这个子类的时候,只想临时用一下,我们可以采用匿名内部类对象方法,它有以下优劣点:

  • 省去了定义子类的过程

  • 较适合于临时,突发性, 想调用一个特有方法时。

  • 它想多次调用一个特有方法时,没有1方法方便

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值