(十)抽象和接口

abstract和interface

abstract(抽象的)

abstract class Pet{
    public abstract void eat();
}
class cat extends pet{
    public void eat(){
        System.out.println(“这只猫在吃鱼……”)
    }
}

由上面的代码,我们可以看出,abstract可以修饰类,也可以修饰方法。

1、抽象方法/函数(abstract method)

1.定义

如果所有的子类中存在了一些名称一致而细节不同的方法的时候,这个时候可以在父类中声明该行为,此时声明行为的时候不需要添加方法体,所以此时该方法就形成了抽象方法,使用abstract修饰。
上面的一段话是官方的解释,我自己的理解:其实抽象方法就是使用abstract修饰,并且没有方法体的方法。

2.特点

1.抽象方法可以和抽象方法重载,也可以和实体方法重载。
2.抽象方法没有方法体,()之后直接“;”结束。

abstract class Demo{
    //抽象方法
    public abstract void m();
    //重载抽象方法
    public abstract int m(int i);
    //实体方法与抽象方法重载
    public double m(double d){
        return d;
    }
}
3.修饰权限

1.抽象方法不可以被static、final、private修饰,因为这三个修饰符修饰的方法都不可以被重写。
抽象方法不可以用static修饰,static修饰的方法,先于对象存在,没有具体对象没办法加载。
2.抽象方法可以使用默认权限修饰,要求子类必须和父类同包。
3.抽象方法可以被protected权限修饰,要求要么同包要么是子类。

2、抽象类(abstract class)

1.定义

将一些名称一致但是细节不同的行为提取到父类中定义为抽象方法,抽象方法所在的类就是抽象类,用abstract来修饰的类。抽象类中,不一定含有抽象方法,但是抽象方法所在的类一定是抽象类。

2.特点

1.抽象类不可以在Java中创建对象/实例化。即使没有抽象方法也无法创建对象,可以创建匿名内部类。
2.抽象类有构造函数。抽象类的构函数可以私有化,在本类中使用。在底层用C语言创建对象。
3.抽象类被子类继承之后,必须重写其中的抽象方法。子类如果也为抽象类,可以不重写。抽象方法必然会被重写。
4.抽象类中可以没有抽象方法。抽象类中可以定义一切的属性和方法。
5.抽象方法不能有方法体,()之后直接以;结尾。

3.修饰权限

抽象类不能用final修饰。
最终类不可以是抽象类。

个人理解只要不能被继承这个修饰符就不能修饰抽象。

4.作用

抽象类可以限制规定子类必须实现某些方法,但不关注实现细节。

5.抽象类和普通类的区别

抽象类和普通类的区别就是可以有抽象方法,不可以创建对象。

interface(接口)

1、定义

用interface来声明,所有方法都为抽象方法那么我们就称之为接口。
通过implements关键字让接口和类产生联系,这个过程叫实现。
在接口中使用向上造型来创建对象,就是接口的多态。

以上三个概念记住就行了。

interface Pet{
    void eat();
}
class Mouse implements Pet{
    public void eat(){}
}

2、特点

1.接口中方法的abstract关键字可以省略。
2.类用implements来实现一个接口。必须实现这个接口中所有的方法。
3.由于接口中都是抽象方法,接口不能实例化。
4.接口中没有构造函数。虽然接口在编译完成之后会产生class文件,但是接口不是类。
5.接口中可以定义属性,这个属性默认是一个静态常量(public static final 修饰符的位置可以调换)。

3、权限修饰

1.接口中的属性默认是用public static final 来修饰,修饰符的位置可以互换。
2.接口中的方法默认用public abstract修饰,而且只能是public修饰的,public可以省略不写。在接口的子类中实现接口的方法记得用public修饰。

interface A {
    void m(); // 默认是public修饰
}
public class B implements A {
    public void m(){} // 需要添加修饰符public
}

4、继承(extends)与实现(implements)

Java中类支持单继承,多实现。一个类只能继承一个类,但是一个类可以实现多个接口。一旦出现了多实现,那就必不可免的会导致方法调用混乱。

interface Pet{
    void eat();
}
interface Animal{
    void play();
}
//多实现
class Mouse implements Pet,Animal{
    public void eat(){}
    public void play(){}
}

当接口强转的时候,Java中接口之间是多继承,并且接口和类之间是多实现的关系,所以就形成了一张继承关系网,由于在网状结构中寻找一个根节点比较困难,为了提高效率,Java在编译的时候放弃检查接口和类之间是否有实现关系。
当类进行强制转换的时候,JVM在编译的时候会对两个类进行检查,检查这两个类之间是否有继承关系。如果有继承关系,则编译的时候会通过,但是运行的时候不一定正确。如果没有继承关系,则在编译的时候直接报错。

5、作用

统一了结构。接口可以作为模板,配合多态实现解耦,比如反射。

抽象类和接口的异同

最后借用别人的总结来说一下:
抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造函数,可以有抽象方法和具体方法,而接口中不能定义构造函数而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。

上面这段话很长,相信大多人觉得不好记,我自己总结一个思路:
1.先从实例化入手
2.然后是实现
3.构造方法
4.修饰权限
5.成员属性、方法
简单记住上面的五点,是不是感觉不是那么的难了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值