天天看点

好程序员Java实用教程系列之对象的转型

好程序员Java今日分享实用的Java教程之对象的转型

体现:
  1. 父类的引用可以指向子类的对象
  2. 接口的引用可以指向实现类的对象
转型:
  1. 向上转型
    1. 由子类类型转型为父类类型,或者由实现类类型转型为接口类型
    2. 向上转型一定会成功,是一个隐式转换
    3. 向上转型后的对象,将只能访问父类或者接口中的成员
  2. 向下转型
    1. 由父类类型转型为子类类型,或者由接口类型转型为实现类类型
    2. 向下转型可能会失败,是一个显式转换
    3. 向下转型后的对象,将可以访问子类或者实现类中特有的成员

instanceof关键字

  1. 针对于向下转型的。
    1. 如果向下转型不成功,会怎样?
      1. 会有一个异常 ClassCastException
    2. 如何避免这种情况?
      1. 在向下转型之前,我们先判断一下这个对象是不是要转型的类型
      2. 怎么判断?
        1. 关键字 instanceof
        Animal animal = new Dog();
        if (animal instanceof Dog) {
            // 说明animal的确是一个Dog
        }           
如果一个类中重写了父类的某一个方法。此时:
  1. 如果用这个类的对象来调用这个方法,最终执行的是子类的实现。
  2. 如果用向上转型后的对象来调用这个方法,执行的依然是子类的实现。
    1. 因为向上转型后的对象,归根到底还是子类对象。

抽象类与抽象方法

抽象:abstract

抽象类:

​ 用关键字abstract修饰的类,就是抽象类

抽象方法:

​ 用关键字abstract修饰的方法,就是抽象方法

特点:

  1. 抽象方法使用abstract来修饰,只有声明,没有实现。
    public abstract void bark();           
    1. 抽象方法,只能够写在抽象类中。
  1. 抽象类使用abstract来修饰,抽象类不能实例化对象。
  2. 抽象类中是可以写非静态的成员的,这时候这些非静态成员是可以继承给子类的。
  3. 抽象类中是可以包含构造方法的。
结合抽象类和抽象方法:
  1. 非抽象子类在继承一个抽象父类的同时,要实现父类中所有的抽象方法。

注意事项:

final关键字

  1. 抽象类可以用final来修饰吗?
    1. 不能!因为final表示这个类无法被继承。但是对于抽象类来说,如果无法被继承,则这个抽象类没有任何意义。
  2. 抽象方法可以用final修饰吗?
    1. 不能!因为final修饰的方法无法被重写。但是抽象方法又只能写在抽象类中。如果一个抽象方法用final来修饰了,此时这个方法将无法被非抽象子类重写,那这个子类就会有问题。

抽象类和抽象方法的实用场景:

可以用抽象类和抽象方法来实现一些简单规则的制定。

​ 例如:所有的快递公司都必须要会xxxxx。KFC、麦当劳、

如果仅仅用抽象类和抽象方法来进行规则指定、行为约束:

​ 弊端:因为Java是单继承的语言,如果一个类为了遵循某一种规范,而去继承一个抽象类,此时这个类将无法再继承其他类。

​ 为了解决这样的问题,我么可以使用接口进行行为约束,规范代码。

接口

关键字:interface

语法:

​ 和类是比较像的,但是他不是类

[访问权限修饰符] interface 接口名字 {
    // 接口中的成员
}           
  1. 访问权限修饰符:和类一样,只能有 public 和默认的default权限。
  2. 接口不是类,不能实例化对象。
  3. 接口,暂时和类写成平级的关系。
  4. 接口名字是一个标识符,遵循大驼峰命名法
接口中成员的定义:
  1. 属性:接口中的属性,默认的修饰符是 public static final
  2. 构造方法:接口中不能写构造方法
  3. 方法:
    1. 接口中的方法都是抽象方法
    2. 接口中的方法访问权限修饰符都是public

接口是需要被类来实现的。

实现接口关键字: implements

让类实现接口:

public class Shunfeng extends Company implements Express {

}           
  1. 一个非抽象类在实现接口后,需要实现接口中所有的抽象方法。
    1. 如果同时有父类和接口,那么继承父类在前,实现接口在后
    1. 如果一个类实现的多个接口中有相同的方法,这个方法在实现类中只需要实现一次即可。
  2. public interface GrilFriend extends HouseKeeping, Takecare {
    
    }           

继续阅读