Java中的多态、抽象类和接口详解

目录
  • 1.多态
    • 1.1 向上转型
    • 1.2 向下转型
    • 1.3 实现多态的条件
    • 1.4多态的特点与使用
    • 1.5多态的应用
      • 以父类类型作为方法的参数
      • 使用父类型作为方法的返回值
    • 1.6 多态的注意点
  • 2.抽象类
    • 2.1 abstract关键字
    • 2.2 抽象方法和普通方法的区别
    • 2.3 抽象类和普通类的区别
    • 2.4 本质
    • 2.5 抽象类局限
  • 3.接口
    • 3.1 定义接口
    • 3.2 使用接口
    • 3.3 实现多个接口
    • 3.4 jdk8接口新特性

1.多态

一个特定类型的变量,可以引用多个不同类型的对象,并且能自动调用引用对象的方法,也就是根据引用对象的不同,响应不同的操作

方法重写是多态的基础,在继承中,子类拥有和父类相同的方法(方法名称、参数、返回值)称为重写

package com.itlaobing.demo;
public class Pet {
    public void toHospital() {
        System.out.println("宠物看病");
    }
}
class Dog extends Pet{
    public void toHospital() {
        System.out.println("狗狗看病");
    }
}
class Cat extends Pet{
    public void toHospital() {
        System.out.println("猫猫看病");
    }
}
public static void main(String[] args) {
    Dog dog = new Dog() ;
    dog.toHospital();//狗狗看病
    Cat cat = new Cat();
    cat.toHospital(); //猫猫看病
    System.out.println("=================");
    //多态
    Pet pet;
    pet = new Dog();
    pet.toHospital();//狗狗看病
    pet = new Cat();
    pet.toHospital(); //猫猫看病
}

多态中,变量引用的是哪个对象,就执行的是哪个对象中相对应的方法。

多态意味着在一次方法调用中根据包含的对象的实际类型(即实际子类的对象)来决定应该调用哪个子类的方法,而不是由用来存储对象引用变量的类型决定的。当调用一个方法时,为了实现多态操作,这个方法即是在父类中声明过的,也必须是在子类中重写过的方法

1.1 向上转型

由子类类型转换成父类类型,称为向上转型。父类引用指向子类对象

//父类类型 变量 = 子类类型实例;
Pet pet = new Dog();//向上转型

多态就是说一个父类可能有多个子类,每个子类都重写了父类的方法(每个子类都有不同方法实现),当父类调用方法时,父类引用指向的是哪个子类,就执行哪个子类的方法。形成了父类引用调用相同的方法时,有不同的实现。

父类引用只能调用父类中有的方法(子类继承自父类的方法/重写的方法)

父类引用不能调用子类扩展的方法(独有的方法)

1.2 向下转型

有父类类型转换成子类类型,称为向下转型。必须要进行强制类型转换。

注意:首先要判断是否属于要强转的类型(instanceof),如果不属于会报错java.lang.ClassCastException

public static void main(String[] args) {
    // Dog dog = (Dog) new Pet();//向下转型     java.lang.ClassCastException
    // System.out.println(new Pet() instanceof Dog);    // false
    Pet pet = new Dog(); //向上转型
    Dog dog = null;
    if(pet instanceof Dog){
        dog = (Dog) pet; //向下转型
    }
    System.out.println(pet.getClass()); //class com.itlaobing.demo.Dog
    System.out.println(pet instanceof Dog); //true
}

1.3 实现多态的条件

①类之间存在继承关系

②父类引用指向子类对象(向上转型)

③子类要重写父类的方法

1.4多态的特点与使用

特点:①可替换性②可扩充性③接口性④灵活性⑤简化性

使用:①接口②重写③抽象类方法

1.5多态的应用

以父类类型作为方法的参数

父类类型出现的地方,子类都可以出现(使用)

public void toHost(Pet pet) {
    System.out.print("主人带");
    pet.toHospital();
}
public static void main(String[] args) {
    Person person = new Person();
    
    Dog dog = new Dog();
    person.toHost(dog);
    
    Cat cat = new Cat();
    person.toHost(cat);
    
    Pet pet = new Pet();
    person.toHost(pet);
}

使用父类型作为方法的返回值

public Pet getPet(int type) {
    if(1 == type) {
        return new Dog();
    }else if(2 == type) {
        return new Cat();
    }else {
        return new Pet();
    }
}

1.6 多态的注意点

public class Pet {

    public Pet getInstance() {
        System.out.println("pet getInstance()");
        return new Pet();
    }

    public static void staticMethod() {
        System.out.println("Pet  staticMethod()");
    }
​
}
​
class Dog extends Pet{
​
    @Override
    public Dog getInstance() {
        System.out.println("Dog getInstance()");
        return new Dog();
    }

    public static void staticMethod() {
        System.out.println("Dog  staticMethod()");
    }

}
public static void main(String[] args) {
        Pet p = new Dog();
        p.getInstance(); // Dog getInstance()
        p.staticMethod();// Pet  staticMethod()
    }

p.getInstance()调用的是 Dog 类中的方法,因为在 Dog 类中重写了 Pet 中的 getInstance()方法,且调用实例方法看的是哪个对象调用就执行哪个对象中的方法。也就是说 by Class

p.staticMethod()调用的是 Pet 类中的方法,因为 staticMethod()是 static 方法,属于 类。虽然 Dog 类中隐藏了父类的方法,但是调用 static 方法看的是类型,也就是说 by type ,并且这和多态无关。

可以简单的说,调用 static 方法看左边。调用 实例方法 看右边。

2.抽象类

public class Pet {
    public void toHospital() {
        System.out.println("宠物看病");
    }
}
public class Dog extends Pet {
    public void porter() {
        System.out.println("看门狗");
    }
    public void toHospital() {
        System.out.println("狗狗看病");
    }
}
public class Cat extends Pet{
    public void catchMouse() {
        System.out.println("猫捉老鼠");
    }
    public void toHospital() {
        System.out.println("猫猫看病");
    }
}

从上面的代码可以 发现,父类中的的 toHospital()方法并没有实际意义,只是定义了一个规范,但是删除之后,调用会报错。失去了多态的特性。抽象类/抽象方法作用就是定义规范

2.1 abstract关键字

在 java 中,被 abstract 关键字修饰的类叫做抽象类,被 abstract 关键字修饰的方法叫做抽象方法。 抽象方法是没有具体实现(没有方法体)的。 abstract 不能和 final 一起使用。

2.2 抽象方法和普通方法的区别

[修饰符] 返回值类型 方法名([参数列表]){ //普通方法
    //方法体
}
[修饰符] abstract 返回值类型 方法名([参数列表]); //抽象方法

抽象方法没有具体的实现(没有方法体),所以,抽象不能执行。

抽象方法是由继承了抽象类的子类重写后调用子类重写的方法来执行。

区别:

①抽象方法有abstract修饰

②抽象方法没有方法体

③抽象方法无法执行

④抽象方法不能用private修饰,因为被private修饰的成员无法被继承

2.3 抽象类和普通类的区别

[修饰符] abstract class 类名{} //抽象类
[修饰符] class 类名{} //普通类

抽象类中可以有普通方法

如果一个类继承了抽象类,那么这个类必须重写它的抽象方法,或者将类声明为抽象类

抽象类是有构造方法的,但是不能被实例化。因为抽象类中的抽象方法是没有方法体的,导致抽象类不是一个完整的类,因此不允许实例化。

构造方法、类方法( static )不能声明为抽象( abstract )方法

抽象类除了不能被实例化以外,和普通了类没有区别。定义抽象类是为了强迫子类实现抽象方 法,是定义规范的

区别:

①抽象类有abstract修饰

②抽象类中可以有抽象方法,普通类不能有抽象方法,一个类中只要含有抽象方法,这个类就必须是抽象类,但是抽象类不一定含有抽象方法

③抽象类不能被实例化,需要抽象类变量引用其子类的对象

2.4 本质

上层代码定义规范,不用实现。具体业务实现由子类完成,调用者不用关心。

2.5 抽象类局限

子类重写抽象类的抽象方法可能会出现代码重复的情况,不符合代码复用的要求

3.接口

约定好规范,然后按照规范来做。接口就是定义规范。

java 中的接口作用和生活中类似,它提供一种约定,使实现接口的类在形式上保持一致。

抽象类中可以有普通方法而接口中的方法都是抽象的,如果抽象类诶中的方法都是抽象方法,可以使用java提供的接口表示,因此也可以将接口看做是一个特殊的 抽象类 ,但是采用与抽象类完全不同的语法表示,并且两者的设计理念也不同。

接口不能被 实例化,而且没有构造方法。

3.1 定义接口

[修饰符] interface 接口名{
	//接口成员
	[public] [static] [final] 数据类型 成员变量名 = 常量;
	public] [abstract] 返回值类型 方法名称([参数列表]);
}

接口的访问权限是publicpackage-acces,与类的访问权限类似

和抽象类不同,定义接口使用interface关键字

接口中的方法默认是抽象方法,所以可以省略 abstract 修饰符

接口中的方法默认都是 public 的,所以可以省略 public

接口中的变量只能是静态常量( static final ),所以可以省略 static final ,静态常量在定义时就要 赋值,且不可变。

一个接口可以继承其他接口,被继承的接口称为父接口。子接口将继承父接口中声明的常量和抽象方法

3.2 使用接口

使用接口和使用抽象类一样,都是通过子类。子类通过 implements 关键字实现接口,实现接口就必须实现 接口中的抽象方法

public 类名 implements 接口名{
    实现方法
    普通方法
    属性
}

一个类可以实现多个接口,接口之间使用, 隔开

实现接口的类必须实现接口中定义的所有抽象方法,即使不使用也必须实现它,通常用空方法体实现子类不需要的抽象方法,如果抽象方法有返回值,可返回默认值

接口的实现类中,可以有普通方法

实现的方法必须是 public 的,因为重写方法时,权限不能缩小,只能大于等于被继承的方法的访问权限。

接口与接口之间是继承关系,使用 extends 关键字。多个接口使用 , 隔开,但是接口不能继承类

3.3 实现多个接口

java 中继承是单继承,使用 extends 关键字;但是一个类可以实现多个接口,使用 implements ,多个 接口之间用 , 隔开。

一个类可以同时继承和实现接口, extends 要在 implements 之前

3.4 jdk8接口新特性

在 jdk8.0 中 default 关键字可用于在接口中修饰方法(默认方法), default 修饰的方法可以有具体 实现,也只能在接口中出现。 default 修饰的方法可以被重写。如果一个类实现了两个接口,这两个接口又同时都包含了一个同名的default方法,这种情况下编译器会报错。

接口中还可以有 static修饰的方法,称为静态方法(类方法)。类方法可以直接使用接口名.方法名调用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 一起来了解Java的态和抽象类

    目录 多态: 抽象类: 总结 多态: 我们知道Java的三大特性:封装.继承.多态.前两个之前在Java入门(六)已经讲到,现在来讲多态这个特性. 什么是多态? 多态顾名思义即为多种形态的意思 Java中多态的含义: 1.发送消息给某个对象,让这个对象自行决定采用哪种行为响应这个消息 2.子类对象的引用赋值给父类引用变量来实现动态的方法调用 Java中形成多态的前提: 1.继承 2.父类方法的重写 3.向上转型 我对多态的解释: 比如我们,是人,也是学生,也是年轻人,我可以用人的身份去做事情,也

  • Java 深入浅出解析面向对象之抽象类和接口

    目录 抽象类 声明抽象类 声明抽象方法 案例 使用规则 接口 声明接口 案例 接口特性 抽象类和接口的区别 抽象类 java语言,声明类时 abstract class Db{} 说明Db类为抽象类. java语言中,抽象方法是说没有方法的实现(方法体)此方法为抽象方法,只有抽象类和接口中才可以有抽象方法. 声明抽象类 声明抽象类很简单,加个abstract关节字就行. public abstract class AA { } 声明抽象方法 在抽象类中声明一个抽象方法,抽象方法没有方法体,就是说

  • Java 超详细讲解抽象类与接口的使用

    目录 一.抽象类 1.抽象类的语法 2.抽象类的特性 3.抽象类的作用 二.接口 1.接口的概念 2.接口使用 3.接口特性 4.实现多个接口 5.接口间的继承 6.常用的接口 (1)Comparable接口 (2)Cloneable接口 三.Object类 一.抽象类 在Java中,如果一个类被abstract修饰称为抽象类,抽象类中被abstract修饰的方法称为抽象方法,抽象方法不用给出方法体. 1.抽象类的语法 //抽象类:被abstract修饰的类 public abstract cl

  • Java详细讲解不同版本的接口语法和抽象类与接口的区别

    目录 什么是接口? 接口的语法: (JDK7.0) 接口的语法: (JDK8.0) 接口的语法: (JDK9.0)—(私有方法) 接口的分类 常量接口: 空接口: 函数式接口: 什么是接口? 说到接口,USB大家肯定不陌生~接口是一种标准.规范.注意:接口一旦制定好,使用者和实现者都必须遵循的标准. 接口的语法: (JDK7.0) (1) 关键字:interface (2) 语法:  interface 接口名{} (3) 接口编译之后会生成对应的 .class文件 (4) 接口不能创建对象,但

  • 解析JavaSe的抽象类和接口

    目录 1. 抽象类和抽象方法 2. 相关面试题 1.抽象类必须要有抽象方法吗? 2.普通类和抽象类有哪些区别? 3.抽象类能使用 final 修饰吗? 3. 接口 3.1 接口中的常量 3.2 接口中的方法 3.2.1 接口中的普通方法 3.2.2 接口中的静态方法 3.2.3 接口中的默认方法 3.3 接口中的接口和枚举类 3.4 接口和抽象类 总结 1. 抽象类和抽象方法 抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法.抽象方

  • Java中抽象类和接口介绍

    目录 1.抽象类 1.1 什么是抽象类? 1.2 抽象类属于什么类型? 1.3 抽象类怎么定义? 1.4 抽象方法 2.接口 2.1 关于接口 2.2 接口怎么定义? 2.3 接口基础语法 总结 1.抽象类 1.1 什么是抽象类? 1.1.1 对抽象类的理解 1.1.2 关于抽象类 类与类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类: 类本身是不存在的,属于抽象类无法创建对象[无法实例化]: 抽象类是用来被子类继承的: finial关键字和abstract关键字不能同时出现: 抽象

  • Java入门基础之抽象类与接口

    目录 一.抽象类 1.什么是抽象类 2.语法规则 3.抽象类的作用 二.接口 1.什么是接口 2.语法规则 3.实现多个接口 4.接口之间的继承 三.接口的使用实例 1. Comparable 接口 2.Comparator接口 3.Clonable接口 四.总结 一.抽象类 1.什么是抽象类 首先我们来回顾一下上一篇文章提到的一个例子:打印图形 class Shape { public void draw() { // 啥都不用干 } } class Cycle extends Shape {

  • Java抽象类和接口使用梳理

    目录 抽象类 抽象方法 抽象类三大原则 接口 接口使用原则 JDK两大内置接口 java.lang.Comparable 比较接口 java.lang.Cloneable 克隆接口 对象的深浅拷贝 抽象类和接口的区别 抽象类 什么是抽象类呢?在现实生活中,我们说“人类”,我们无法对应到具体某个人,同样的,“动物类”.“图形类”这些无法映射到具体的对象的类就是抽象类. 抽象类是普通类的超集,意思就是普通类有的抽象类也有,只是它比普通类多了一些抽象方法而已.这些抽象方法可以有一个,也可以有多个. 它

  • Java中的抽象类和接口你了解吗

    目录 抽象类 什么是抽象类? 抽象类属于什么类型? 抽象类怎么定义? 抽象类是干什么的? 什么是抽象方法? 非抽象类继承抽象类 抽象类总结 接口 接口的基础语法 接口的实现 接口和多态联合使用 继承和实现同时出现 接口在开发中的作用 类型和类型之间的关系 总结 抽象类 什么是抽象类? 类和类之间有共同特征,将这些共同特征提取出来进一步抽象,就形成了抽象类.由于类是不存在的,所以抽象类无法创建对象. 抽象类属于什么类型? 抽象类也属于引用数据类型. 抽象类怎么定义? [修饰符列表] abstrac

  • Java基础巩固抽象类与接口详解

    目录 1.抽象类 1.1.什么是抽象类 1.2.抽象类的用法 1.3.抽象类特点(限制条件) 2.接口 2.1.什么是接口 2.2.接口的用法 2.3.如何使用接口 2.4.接口的特点(限制条件) 2.5.如何实现多个接口 2.6.接口于接口之间的继承关系 2.7.如何使用接口 抽象类与接口 1.抽象类 1.1.什么是抽象类 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类 1.2.抽象类的用法 一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract

  • Java零基础也看得懂的单例模式与final及抽象类和接口详解

    目录 1.单例模式 1.饿汉式和懒汉式的实现 2.饿汉式 3.懒汉式 4.懒汉式和饿汉式的区别 2.final的使用 1.基本介绍 2.使用场景 3.使用注意事项和细节讨论 3.抽象类 1.基本介绍 2.使用注意事项和细节讨论 4.接口 1.基本介绍 2.注意事项和细节讨论 3.实现接口与继承的区别 4.接口与继承同时出现如何访问属性 5.接口的多态特性 1.单例模式 1.饿汉式和懒汉式的实现 步骤: 将构造器私有化 类的内部创建对象 向外暴露一个静态的公共方法 2.饿汉式 class Scho

  • 基于多态之虚方法、抽象类、接口详解

    虚方法: 1.在父类方法的返回值前加 virtual 关键字,标记为虚方法,表示这个方法可以被子类重写. 2.虚方法必须有方法体,方法体中可以没有任何内容. 3.子类可以根据需求选择性的是否重写虚方法.如果需要重写,在子类方法的返回值前加 override 关键字. 4.子类在重写虚方法时,可以根据需求选择性的是否使用 base 关键字调用父类中的该方法. 虚方法语法格式如下: public class Father { public virtual void Do() { //..... }

  • java中Executor,ExecutorService,ThreadPoolExecutor详解

    java中Executor,ExecutorService,ThreadPoolExecutor详解 1.Excutor 源码非常简单,只有一个execute(Runnable command)回调接口 public interface Executor { /** * Executes the given command at some time in the future. The command * may execute in a new thread, in a pooled thre

  • java 中JDBC连接数据库代码和步骤详解及实例代码

    java 中JDBC连接数据库代码和步骤详解 JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤:  1.加载JDBC驱动程序:  在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String  className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(Class

  • java中注解机制及其原理的详解

    java中注解机制及其原理的详解 什么是注解 注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进行注解.它主要的作用有以下四方面: 生成文档,通过代码里标识的元数据生成javadoc文档. 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证. 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码. 运行时动态处理,运行时通过代码里标识

  • java 中MyBatis注解映射的实例详解

    java  中MyBatis注解映射的实例详解 1.普通映射 @Select("select * from mybatis_Student where id=#{id}") public Student getStudent(int id); @Insert("insert into mybatis_Student (name, age, remark, pic,grade_id,address_id) values (#{name},#{age},#{remark}, #{

  • java 中maven pom.xml文件教程详解

    maven pom.xml文件教程详解,具体内容如下所示: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.x

  • java中ArrayList和LinkedList的区别详解

    ArrayList和LinkedList都实现了List接口,有以下的不同点: 1.ArrayList是基于索引的数据接口,它的底层是数组.它可以以O(1)时间复杂度对元素进行随机访问.与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n). 2.相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者

  • java中Servlet程序下载文件实例详解

    对于一些普通的文件下载,想必大家都会去点击默认的链接进行资料获取.效率慢是一个方面,有时候下载的过程并不顺序.在学习了python中的一些程序后,我们可以选择使用Servlet进行文件的下载.下面我们先就Servlet进行简单的说明,然后带来有关的下载文件代码实例. 1.说明 Servlet是Sun公司开发的用于交互式地浏览和生成数据,生成动态Web的技术.狭义的Servlet是指Java语言实现的一个接口.但一般情况下,我们把实现了Servlet接口的Java程序叫做Servlet 2.使用s

随机推荐