2017.9.18学习小结 - 抽象类与接口2

回顾

一、抽象类
1.抽象类的基本概念
抽象类定义规则

学习小结

抽象类的特征:

①抽象类中可以有构造方法

抽象类的构造方法必须在子类中被调用,并且先默认调用父类构造方法,再调用子类的构造方法,这个抽象方法无法直接被外部实例化对象直接调用。

package com.Javastudy2;

/**
 * @author Y.W.
 * @date 2017年9月18日 下午9:45:45
 * @Description TODO 抽象类中构造方法的定义使用
 */
public class P325_13_2 {
    public static void main(String[] args) {
        Student12 s = new Student12("张三", 20, "学生"); // 创建Student类对象s
        System.out.println(s.talk()); // 调用被覆写的方法
    }
}

abstract class Person23 { // 定义一个抽象类Person
    String name;
    int age;
    String occupation;

    public Person23(String name, int age, String occupation) { // 定义构造函数
        this.name = name;
        this.age = age;
        this.occupation = occupation;
    }

    public abstract String talk(); // 声明一个抽象方法talk()
}

class Student12 extends Person23 { // 声明抽象类的子类

    public Student12(String name, int age, String occupation) {
        // 在这里必须强调用抽象类中的构造方法
        super(name, age, occupation);
    }

    public String talk() { // 覆写talk()方法
        return "学生--》姓名:" + this.name + ",年龄:" + this.age + ",职业:" + this.occupation + "!";
    }

}

运行结果:

运行结果1

②抽象类不能使用final定义

③在外部抽象类上无法使用static声明,但是内部抽象类却可以使用static定义,使用static定义的内部抽象类就是一个外部类。

package com.Javastudy2;

/**
 * @author Y.W.
 * @date 2017年9月18日 下午10:04:22
 * @Description TODO 验证static定义的内部抽象类
 */
public class P326_13_3 {
    public static void main(String[] args) {
        Book3.CD cd = new JavaCD(); // 实例化对象
        cd.get();
    }
}

abstract class Book3 {
    public abstract void print(); // 抽象方法

    static abstract class CD { // 静态内部抽象类
        public abstract void get(); // 抽象方法
    }
}

class JavaCD extends Book3.CD {
    public void get() {
        System.out.println("java 学习");
    }
}

运行结果:

运行结果2

④抽象类之中可以没有抽象方法,但即便没有抽象方法的抽象类也不能够直接在外部通过关键字new实例化。

2、抽象类应用——模板设计模式

不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式。

三类事物实现如下功能:
机器人:吃饭、工作;
美女:吃饭、跑步、睡觉;
帅哥:吃饭、工作、跑步、睡觉。

package com.Javastudy2;

/**
 * @author Y.W.
 * @date 2017年9月18日 下午10:17:52
 * @Description TODO 模板设计模式
 */
public class P327_13_4 {
    public static void main(String[] args) {
        Action actA = new Robot(); // 机器人行为
        actA.command(Action.EAT);
        actA.command(Action.WORK);
        Action actB = new Woman(); // 美女的行为
        actB.command(Action.EAT + Action.SLEEP + Action.RUN);
        Action actC = new Man(); // 帅哥的行为
        actC.command(Action.EAT + Action.SLEEP + Action.RUN + Action.WORK);
    }
}

abstract class Action { // 表示操作行为
    public static final int EAT = 1;
    public static final int WORK = 2;
    public static final int SLEEP = 5;
    public static final int RUN = 10;

    public abstract void eat(); // 声明一抽象类

    public abstract void sleep(); // 声明一抽象类

    public abstract void run(); // 声明一抽象类

    public abstract void work(); // 声明一抽象类

    public void command(int ch) { // 具体的命令
        switch (ch) {
        case EAT:
            this.eat();
            break;
        case SLEEP:
            this.sleep();
            break;
        case RUN:
            this.run();
            break;
        case WORK:
            this.work();
            break;
        case EAT + WORK:
            this.eat();
            this.work();
            break;
        case EAT + SLEEP + RUN:
            this.eat();
            this.sleep();
            this.run();
            break;
        case EAT + SLEEP + RUN + WORK:
            this.eat();
            this.work();
            this.run();
            this.sleep();
            break;
        }
    }
}

class Robot extends Action { // 定义子类Robot行为
    public void eat() { // 覆写抽象方法
        System.out.println("为机器人加燃料。");
    }

    public void sleep() {
    }

    public void run() {
    }

    public void work() {
        System.out.println("让机器人开始工作。");
    }
}

class Woman extends Action { // 定义子类Woman行为

    public void eat() {
        System.out.println("请美女吃饭。");
    }

    public void sleep() {
        System.out.println("让美女睡美容觉。");
    }

    public void run() {
        System.out.println("让美女跑步健身。");
    }

    public void work() {

    }
}

class Man extends Action { // 定义子类Man行为

    public void eat() {
        System.out.println("帅哥吃早饭、午饭、晚饭、加餐。");
    }

    public void sleep() {
        System.out.println("帅哥休息好以恢复精神和体力。");
    }

    public void run() {
        System.out.println("帅哥通过跑步来锻炼身体。");
    }

    public void work() {
        System.out.println("帅哥为了和美女幸福地生活在一起,要好好工作。");
    }
}

运行结果:

运行结果3

如果想实现指定操作,只需将方法按照要求覆写即可,相当于父类定义出了一个操作模板。实际用的时候也可以在servlet程序设计上使用。

二、接口

接口(interface)是一种特殊的类,结构上和抽象类非常相似,也具有数据成员与抽象方法,但与抽象类又有不同。

1.接口的基本概念

接口里的数据成员必须初始化,且数据成员均为常量,常见的是全局变量。

接口允许定义默认方法,即default方法,也可以称作Defender方法,或者虚拟扩展方法(Virtual extension methods)。

语法:

interface 接口名称 { // 定义接口类
  final 数据类型 成员名称 = 常量; // 数据成员必须赋初值
  abstract 返回值的数据类型 方法名称(参数···); // 抽象方法,注意在抽象方法里没有定义方法体
  default 返回值的数据类型 方法名称(参数···){ // 默认方法,包含方法体
  ···方法体···
  }
}

定义接口例:

interface A { // 定义一个接口
  public static final String INFO = "Hello Worlk."; // 全局常量
  public abstract void print(); // 抽象方法
}

带默认方法的接口定义例:

interface B { // 定义一个接口
  public static final String INFO = "Hello Worlk."; // 全局常量
  public abstract void print(); // 抽象方法
  default public void otherprint() { // 带方法体的默认方法
     System.out.println("default menthods!"); // 默认方法的方法体
  }
}

思考

出差中,舟车劳顿,有点累。也确实有一段时间没有看书了。。。


记于2017年9月18日夜

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,493评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,494评论 18 139
  • 一、抽象类 1、抽象类含义的概括: 当多个类出现相同功能时,但功能主体不同,这样可以向上抽取,抽取时只抽取功能定义...
    玉圣阅读 821评论 0 6
  • 你很清楚的知道什么时候用抽象类,什么时候用接口么?p.s. 多文字预警! 1 抽象类和接口简介 1.1 抽象类 ...
    Sharember阅读 2,324评论 9 55
  • D15~3月21接纳3.1,今天她来我家敲门时我就开始反感,心里很不想给她开门,但又不能太明显,还是勉强的开了。进...
    崭新的我北京阅读 191评论 0 0