多态

多态的概念

  • 一个对象可以被多个类型引用,因而不同类型的引用变量可以以不同的形式引用对象里的方法

    //example
    //子类Student 父类Person
    //父类有方法talk
    //子类有方法talk(对父类方法talk的重写)和方法laugh
    Student s1=new Student();
    Person s2=new Student();
    Object s3=new Student();
    s1.talk();   //可运行,而且talk经过了Student子类的重写
    s2.talk();   //倘若子类中的talk没有重写,则使用的就是父类方法talk内的方法体内容,若已经被重写,则使用的是子类中被重写的方法体内容
    s2.laugh();  //不可编译,如需编译则需要进行类型的强制转换,即向下转型,见下面内容
  • 对象可以执行哪些方法,与左边的类型有关,和右边的对象关系不大

  • 多态是方法的多态,和属性无关

  • 提一嘴:如果方法是1. static类型 2. final常量 3. private方法,则无法进行重写,也自然不存在多态

类型转换

向上转型

代码例子

class Person{
    public void run(){
        ...
    }
}
class Student extends Person{
    public void teach(){
        ...
    }
}

public class Application{
    public static void main(Strimg[] args){
        Student student = new Student(); //此时子类的引用指向子类的对象(即Student类型)
        Person person=student;  //此时将子类的引用向上转换为父类的引用person,不需要强制转换,即由Student类型
    }
}

向下转型

class Person{
    public void run(){
        ...
    }
}
class Student extends Person{
    public void teach(){
        ...
    }
}

public class Application{
    public static void main(Strimg[] args){
        Person person = new Student(); //此时父类的引用指向子类的对象(即Person类型)
        //如果person想要使用Student类中的方法,就得需要进行向下转型,即强制转为Student类型的引用变量
        (Student)person.teach();   //可以直接转换后使用子类的方法teach
        //或者用"Student std=(Student)person;"语句重新设置一个person引用给std赋值的语句,然后直接用std.teach();进行使用
        
    }
}
  • 注意!父类向子类向下转型可能会丢失一些方法,因此不建议随意的向下转型

instanceof

  • instanceof 实际上是在判断一个变量所指向的实例是否是指定类型,或者这个类型的子类。
  • instanceof 无法让两个同级的类进行比较和转换
  • instanceof 编译通过的条件是:X  instanceof  Y----X和Y有父子关系

多态的用处

  1. 方便方法的调用,减少重复代码,使其变得简洁
抽象

抽象概念

  • abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法,如果修饰类,那么该类就是抽象类。
  • 抽象类中可以没有抽象方法,但是由抽象方法的类一定要声明为抽象类。
  • 抽象类不存在用new关键字来创建对象,它是用于给子类进行继承的。
  • 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
  • 子类继承抽象类,那么必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
  • 抽象类里面可以书写非抽象方法。
  • 抽象方法不需要书写方法体。
接口

普通类,抽象类和接口的区别。

  • 普通类:只有具体的实现
  • 抽象类:具体实现和规范(抽象方法)都有
  • 接口:只有规范(抽象方法),即无法在自己的内部写方法体

接口的概念

  • 接口所定义的是一组规则,可以跟我们生活中的法律一起比较
  • 面向对象的精髓是对对象的抽象,而最能体现这一点的就是接口。

接口的声明

  • 用interface来声明一个接口

  • 用class来声明一个类

多继承

  • 普通类和抽象类都使用extends来进行父子类继承,但是接口和其他类则采用implements来进行继承,继承后可以对接口内的方法进行重写和使用。
//    普通类 extends 抽象类或者普通类 implements 接口
//    这样就可以实现多继承了

接口的一些注意点

  • 接口中的方法是默认以"public abstract "为修饰词的
  • 接口中的一些属性是以常量的形式存在的,而且被分配在静态区中,默认为"public static final"为修饰词的。
  • 接口起到的是约束的作用
  • 接口可以定义一些方法,然后让不同的人对其实现
  • 接口不能被实例化,因为其接口中没有构造方法
  • implements可以实现多个接口
  • 接口中的方法必须在其他类中进行重写