抽象类和接口

目录

抽象类

抽象方法

抽象类的作用

接口

语法规则

接口间的继承

总结


抽象类

类与类之间的关系是继承,一个类可以继承另一个类,而有一种类存在的意义就是为了继承  抽象类

包含抽象方法(abstract method)的类就是抽象类(abstract class)

抽象方法

abstract 修饰的方法称为抽象方法,抽象方法没有方法体( 没有 {} ,不能执行代码) 

abstract class Shape {     
    abstract public void draw(); 
}

对于包含抽象方法的类,必须加上abstract关键字表示这是一个抽象类

注意事项:

1.抽象类不能够直接实例化

Shape shape = new Shape(); 
 
// 编译出错 Error:(30, 23) java: Shape是抽象的; 无法实例化

2.抽象方法不能是private的

abstract class Shape {     
    abstract private void draw(); 
} 
 
// 编译出错 Error:(4, 27) java: 非法的修饰符组合: abstract和private

3.抽象类中可以包含其他的非抽象方法, 也可以包含字段. 这个非抽象方法和普通方法的规则都是一样的,

   可以被重写, 也可以被子类直接调用

abstract class Shape {     
    abstract public void draw(); 
 
    void method() {         
        System.out.println("method");     
    } 
} 
 
class Rect extends Shape {     
    ... 
} 
 
public class Test {     
    public static void main(String[] args) {         
        Shape shape = new Rect();         
        shape.method();     
    } 
} 
 
// 执行结果 method

抽象类的作用

抽象类存在的最大意义就是为了被继承

抽象类本身不能够实例化,要想使用,只能创建抽象类的子类,然后让子类重写抽象类中的抽象方法

abstract class Shape {
    abstract public void draw();

    void method() {
        System.out.println("method");
    }
}
class Rect extends Shape {
    @Override
    public void draw() {
        System.out.println("rect method");
    }
}
public class Test {
    public static void main(String[] args) {
        Shape shape = new Rect();
        shape.draw();
    }
}
//运行结果  rect method

接口

接口是抽象类的更进一步,抽象类中可以包含抽象方法,普通方法和字段,而接口中包含的方法只能是抽象方法,而字段只能是静态常量

语法规则

  • 使用interface定义一个接口
  • 接口的方法一定是抽象方法,因为可以省略abstract
  • 接口的方法权限一定是public,因此可以省略public
  • 一个类可以 实现 一个接口,使用implements
  • 在调用的时候同样可以创建一个接口的引用, 来指向一个子类的实例
  • 接口不能够单独被实例化
interface IShape {     
    void draw(); 
} 
 
class Cycle implements IShape {     
    @Override     
    public void draw() {         
        System.out.println("○");     
    } 
} 
 
public class Test {     
    public static void main(String[] args) {         
        IShape shape = new Rect();         
        shape.draw();     
    } 
} 
//执行结果 ○

 

扩展(extends) vs 实现(implements)

扩展指的是当前已经有了一定的功能了,进一步扩充功能

实现指的是当前啥都没有,需要从头构造

接口中只能包含抽象方法. 对于字段来说, 接口中只能包含静态常量(final static). 

interface IShape {     
    void draw();     
    public static final int num = 10; 
}

其中的 public static final 都可以省略,省略后的num仍然表示public的静态常量

提示:

       1.接口的命名一般以大写字母 I 开头

       2.接口的命名一般使用"形容词"

接口间的继承

类和接口之间的关系是实现(implements),而接口与接口之间和类与类之间的关系都是继承(extends)

interface IRunning {     
    void run(); 
} 
 
interface ISwimming {     
    void swim(); 
} 
 
// 两栖的动物, 既能跑, 也能游 
interface IAmphibious extends IRunning, ISwimming { 
 
} 
 
class Frog implements IAmphibious {  
    //重写IRunning中的run抽象方法
    @Override
    public void run() {
        System.out.println("run");
    }
    //重写ISwimming中的swim抽象方法
    @Override
    public void swim() {
        System.out.println("swim");
    }
} 

接口间的继承相当于把多个接口合并在一起

总结

抽象类中可以包含普通方法和普通字段,这样的普通方法和普通字段可以直接被子类调用(不必重写),而接口中不能包含普通方法,子类必须重写所有的抽象方法

No区别抽象类(abstract)接口(interface)
1组成抽象方法+普通方法+字段只含抽象方法+全局变量
2权限各种权限public
3子类使用使用extends关键字继承抽象类使用implements关键字实现接口
4关系一个抽象类可以实现若干个接口接口不能继承抽象类,但是接口可以继承接口
5子类限制一个子类只能继承一个抽象类一个子类可以实现多个接口

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值