一、抽象类和抽象方法

  1. 区分抽象方法和普通方法
    1)当一个方法被abstract修饰时,该方法成为抽象方法
    2)抽象类所在的类必须定义为抽象类
    3)抽象方法不会有具体的实现,而是在抽象类的子类中通过方法重写进行实现
    4)定义抽象方法语法:
    [访问修饰符]  abstract  <返回类型> <方法名>([参数类表])
    5)区别:
      抽象方法需要用abstract修饰,普通方法不需要;抽象方法没有方法体
  2. 区分普通类和抽象类
    1)当一个类被abstract修饰时被称为抽象类
    2)定义抽象类:abstract  class <类名>{    }
    3)区别:
      抽象类需要用abstract修饰,普通类不需要;
           普通类可以实例化,抽象类不能被实例化(但可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例)
  3. 抽象类结构
    public abstract  class 类名{
        修饰符  abstract  返回值类型 方法名();
        修饰符  返回值类型  方法名(){ 
             方法体
        }
  4. 抽象类和抽象方法的使用:
    抽象方法只能定义在抽象类中,抽象类中可以包含抽象方法和普通方法及普通类包含的一切成员;
    如果子类没有实现父类的所有抽象方法,则子类必须定义为抽象类;
    没有抽象构造方法,也没有抽象静态方法;
    抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用
package com.abstractInterface;
public abstract class Base {//抽象类中可以没有抽象方法,但包含了抽象方法的类就必须被定义为抽象类public abstract void method1();public abstract void method2();public void method3(){}//没有抽象的构造方法//public abstract Base(){}//没有抽象的静态方法//static abstract void method4();public Base(){System.out.println("父类的无参构造方法");}static void method4(){System.out.print("静态方法表示类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。因此,当前类必须为静态方法提供实现");}
}

  

package com.abstractInterface;
//如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类
public abstract class Sub1 extends Base {public void method1() {System.out.println("重写父类的method1");}
}

  

package com.abstractInterface;
//否则就必须实现父类的所有抽象方法
public class Sub2 extends Base {public Sub2(){System.out.println("子类的无参构造方法");}@Overridepublic void method1() {System.out.println("重写父类的抽象方法method1");}@Overridepublic void method2() {System.out.println("重写父类的抽象方法method2");}
}

  

public class Test {public static void main(String[] args) {//抽象类不允许实例化//Base base=new Base();//抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用//抽象类不能被实例化,但可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例Base sub=new Sub2();sub.method1();sub.method4();}
}

  

二、抽象类的优势

  

  如图,设计一个抽象类,它有两个普通方法:飞行(弹射飞)和叫(嗷嗷),还有一个抽象方法攻击。分裂鸟和火箭鸟为这个抽象类的子类。
  分裂鸟和火箭鸟都继承了父类的飞行和叫的方法,并重写了父类的攻击方法(两种鸟的攻击方式不同)。

  总结:抽象类中已经实现的方法可以被其子类使用,使得代码可以被复用;同时提供了抽象方法,保证了子类具有自身的独特性

三、抽象类的局限性

  "愤怒的小鸟"的游戏中,分裂鸟和火箭鸟的叫声都是“嗷嗷”,但是红色鸟和炸弹鸟飞出来后是“渣渣”叫,胖子鸟飞出来后干脆不叫,所以类图做如下修改:

  

  此时,使用抽象类就会出现以下问题:1.叫的方法不在通用;2.子类继承鸟抽象类后,写出来的叫的方法可能会出现代码重复的情况,如红色鸟和炸弹鸟都是“喳喳“叫。

  问题1,可以将叫方法给抽象方法,由其子类去具体实现;但这样会造成代码冗余的问题,如这里的分裂鸟和火箭鸟的叫方法也会一样,也就是问题2会更加突出。

  为解决上述问题,最理想的方法是使用接口。

四、接口

  

  生活中,常见的如USB接口有以下特点:USB接口本身没有实现任何功能;USB接口规定了数据传输的要求;USB接口可以被多种USB设备实现

  1. 接口概念
    java中接口的作用和生活中的接口类似,他提供一种约定,是的实现接口的类早形式上保持一致。
    如果抽象类中所有的方法都是抽象方法,就可以使用java提供的接口来表示,所以,从这个角度来讲,接口是一种特殊的”抽象类“,但两者语法和设计理念都不同
  2. 定义和实现一个简单的接口


    接口是一个不能实例化的类型,需要注意:
    1)接口:接口中不能有构造方法;
                    接口使用interface修饰符,访问修饰符只能是public,且可选;
               接口成员可以是全局变量和公共的抽象方法(默认用 public 修饰);
                    接口中的变量都是静态常量(public static final),并必须指定初始值;
    2)实现接口:实现接口用implements关键字;
                      实现接口的类必须实现接口中定义的所有抽象方法,否则必须定义为抽象类;
                           接口的实现类中允许包含普通方法;
                           实现类可以实现多各接口;

    package com.interfaceDemo;
    /*** USB接口。* @author yu*/
    public interface UsbInterface {/*** USB接口提供服务。*/void service();
    }
    

      

    package com.interfaceDemo;
    /*** U盘。* @author yu*/
    public class UDisk implements UsbInterface {public void service() {System.out.println("连接USB口,开始传输数据。");}
    }
    

      

    package com.interfaceDemo;
    /*** USB风扇。* @author yu*/
    public class UsbFan implements UsbInterface {public void service() {System.out.println("连接USB口,获得电流,风扇开始转动。");}
    }
    

      

    package com.interfaceDemo;
    /*** 测试类。* @param args*/
    public class Test {public static void main(String[] args) {//1、U盘UsbInterface uDisk = new UDisk();uDisk.service();//2、USB风扇UsbInterface usbFan= new UsbFan();usbFan.service();}
    }

  3. 更复杂的接口
    1)接口本身也可以继承接口:
      [修饰符] interface 接口名 extends 父接口1,父接口2,....{
               常量定义;
               方法定义;
           }
    2)一个普通类只能继承一个父类,但能同时实现多个接口,也可以同时继承抽象类和实现接口:
          class 类名 extends 父类名 implements 接口1,接口2,....{
             类的成员;
          }

    package com.interfaceDemo;
    /*** 鸟叫的接口* @author yu*/
    public interface ShoutAbility {/*** USB接口提供服务。*/public void shout();   //鸟叫的抽象方法
    }
    /****************************************/
    package com.interfaceDemo;
    /*** 嗷嗷叫* @author yu*/
    public class AoShout implements ShoutAbility {public void shout() {System.out.println("嗷嗷。。。。。");}
    }
    /******************************************/
    package com.interfaceDemo;
    /*** USB风扇。* @author yu*/
    public class ZhaShout implements ShoutAbility {public void shout() {System.out.println("喳喳。。。。。");}
    }
    /******************************************/
    package com.interfaceDemo;
    /** 无叫声*/
    public class NoShout implements ShoutAbility{public void shout(){//无叫声}
    }
    /******************************************/
    package com.interfaceDemo;
    /** 鸟类*/
    public abstract class Bird {ShoutAbility shoutAbility;   //鸟叫的方式String birdName;  //鸟的名字//构造方法,用来初始化鸟叫的行为//构造方法
    //    public Bird(String birdName){
    //        this.birdName = birdName;
    //    }public Bird(ShoutAbility shoutAbility,String birdName){this.shoutAbility = shoutAbility;this.birdName = birdName;}//叫public void Shout(){shoutAbility.shout();}//飞行public void fly(){System.out.println(this.birdName+"弹射飞!");}//攻击public abstract void attrack();
    }
    /********************************/
    package com.interfaceDemo;
    /** 分裂鸟*/
    public class SplitBird extends Bird{//构造方法public SplitBird(ShoutAbility shoutAbility,String birdName){super(shoutAbility,birdName);}//重写分裂方法public void attrack(){System.out.println("分裂攻击!");}}
    /************************************/
    package com.interfaceDemo;
    /** 火箭鸟*/
    public class RocketBird extends Bird{public RocketBird(ShoutAbility shoutAbility,String birdName){super(shoutAbility,birdName);}public void attrack(){System.out.println("加速冲撞!");}
    }
    /********************************************/
    package com.interfaceDemo;
    /** 红色鸟*/
    public class RedBird extends Bird{//构造方法public RedBird(ShoutAbility shoutAbility,String birdName){super(shoutAbility,birdName);}//重写分裂方法public void attrack(){System.out.println("普通攻击!");}
    }
    /******************************************/
    package com.interfaceDemo;
    /** 炸弹鸟*/
    public class BombBird extends Bird{//构造方法public BombBird(ShoutAbility shoutAbility,String birdName){super(shoutAbility,birdName);}//重写分裂方法public void attrack(){System.out.println("爆炸攻击!");}
    }
    /********************************************/
    package com.interfaceDemo;
    /** 胖子鸟*/
    public class FatBird extends Bird{//构造方法public FatBird(ShoutAbility shoutAbility,String birdNme){super(shoutAbility,birdNme);}//重写分裂方法public void attrack(){System.out.println("扔蛋攻击!");}
    }
    /********************************************/
    package com.interfaceDemo;import java.text.Bidi;/*** 测试类。* @param args*/
    public class Test {public static void main(String[] args) {ShoutAbility shoutAbility = new AoShout();  //嗷嗷叫ShoutAbility shoutAbility1 = new ZhaShout();  //喳喳叫ShoutAbility shoutAbility2 = new NoShout();  //无叫声Bird bird = new SplitBird(shoutAbility,"分裂鸟");bird.fly();bird.Shout();bird.attrack();Bird bird1 = new RocketBird(shoutAbility,"火箭鸟");bird1.fly();bird1.Shout();bird1.attrack();Bird bird2 = new RedBird(shoutAbility1,"红鸟");bird2.fly();bird2.Shout();bird2.attrack();Bird bird3 = new BombBird(shoutAbility1,"爆炸鸟");bird3.fly();bird3.Shout();bird3.attrack();Bird bird4 = new FatBird(shoutAbility2,"胖子鸟");bird4.fly();bird4.Shout();bird4.attrack();}
    }
    

      

  4. 面向对象的设计原则
    1)摘取代码中变化的行为,形成接口
    2)多用组合,少用继承
    3)针对接口编程,不依赖于具体实现:具体代码实现中,体现在方法参数尽量使用接口,方法的返回值尽量使用接口,属性类型尽量使用接口等
    4)针对扩展开放,针对改变关闭:项目中需求发生变化,应添加一个新的接口或类,而不要去修改源码
    总的来说,接口和抽象类是实现堕胎的2种重要方式,是面向对象设计的基础

转载于:https://www.cnblogs.com/yutianbao/p/10562297.html

Java面向对象 第5节 抽象类和接口相关推荐

  1. Java面向对象那些事之抽象类、接口

    目录 前言 一.抽象类 1.抽象类概述 2. 抽象类特点 3.抽象类成员特点 4.抽象类案例 二.接口 1.接口概述 2.接口特点 3.接口成员特点 4.接口案例 5.类和接口的关系 6.抽象类和接口 ...

  2. Java面向对象(3) —— 抽象类、接口、内部类、匿名内部类

    目录 抽象类(abstract) 抽象类的使用方法 抽象类的应用:模板方法模式 接口 接口的概念 接口的特点 接口的使用 接口实现与抽象类继承的区别 接口的多继承 内部类 概念 成员内部类(使用较多) ...

  3. Java编程那些事儿69——抽象类和接口(二)

    Java编程那些事儿69--抽象类和接口(二) 陈跃峰 出自:http://blog.csdn.net/mailbomb 8.9.2 接口 接口(Interface)是一种复合数据类型. 至此,Jav ...

  4. Java编程那些事儿70——抽象类和接口(三)

    Java编程那些事儿70--抽象类和接口(三) 陈跃峰 出自:http://blog.csdn.net/mailbomb 8.9.3 抽象类和接口的比较 抽象类和接口都是进行面向对象设计时专用的设计结 ...

  5. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础 - 进阶继承,抽象类,接口 进阶继承 class Stu {int age = 1; } class Stuo extends Stu {int agee = 2; } class ...

  6. Java编程那些事儿68——抽象类和接口(一)

    Java编程那些事儿68--抽象类和接口(一) 陈跃峰 出自:http://blog.csdn.net/mailbomb 8.9  抽象类和接口 在实际的项目中,整个项目的代码一般可以分为结构代码和逻 ...

  7. Java第五次作业--面向对象高级特性(抽象类和接口)

    一.学习要点 认真看书并查阅相关资料,掌握以下内容: 掌握抽象类的设计 掌握接口的设计 理解简单工厂设计模式 理解抽象类和接口的区别 掌握包装类的应用 掌握对象的比较方法和比较器的使用 学习使用日期操 ...

  8. 菜鸟学习笔记:Java基础篇5(抽象类与接口、回调函数、内部类)

    菜鸟学习笔记:Java面向对象篇下 抽象类 接口 回调函数 内部类 成员内部类 匿名内部类 抽象类 通过前面知识的学习,抽象类这个概念应该不难理解,但比较容易和后面要说的接口混淆,而且在面试中也比较爱 ...

  9. Java OOP 第四章 抽象类和接口

    Java OOP 抽象类和接口 文章目录 Java OOP 抽象类和接口 一.学习目标 二.抽象类 三.抽象类 (abstract) 四.抽象方法 五.抽象类和抽象方法的应用 六.final用法 七. ...

  10. 面向对象编程(十五)——抽象类和接口

    一.抽象(abstract)类 抽象类,说白了就是包含抽象方法的类.那什么是抽象方法?抽象方法是一种特殊的方法:抽象方法只有声明,而没有具体的实现.抽象方法说白了就是只有方法的声明,没有方法体. 抽象 ...

最新文章

  1. 1.8正版生存服务器,我的世界1.8-1.16.5 qqof 生存服务器
  2. 30212Java_数组
  3. 转 Oracle 删除表,oracle 中删除表 drop delete truncate 的区别
  4. 关系数据库规范化理论(关系数据库设计理论)
  5. 深入Redis持久化 1
  6. Linux 命令(31)—— find 命令
  7. 【Hadoop】HDFS数据复制
  8. python教材答案字典与集合_Python——集合与字典练习
  9. 前端获取视频第一帧作为封面
  10. 开源的第二代旅游网站程序_旅游网站模板_旅游网站源码
  11. python教你生成动态二维码
  12. 立体声音频效果插件:TBProAudio ST1 for Mac
  13. GGSN -- 解释
  14. 一项调查:从浅到深的机器学习方法的血压估计使用生物传感器【翻译】
  15. Pytorch系列笔记(六)
  16. == 和 equals 的区别
  17. 【慕课网】Web学习笔记———CSS3 (一)
  18. QQ远程协助不能控制win7系统的解决方法
  19. curl操作Solr5.1.0增删改查
  20. 如何把计算机窗口合成一个窗口,如何让电脑的某个窗口永远在最前端

热门文章

  1. leetcode 9. 回文数(python)
  2. jvm 的内存分配方式
  3. Java中,异常处理try catch的作用域是局部的
  4. oracle主机修改IP后客户端无法连接
  5. linux iptables添加mysql访问
  6. 《Microsoft SQL Server 2008 Analysis Services Step by Step》学习笔记十一:与Cube交互(下)...
  7. 旧文重现,10种职场经典寓言
  8. sqlserver 判断不为空_SQL server 学习
  9. 关于margin的数值是百分比,参照对象
  10. go - 构造复杂json串