抽象类和接口

一、抽象类

抽象:笼统,模糊,看不懂!不具体

抽象类的由来:举个栗子说明

抽象类的由来

抽象类:当一个类在描述事物时,没有足够的信息去描述这个事物,就叫抽象类

抽象类的特点

1、方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰
抽象方法必须定义在抽象类中。该类也必须被abstract修饰。
2、抽象类不可以被实例化。因为调用抽象方法没意义。
3、抽象类必须有其子类覆盖所有的抽象方法后,该子类才可以实例化,否则这个子类还是抽象类。

通过5个问题来细说抽象类

1、抽象类中有构造函数吗?

有,用于给子类对象初始化

2、抽象类可以不定义抽象方法吗?

可以,很少见
目的就是不让该类创建对象。有方法体,却没有内容。
eg:AWT的适配器

3、抽象关键字不可以和哪些关键字共存?

private 不行 抽象方法要被覆盖,私有了子代都不知道去哪覆盖?!
static 不行 抽象方法不需要对象,因为方法体内没有内容
final 不行 我要覆盖abstract,final不让覆盖,那不打架了么,共存个屁!
不能共存关键字编译

4、抽象类和一般类的异同点。

相同点:都是描述事物,都在内部定义了成员
不同点:一般类有足够的信息描述信息;但抽象类描述事物的信息不足。
       一般类中不能定义抽象方法;而抽象类中可以定义抽象方法也可以定义非抽象方法
       一般类可以被实例化;抽象类不能被实例化

5、抽象类一定是一个父类吗?

是!
因为需要子类覆盖其方法后才可以对子类实例化

用抽象类来举个栗子:

雇员:
需求:公司中程序员有姓名,工号,薪水,工作内容。
项目经理除了姓名,工号,薪水,工作内容,还有奖金。
对给出需求进行数据建模

//分析:先找出涉及的对象:程序员,项目经理
//程序员
//     属性:姓名,工号,薪水。
     //行为:工作
//项目经理
     //属性:姓名,工号,薪水,奖金。
     //行为:工作
//程序员和项目经理不存在这直接继承关系
//但他们都是公司的雇员,可以将程序员和项目经理进行抽取,建立关系


//描述雇员
abstract class Employee
{
    private String name;
    private String id;
    private double pay;
    Employee(String name,String id,double pay)
    {
        this.name = name;
        this.id = id;
        this.pay = pay;
    }
    public abstract void work();
}

//描述程序员
class Programmer extends Employee
{
    Programmer(String name,String id,double pay)
    {
        super(name,id,pay);
    }
    public void work()
    {
        System.out.println("code...");
    }
}

//描述项目经理
class Manager extends Employee
{
    private int bonus;
    Manager(String name,String id,double pay,int bonus)
    {
        super(name,id,pay);
        this.bonus = bonus;
    }
    public void work()
    {
        System.out.println("manage");
    }
}

二:接口(interface)

接口的由来:当抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口
就好像四条边相等的长方形叫正方形一样

定义接口:关键字是interface不是class

interface Demo
{
}

接口中常见成员

全局常量

public static final

抽象方法

public abstract

由此看出接口中的成员都是公共的

由于接口里的都是抽象的,所以不用继承叫实现!

类与类之间叫继承,类与接口之间叫实现!

接口不可以实例化
只能由实现了接口的子类并覆盖了接口中所有的抽象方法后,该子类才可以实例化。否则这个子类就是一个抽象类。

来个栗子说明

interface Demo
{
       public static final int NUM = 4;
       public abstract void show1();
       public abstract void show2();
}
class DemoImp1 implements Demo//翻译过来是:这个Demolmp1类实现了Demo这个接口
{
public void show1()
{}
public void show2()
{
}
}
class InerfaceDemo
{
       public static void main(String[] args)
     {
          DemoImp1 d = new DemoImp1();  //不可以有 d.NUM = 3; 因为NUM的值是final
          System.out.println(d.NUM);     //对象
          System.out.println(DemoImp1.NUM);    //子类调用NUM成员
          System.out.println(Demo.NUM);    //接口Demo调用NUM成员
     }
}

运行结果

面向对象中说过Java中不直接支持多继承,因为会出现调用的不确定性。
所以Java将多继承机制改良,变成了多实现

一个类可以实现多个接口

多实现的体现

interface A
{
       public abstract void show();
}
interface B
{
       public abstract void show();
}
class Test implements A,B//多实现
{
    public void show()  //及覆盖了A的中的show又覆盖了B中的show
    {
        
    }
}
class InerfaceDemo
{
       public static void main(String[] args)
     {
         Test t = new Test();
         t.show();
     }
}

一个类在继承另一个类的同时,还可以实现多个接口。接口的出现避免了单继承的局限性

interface A
{
       public abstract void show();
}
interface B
{
       public abstract void show();
}
class Q
{
    public void method()
    {}
}
class Test2 extends Q implements A,B   //test2继承了Q 但还需要其他功能,
                                          //所以通过接口实现其他功能
                                        //先继承再实现
{
    
}

接口和接口之间是继承关系

总结一下:接口的特点

1、接口是对外暴露的规则  例如USB口
2、接口是程序的功能扩展  
3、接口的出现降低耦合性
4、接口可以用来多实现
5、接口和接口之间是继承关系
6、类和接口是实现关系,而且类可以继承一个类的同时实现多个接口

三、抽象类和接口的异同点

相同点:都是不断向上抽取而来的

不同点:
1、抽象类需要被继承,而且只能单继承
接口需要被实现,而且可以多实现
2、抽象类中可以定义抽象方法和非抽象方法,子类继承后,可直接使用非抽象方法
接口中只能定义抽象方法,必须由子类去实现
3、抽象类的继承,是is a关系。在定义该体系的基本共性内容。
接口的实现是 like a关系。在定义体系额外功能。

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

推荐阅读更多精彩内容

  • abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机...
    shenshizhong阅读 2,946评论 4 23
  • 先来看看抽象类和接口的定义: 抽象类(abstract class): 使用abstract修饰符修饰的类。官方点...
    IT废柴阅读 53,706评论 7 45
  • 1. 抽象类 什么是抽象类 包含一个抽象方法的类就是抽象类 抽象方法 声明而未被实现的方法,抽象方法必须使用abs...
    FantJ阅读 1,351评论 0 5
  • Java中,有两种实现OOP(Object Oriented Programming)编程的方法:抽象,接口。 f...
    Arya鑫阅读 494评论 0 1
  • 老旧的铁窗锈迹斑驳 被称为解药的氟西汀撒了一地生冷 凌乱不堪狼狈到极致 旧病复发愈演愈烈 像活在梦里 一层透明白纱...
    浮山阅读 581评论 0 0