Java基础之抽象类和接口

举报
zhulin1028 发表于 2021/11/05 00:00:57 2021/11/05
【摘要】 目录 一、抽象类 二、 接口 (模板方法模式) 三、我们来看看虚拟机规范是怎么说的 一、抽象类 1、Abstract(抽象)可以修饰类、方法  如果将一个类声明为abstract,此类不能生成对象,只能被继承使用。 Abstract类的设计是将子类的共性最大限度的抽取出来,以提高程序的统一性。 2、一个类...

目录

一、抽象类

二、 接口 (模板方法模式)

三、我们来看看虚拟机规范是怎么说的


一、抽象类

1、Abstract(抽象)可以修饰类、方法 

如果将一个类声明为abstract,此类不能生成对象,只能被继承使用。

Abstract类的设计是将子类的共性最大限度的抽取出来,以提高程序的统一性。

2、一个类中包含有抽象方法必须声明为抽象类;

如果一个类中有一个抽象方法,那么这个类一定为一个抽象类。

反之,如果一个类为抽象类,那么其中可能有非抽象的方法。

3、抽象类不能实例化,但仍可以声明;

Abstract类可以作为编译时类型,但不能作为运行时类型。

4、子类继承抽象类必须实现其中抽象方法

当abstract用于修饰方法时,此时该方法为抽象方法,此时方法不需要实现,实现留给子类覆盖,子类覆盖该方法之后方法才能够生效。

注意比较:

private void print(){};此语句表示方法的空实现。

Abstract void print(); 此语句表示方法的抽象,无实现

二、 接口 (模板方法模式)

1) 接口是抽象类的另外一种形式(没有实例变量的抽象类);

2) 在一个接口中所有方法都是抽象方法;

3) 接口中所有变量都必须被定义为final static; 

4) 接口可以继承多个接口。

5) 可插入性的保障――工程模式

6) 是规范的制订者和规范的实现者分开。――JDBC

注:1) 接口中的方法自动被置为public, 因经,在接口中声明方法并不需要提供public关键字。但在实现接口时,必须把方法声明为public。

接口与抽象类的区别:

接口                                                        抽象类

无实现方法                                          可以有非抽象方法――实现代码

可以把子类的共有代码

提取出来放在抽象类中

在JAVA中的接口分类:

         普通         -----有方法和属性

         常量         -----存常量

         标记   -----没有方法,属性,只为了做编译类型的标记

实例:

简单工厂模式(接口和多态的实际使用)


  
  1. public interface Car {
  2.          public void brake();
  3.          public void grade();
  4.          public void engineer();
  5.         
  6. }
  7. public class BMW implements Car{
  8.          private String name;
  9.         
  10.          public String getName() {
  11.                    return name;
  12.          }
  13.          public void setName(String name) {
  14.                    this.name = name;
  15.          }
  16.          public void brake() {
  17.                    // TODO Auto-generated method stub
  18.                    System.out.println("BMWcar's brake()");
  19.          }
  20.          public void engineer() {
  21.                    // TODO Auto-generated method stub
  22.                    System.out.println("BMWcar's engieer()");
  23.          }
  24.          public void grade() {
  25.                    // TODO Auto-generated method stub
  26.                    System.out.println("BMWcar's greade()");
  27.          }
  28.          /**
  29.           * @param args
  30.           */
  31. }
  32. Public class Banz implements Car{
  33.          ……
  34. }
  35. Public class Factory{
  36.          Public static Car factory(String name){
  37.                    If(name.equals(“BMW”){
  38.                             Return new BMWCar(); //返回一个引用
  39.                    }
  40.                    If(name.equals(“Banz”){
  41.                             Return new BanzCar();
  42.                    }
  43.          }
  44. }

注意:

1 这个问题不是对象有没有toString方法的问题,而是用接口作为编译时类型能否调用的问题.

2 接口就是接口,尽管本质上是抽象类,但是总归不是类,接口没有父类,Object类绝不是接口的父类,这种理解大错而特错!!!

三、我们来看看虚拟机规范是怎么说的

 JVM会解析类型为CONSTANT_InterfaceMethodref_info的常量池的入口,会按照如下步骤执行接口方法解析:

 1) 检查接口是否具有用户调用的方法

 2) 检查接口的父接口是否具有用户调用的方法

 3) 检查java.lang.Object是否具有用户调用的方法

 4) 抛出NoSuchMethodException

因此,不是接口类型有toString方法,用反射是看不到这个方法的,而是虚拟机在作方法调用连接时,会自动去找Object类中的方法.虚拟机就是这么工作的所以,对以接口作为编译时类型的方法调用,根据以上说的第三点,Object类中的方法都可以得到调用

文章来源: zhulin1028.blog.csdn.net,作者:zhulin1028,版权归原作者所有,如需转载,请联系作者。

原文链接:zhulin1028.blog.csdn.net/article/details/121086938

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。