java 组合爆炸_Java 抽象类和接口

一、抽象类

子类的不断具体化,使得父类经常被设计得非常抽象,以至于没有具体的实例与之对应。

抽象类有属性和方法,但无法通过new创建实例。

1、抽象方法

抽象方法只有方法声明,没有方法体的方法。它的实现由子类提供

包含抽象方法的类必须是抽象的,但是也允许声明没有抽象方法的抽象类。

而非抽象类不能有抽象方法,同时,从抽象父类派生的子类如果不能实现所有的抽象方法,它也必须声明为抽象的。

子类可以是抽象的,即使它的父类是具体的。

抽象类可以定义构造方法,且能被子类在构造方法中调用。

2、抽象类的实例化

通常,在抽象父类中声明子类的公共方法接口,调用者只需要了解抽象类的方法接口,就能知道子类的行为能力。

3、final的作用

有时候不希望类被其他子类派生或修改,可以用final关键字实现。

final修饰的类不能被派生~

final修饰方法,禁止子类重写。

二、继承与组合

继承是强耦合关系,父类变,子类必须变。而且继承破坏了封装。

所以实践中,慎用继承,尽量选择组合。

1、什么是组合?

在新类里创建已有类的对象。(依赖)表达的是包含关系

UML图,实线,实心菱形(主体类)

2、用继承还是组合?

考虑是否要从新类上转型回父类,若必须上溯,则需要使用继承。否则应该谨慎,防止继承滥用。

三、接口(interface)

Java中,单继承使得类层次结构更加清晰、易于管理。

但是一个类可以实现多个接口。类通过暴露方法实现与外界的交互,这些方法形成和外部世界的规约。

1、理解接口

接口,像是一种特殊的抽象类,通过一组空的方法体的方法来声明需求。

类若是实现了接口,就承诺了它会实现的行为。

这样,接口构成了类和外部世界之间的契约,并且该契约在编译时由编译器强制检查。即接口中定义的所有方法都必须出现在其源代码,否则就不能成功编译。

不同的类通过实现相同的接口而建立了联系。

2、接口的定义

接口的访问修饰符:public表明任意类和接口都能使用该接口;deafult表明只有定义在同一个包中的类和接口可以使用

接口中的属性:默认被public static final修饰,不能被其他修饰符修饰

接口中的方法:

定义在接口中的方法默认为public abstract,也不能被其他修饰符限定;

接口可以继承多个父接口,也能隐藏父接口的属性,覆盖父接口的方法;

只进行方法声明,没有实现。但是Java 8后可以有default方法的实现;

3、接口的实现

implements声明要实现的接口,意味着遵循某个契约!

UML中,类与接口实现关系用带空心三角形的虚线表示。

实际中,通过接口实现多态比基于继承实现多态应用地更加广泛!!慎用继承!

4、接口的特性

一个接口,可以继承多个接口,Interface3 Extends Interface0, Interface1, interface……(可能是因为接口中的方法都是抽象方法,且只有方法声明,所以不存在选择哪一个父接口中的方法继承的问题)。

一个类可以实现多个接口,这弥补了Java单继承的缺陷。(这时要避免多个接口中有方法同名)

接口不是类,当然不能实例化,但是接口可以作为一种引用类型(即接口变量),指向实现了这个接口的类的对象!这就是上节所说的用接口方式实现多态吧,也就是说,可以通过接口变量调用不同的对象的接口方法(当然是实现了该接口的类的实例)。如下例:

public classInterfaceDemo {public static voidmain(String[] args) {

Dog dog=newDog();

Cat cat=newCat();

Animals animals=dog;

dog.talking();

animals=cat;

animals.talking();

}

}interfaceAnimals{voidtalking();

}class Dog implementsAnimals{public voidtalking(){

System.out.println("Dogs:wang~wang~");

}

}class Cat implementsAnimals{public voidtalking(){

System.out.println("Cats:mua~mua~");

}

}

5、使用接口注意的点:

接口中的方法的访问权限默认为public;

接口中声明的属性,为public static final,它可以通过实现了该接口的类的类名访问;

接口中没有方法实现,Java 8后可以有缺省实现;

实现接口的非抽象类,必须实现该接口也的全部方法;但是抽象类不用全部实现;

接口变量,必须指向一个实现了该接口的类的对象;

可以用instanceof操作符检查一个对象是否实现了某个特定的接口

实现多接口时,一定要避免方法名的重复

6、接口设计

接口隔离原则,是接口设计的一个核心原则,是接口设计的最佳实践。

使用多个专门的接口比使用单一的总接口要好;

一个类对另一个类的依赖性应当是建立在最小接口上;

四、接口和抽象类比较

抽象类和接口是Java中的双骄,相辅相成又各司其职。

接口和抽象类的不同表现在下面三个方面:

(1)抽象层次不同

抽象类是对整个类的整体进行抽象,包括属性、行为,接口只对行为抽象。

(2)建模关系不同

抽象类对有相似特点的类建模,体现的更多是一种继承关系。而接口可以对不相关的类建模。

(3)设计层次不同

抽象类是自下而上进行设计;接口只需要定义一个规则。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值