抽象类与接口注意事项

(一)关于抽象类的注意点

1、被abstract修饰的类称之为抽象类,被abstract修饰的方法称之为抽象方法

2、一个类中如果有抽象方法,那么这个类必须成为抽象类

3、抽象类不能实例化!!,换句话说,就是不能自己new自己。

4、抽象类必须要有一个子类,子类可以实现抽象类中的抽象方法。如果子类实现类抽象类中的所有方法,那么就可以通过向上造型来使用抽象类。(Java多态性体现)

public class AbstractDemo1 {
    public static void main(String[] args) {
        AbstractA a = new TestB();
        a.doWork();
        a.play();
    }
}

abstract class AbstractA{
    public int salary(){
        return 1000000;
    }
    public abstract void play();
    public abstract void doWork();
}

class TestB extends AbstractA{
    @Override
    public void play() {
        System.out.println("一起来嗨皮");
    }
    @Override
    public void doWork() {
        System.out.println("一起来工作");
    }
}

5、抽象类是可以写构造方法的。

6、抽象类可以提供普通方法。

7、抽象类中的抽象方法可以重载。重载的方法也必须为抽象方法

public abstract void doWork();

public abstract void doWork(String name);

8、抽象类的子类如果没有完全实现父类的抽象方法,那么子类也需要变成抽象类子类的子类再去实现抽象方法。

9、final修饰的类是最终类,不能被继承,抽象类必须要被继承后实现抽象方法,所以final不能修饰抽象类。

10、抽象类中的抽象方法,不能使用private修饰,因为抽象方法必须要被子类实现。

11、抽象类中的抽象方法,不能使用static修饰,因为静态方法可以直接使用类名调用,在抽象方法中没有意义。

12、受java的单继承的影响,抽象类不能够同时继承多个父类。

(二)关于接口的注意点

(1)接口是功能的集合。接口是比抽象类更抽象的"类".在JDK1.8之前接口中只能放抽象方法。

(2)接口中的抽象方法,必须使用public abstract修饰,可以省略,但是省略后默认还是使用public abstract修饰,也可以省略其中一个。

abstract void work();
public void play();

(3)接口中是可以定义变量,但是变量默认会使用public static final修饰,所以实际上是一个常量。

(4)使用javap XXX.class 可以进行反编译。

(5)接口不能够直接实例化,可以通过向上转型,或者匿名内部类的方法

(6)使用接口需要写一个接口的实现类来实现接口中所有的抽象方法。使用时使用向上造型,就可以调用接口中的抽象方法了。

(7)接口不能有构造方法

(8)接口中的方法可以重载。

(9)类和接口可以做到多实现。如果有多个接口,那么在implements后面通过,分割不同的接口

interface Inter1 {
    public void play();
}
interface Inter2 {
    public void work();
}
interface Inter3 {
    public void sleep();
}
class DemoA implements Inter1 , Inter2 , Inter3{

    @Override
    public void sleep() {
        System.out.println("赶快去睡觉");
    }
    @Override
    public void work() {
        System.out.println("一起来工作");
    }
    @Override
    public void play() {
        System.out.println("一起来嗨皮");
    }
}

(10)接口和接口之间可以做到多继承。

interface Inter4 extends Inter1, Inter2, Inter3 {
}

(11)子接口和父接口中可以允许有重名的方法。因为接口中没有方法的实现。实现是看子类如何实现的。

interface Inter3 {
    public void sleep();
}
interface Inter4 extends Inter1, Inter2, Inter3 {
    public void sleep();
}

(12)java中类和类的继承关系是树状结构,接口之间是网状结构。

补充: 由于接口的多实现和多继承,所以为了提高编译效率,在编译阶段不会检查强转的类型是否匹配

class TestDemo{
    public static void main(String[] args) {
        Inter4 i = (Inter4) new DemoA();
    }
}

interface Inter4{
    public void sleep();
}
class DemoA{
}

虽然DemoA与Inter4不具有实现关系,但仍然能强转成功。虽然在编译阶段不会报错,但运行阶段会报错。

java.lang.ClassCastException

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值