Java 多态

来源:互联网 发布:佳能ir2535i 网络驱动 编辑:程序博客网 时间:2024/06/03 18:19

类之间的关系2种

  • 1.继承关系 is-a
    • 人类 学生类
    • 车 宝马
  • 2.引用(包含、拥有) has-a
    • 人 胳膊
    • 车 轮子

多态

  • 编译器多态 - 方法重载 方法名称相同方法参数不同。
  • 运行时多态 - 在程序运行时判断到底是那个类.(父类还是子类),进而确定要调用的是父类方法还是子类方法。
  • 所谓多态就是子类对象和父类对象相互转化的关系
  • 1.向上转型 父类 父类对象 = new 子类对象() Animal a1 = new Cat(“小花”);
  • 2.向下转型 子类 子类对象 = (父类)对象; //强转

多态实现的关键

  • 1.要有继承关系
  • 2.要有方法重写
  • 3.父类引用指向子类对象

    • 3.1编写方法时使用父类做形参 public void feed(Animal animal)
    • 3.2将子类对象作为实参传递给改方法

      Animal a1 = new Cat(“小花”);
      student.feed(a1);

    • 3.3运行时根据实参类型动态决定调用那个方法
  • 里氏替换原则:所有出现父类对象的地方都可以用子类替换

多态的好处

把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

匿名类对象

  • xiaoxin.feed(new Cat1(“小白”));//因为该cat1对象只在程序代码中使用1次,以后不会再次引用操作它,所有我们使用匿名对象。就使用一次,使用后立即释放。
  • 过去写
    • Cat1 cat1 = new Cat1(“小白”);
    • xiaoxin.feed(cat1);

抽象类

  • 用abstract关键字修饰的类 叫抽象类。不希望被实例化(new)类,一般可创建为抽象类

抽象方法

  • 使用abstract关键字修饰的方法,只有方法的声明,不包含方法的实现

    public abstract void eat();
  • 含有抽象方法的类一定是抽象类
  • 抽象类是不能实例化的只能被继承。抽象类的子类必须重写父类的抽象方法

    @Overridepublic void eat() {    System.out.println("我是小狮子,我叫"+this.name+"正在吃人");}
  • 若未重写相关抽象方法。则子类也是抽象类
  • 构造函数,static,final,private的方法 不要加abstract关键字。

  • 子类继承父类可以
    public 可以被任意类调用
    protected 只能被子类调用
    默认 只能被同包内的类调用
    private 不能被其他类访问

定义类时 可以使用的修饰符是 public final abstract 或者不写

静态(类)方法和静态成员变量

    static String name;    //仅能调用其他的静态方法,只能访问静态数据,不能引用this,和super    public static void saveMoney()

* 在方法声明中加入关键字static 表示无需创建类对象即可调用的方法:
* 1.类对象根本不存在。例如你要创建类对象
* 2.不需要关联任何类对象时候。例如Math类中的相关算数方法
* 静态成员变量和静态方法都是使用 类名.属性名 类名.方法名 去掉用。
Father.name = “王远航”;
Father.saveMoney();
* 静态的变量本质上变为全局变量,就是声明一个对象不会产生多个静态变量的拷贝,只会分配一块内存空间,共享同一个变量。

A
int age;
public void sayHi();
B extends A
public void sayHi();

super的作用

  • 1.直接饮用 。类似于this。相当于指向当前对象的父类
    • super.age
  • 2.子类成员与父类成员同名
    • super.sayHi();
  • 3.引用构造函数
    • super()

fianl的使用

  • fianl修饰的类 : 不允许被继承 final和abstract冲突不要同时加
  • fianl修饰的方法: 不允许被子类重写 override
  • final修饰的成员变量: 成员变量是常量,只能被赋值一次。赋值后无法改变#