抽象类、接口

目录

1. 抽象类

2. 接口 

3. 总结 


1. 抽象类

为什么会有抽象方法呢?一些没有实际工作的方法,就可以把它设计为抽象方法 ,抽象类中包含抽象方法。

抽象类存在的最大意义就是可以被继承。因此不能搭配final 使用(final 修饰常量,表示不能被继承,修饰方法,表示不能被继承,修饰类表示该类不能有子类)

抽象类不可以被实例化,如果类的外部想使用该抽象类的子类 ,就可以让子类重写抽象类中的抽象方法。(但是普通方法也可以被继承,此时就感觉没有必要使用抽象类。实际上使用抽象类就相当于多了层保障:在普通方法中,该工作应该由子类来做,父类不需要完成,如果此时调用错成父类了,使用普通类编译器不会报错,但是父类是抽象类就会在实例化的时候提示错误,及时修改)

abstract class A {  //抽象类
    public void fun () {
        System,out.println("普通方法");
    }
    abstract public void print(); //抽象方法
}

💫 在方法前加上abstract ,就变成一个抽象方法,抽象方法没有方法体,只有函数声明。

💫 对于类来说,前面加上abstract 表示抽象chou 

普通类有的功能抽象类 都有,并且抽象类是普通类的超集,抽象类只是比普通类多了抽象方法而已。

💫 抽象类不能直接实例化。A  a = new A();

💫 抽象方法 不能用private 修饰,必须是public 和 protected。 如果是private权限,则不能被子类继承,子类无法实现该方法。abstract private void draw();

💫 抽象类必须有子类,使用extends 继承,一个子类只能继承一个抽象类。

💫 子类必须覆写抽象类中的所有抽象方法,如果子类也为抽象方法,就可以不用覆写父类的抽象方法。

💫 抽象类当中不一定有抽象方法,但含有抽象方法的类定为抽象类。 

2. 接口 

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

public interface 接口名称 {
    int i = 1;
    public abstract void method();
    void print();
}

💫 使用interface 来定义接口

💫 接口中可以包含变量和方法,变量被隐式指定为 public static final ,方法被隐式指定为public abstract 

💫 一个类可以同时实现多个接口,一个类只能继承一个类。一个类如果同时继承类,又实现接口,先extends一个类,再implements 多个接口。也间接解决了Java中不能多继承的问题。

💫 子类实现接口,必须实现接口中的所有抽象方法。

💫 接口中的权限默认全是public,因此可以忽略public

💫 接口中的方法一定是抽象方法,只能包含抽象方法,因此可以忽略abstract。对字段来说,接口中只能包含静态常量可以忽略 final static

💫 接口不能单独被实例化

💫 ​​​​​​​接口创建时,接口的命名一般以大写字母 I 开头。

 

interface IMessage {
    public static final String i = "hello";
    public sbatract void fun();
}

简化为:

interface IMessage {
    String i = "hello";
    void fun();
}

Java中只支持单继承,利用接口就可以解决多继承问题。

动物类:

class Animal { 
     protected String name; 
 
     public Animal(String name) { 
         this.name = name; 
     } 
}
 

interface IFlying {
     void fly(); 
} 
interface IRunning { 
     void run(); 
} 
interface ISwimming { 
     void swim(); 
}

猫🐱:

class Cat extends Animal implements IRunning { 
     public Cat(String name) { 
         super(name); 
     } 
     @Override 
     public void run() { 
         System.out.println(this.name + "正在用四条腿跑"); 
     } 
}

鱼🐟:

class Fish extends Animal implements ISwimming { 
     public Fish(String name) { 
         super(name); 
     } 
     @Override 
     public void swim() { 
         System.out.println(this.name + "正在用尾巴游泳"); 
     } 
}

青蛙🐸:

class Frog extends Animal implements IRunning, ISwimming { 
     public Frog(String name) { 
         super(name); 
     } 
     @Override 
     public void run() { 
         System.out.println(this.name + "正在往前跳"); 
     } 
     @Override 
     public void swim() { 
         System.out.println(this.name + "正在蹬腿游泳"); 
     } 
}

鸭子🦆:

class Duck extends Animal implements IRunning, ISwimming, IFlying { 
     public Duck(String name) { 
         super(name); 
     } 
     @Override 
     public void fly() { 
         System.out.println(this.name + "正在用翅膀飞"); 
     } 
     @Override 
     public void run() { 
         System.out.println(this.name + "正在用两条腿跑"); 
     } 
     @Override 
     public void swim() { 
         System.out.println(this.name + "正在漂在水上"); 
     } 
}
一个类继承一个父类 , 同时实现多种接口。这也是多态的好处,就可以不用时刻关注类型(是哪个具体的动物),而只关注该类是否具备这个能力(会跑、会飞等)。

3. 总结 

接口和抽象类对比
区别抽象类(abstract)接口(interface)
1组成普通类、抽象方法抽象方法、全局常量
2权限任何一种public
3子类使用extendsimplements
4关系一个抽象类可以实现多个接口接口不能继承抽象类,但接口可以用extends关键字继承多个父接口
5子类限制单继承多继承

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值