多态

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

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

多态的格式与使用

  • 代码:

父类名称 对象名 =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);
} }
  • 子类:

p

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方法方便

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读