Java多态、抽象类和接口笔记

130 阅读7分钟

java多态、抽象类和接口

多态、接口、抽象类 相信不止我一个人刚刚学完这些不知道要干嘛吧!不会吧,不会真的只有我一个吧QAQ


提示:此文为个人理解,如有不恰当请及时指出!

@TOC


前言

提示:多态,接口,抽象类


提示:此文属于个人理解,如有不恰当之处请指出

一、多态是什么?

先给一串我自己都不想看的定义: 多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才能确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。 用人话来说多态就是一种事物的多种状态。(2333)

多态的分类

在Java中,多态分为静态多态和动态多态。 其中,静态多态就是值方法的重载。 而动态多态就是指动态绑定。(常用)

多态的条件

  1. 继承性 extends
  2. 子类重写父类的方法 @Override
  3. 父类类型接受子类对象

向上、向下转型

1.向上转型:多态本身是子类类型向父类类型向上准换的过程,即父类引用指向一个子类对象: 父类类型 变量名 = new 子类类型 ( ) ; 例如:

Animal a = new Dog1();  //向上转型

2.向下转型:(强转)父类类型向子类类型向下转换的过程,这个过程是强制的。 子类类型 子类类型 变量名 = (子类类型) 父类变量名 ; 例如:

public class Test {
    public static void main(String[] args) {
        Animal a = new Dog1();  //向上转型
        Dog1 d1  = (Dog1) a;    //向下转型
        System.out.print("向下转型使用子类特有的方法:");
        d1.eat();
    }
}
class Animal{}
class Dog1 extends Animal{
    public void eat(){
        System.out.println("修勾要吃骨头");
    }
}

运行结果:向下转型使用子类特有的方法:修勾要吃骨头

3.那么为什么要转型? ①向上转型:权限改变:

public class Test {
    public static void main(String[] args) {
        Animal a = new Dog1();  //向上转型
        a.braethe();
        //a.eat();   //改行报错
    }
}
class Animal{
    public void braethe(){
        System.out.println("呼吸");
    }
}
class Dog1 extends Animal{
    public void breathe(){
        System.out.println("修勾勾也要呼吸");
    }
    public void eat(){
        System.out.println("进食");
    }
}

运行结果:呼吸 为什么子类的eat()方法报错:那是因为一旦向上转型之后,该变量访问的权限变小,只能先看父类中有没有定义过,父类中定义过才能使用,父类中没有定义过,就不能使用。

②向下转型:

public class Test {
    public static void main(String[] args) {
        Animal a = new Dog1();  //向上转型
        Dog1 d1  = (Dog1) a;    //向下转型
        d1.braethe();
        d1.eat();
    }
}
class Animal{
    public void braethe(){
        System.out.println("呼吸");
    }
}
class Dog1 extends Animal{
    public void breathe(){
        System.out.println("修勾勾也要呼吸");
    }
    public void eat(){
        System.out.println("修勾勾进食");
    }
}

运行结果:呼吸 修勾勾进食 向下转型之后,转型后的变量访问权限:就恢复为和子类对象一样的访问权限,也就是可以访问父类的也可以访问本类的。

多态访问属性的特点

属左左:编译看左边,运行看左边

public class Test {
    public static void main(String[] args) {
        Animal a = new Dog1();
        System.out.println(a.name);
    }
}
class Animal{
    //定义一个属性
    String name = "三界之内的生物";
}
class Dog1 extends Animal{
    String name = "哮天犬";
    String skill = "天地无极,万里追踪";
}

输出结果:三界之内的生物

编译的时候看 “=” 左边是动物类,运行的时候也看 “=” 左边,输出结果为:三界之内的生物 ~

多态访问方法的特点

方左右:编译看左边,运行看右边

public class Test {
    public static void main(String[] args) {
        Animal a = new Dog1();
        a.sleep();
    }
}
class Animal{
    //定义一个方法
    public void sleep(){
        System.out.println("再不休息就头秃了");
    }
}
class Dog1 extends Animal{
    public void sleep(){
        System.out.println("不休息确实会头秃");
    }
}

运行结果:不休息确实会头秃 编译的时候看 “=” 左边是动物类,运行的时候看 “=” 右边,输出结果为:不休息确实会头秃 ~

多态访问静态方法的特点

静左左:编译看左边,运行看左边

public class Test {
    public static void main(String[] args) {
        Animal a = new Dog1();
        a.sleep();
    }
}
class Animal{
    //定义一静态个方法
    public static void sleep(){
        System.out.println("再不休息就头秃了");
    }
}
class Dog1 extends Animal{
    public static void sleep(){
        System.out.println("不休息确实会头秃");
    }
}

运行结果:再不休息就头秃了 编译的时候看 “=” 左边是动物类,运行的时候看 “=” 左边,输出结果为:再不休息就头秃了 ~ 说明:静态方法被哪一个类型的引用变量调用,就执行哪一个类的实现内容。

多态的好处

将来定义某个方法的参数时,可以将该参数类型定义为父类的类型,定义之后,可以传递任何子类的对象,传递的是哪一个子类,执行的内容会执行该子类的实现方式。

二、接口是什么?

interface:接口就是专门来定义抽象方法的一个特殊类型

接口特点

  1. 接口中只能定义抽象方法。
  2. 类和接口之间的关系,实现而非继承,keyword:implements(实现之后接口中的抽象方法也能被该类继承)
  3. 接口不能被实例化,不能创建对象好可怜。

接口中的成员特点

  1. 接口中只有常量,没有变量,为什么呢?在接口中定义的变量会默认被static和final修饰。
  2. 接口中只能定义抽象方法,而且关键字abstract可以被省略。
  3. 接口中可以定义静态方法。
  4. 接口中不需要定义构造方法。

类与类、类与接口、接口与接口的关系

  1. 类与类 :(继承关系)extends 可以单继承、可以多层继承、不可以多继承。
  2. 类与接口 (实现关系)implements 可以单实现、可以实现多个、不可以多层实现
  3. 接口与接口 (继承关系)extends 可以单继承、可以多继承、可以多层继承

三、抽象类是什么?

抽象方法

概述:只有方法的声明,没有方法的实现。 特点: 1. 抽象方法不需要定义实现的内容; 2. 抽象方法一般使用关键字abstract来修饰。

抽象类

1、顾名思义,就是使用abstract来修饰的类型。

2、抽象类和抽象方法的关系:

  1. 抽象方法需要在查询类中定义
  2. 抽象类中不一定要定义抽象方法
  3. 抽象类中也可以定义非抽象方法

3、抽象类不能被实例化,不能创建对象。

4、抽象类和普通类之间可以是继承关系:(但是) ①如果子类继承抽象父类之后,重写了父类中所有的抽象方法,那么该子类可以正常创建,对象是一个普通类型; ②如果子类继承抽象父类之后,没有选择重写完父类中的所有抽象方法,那么该子类只能定义为一个抽象类,不能继续创建对象。

抽象类成员特点

  1. 抽象类中成员可以正常给该类型定义属性,以便于子类继承。
  2. 抽象类中可以定义抽象方法,也可以定义非抽象方法。
  3. 抽象类中一样可以定义静态方法,也可以被子类继承。
  4. 抽象类虽然不能创建对象,但是也需要定义构造方法,因为在初始化子类对象数据之前,需要先初始化父类中的数据,那么就需要使用父类中的构造方法。