当前位置:   article > 正文

Java----抽象类和接口

Java----抽象类和接口

欢迎大家来这次博客-----抽象类和接口。 

1.抽象类

1.1 抽象类概念

在Java中我们都是通过类来描述对象,但反过来并不是所有的类都是用来描述对象的。当一个类中没有足够的信息来描述一个具体对象,我们就将该类称为抽象类

如上图中的Shape类,我们想通过Shape类中的draw()方法来实现画各种图形,但由于Shape类不是具体的图形,所以Shape类中的draw()方法也无法实现画各种图形,所以我们将Shape类设置成抽象类。

代码演示

  1. abstract class Shape{
  2. public abstract void draw();
  3. }
  4. class Triangle extends Shape{
  5. @Override
  6. public void draw() {
  7. System.out.println("画一个三角形");
  8. }
  9. }
  10. class Cycle extends Shape{
  11. @Override
  12. public void draw() {
  13. System.out.println("画一个圆");
  14. }
  15. }
  16. class Rect extends Shape{
  17. @Override
  18. public void draw() {
  19. System.out.println("画一个矩形");
  20. }
  21. }
  22. public class Test {
  23. public static void main(String[] args) {
  24. Shape[] shapes={new Triangle(), new Cycle(), new Rect()};
  25. for(Shape shape:shapes){
  26. shape.draw();
  27. }
  28. }
  29. }

代码演示

  1. abstract class Animal{
  2. public abstract void Bark();
  3. }
  4. class Dog extends Animal{
  5. @Override
  6. public void Bark() {
  7. System.out.println("小狗在汪汪叫");
  8. }
  9. }
  10. class Cat extends Animal{
  11. @Override
  12. public void Bark() {
  13. System.out.println("小猫在喵喵叫");
  14. }
  15. }
  16. public class Test {
  17. public static void func(Animal animal){
  18. animal.Bark();
  19. }
  20. public static void main(String[] args) {
  21. Dog dog=new Dog();
  22. func(dog);
  23. Cat cat=new Cat();
  24. func(cat);
  25. }
  26. }

注意,如以上代码有些地方看不懂,后面回一 一介绍。

1.2 抽象类语法

在Java中,当一个类被关键字abstract修饰,该类就被称为抽象类,抽象类中如果有方法被abstract修饰,则该方法就被称为抽象方法,抽象方法不需要具体实现

  1. //抽象类
  2. abstract class Animal{
  3. //抽象方法
  4. public abstract void Bark();
  5. }

注意事项:

抽象类中也可以包含普通的方法,甚至也可以包含构造方法。 

1.3 抽象类的特性

1. 抽象类不能实例化对象

2. 抽象方法不能被private修饰。

3. 抽象方法不能被final和static修饰,因为子类要重写抽象方法。

4. 抽象类必须被继承,继承抽象类的子类必须重写抽象类中的抽象方法。否则子类也是抽象类,必须用abstract修饰。

5. 抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类。

6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量。

1.4 抽象类的作用

抽象类本身是不能实例化的,要想使用抽象类,必须需要继承的子类重写抽象类中的抽象方法。

有人这时候就很疑惑,普通类不是也能被继承吗?

确实如此,但是使用抽象类多了一层编译器的校验。

如上面的代码,我们完成的操作都是由子类去完成的,但是如果交由父类去完成,普通编译器是不会报错的,但使用了抽象类,父类在实例化的时候就会报错,起到一个提醒的作用。

2. 接口

2.1 接口的概念

在生活中,接口比比皆是,如插座,USB插口。

接口通俗来说就是一种固定行为规范,只要你的操作符合规范,就能使用接口。

在Java中,接口可以看作为多个类的行为规范,是一种引用数据类型。 

2.2 接口的语法规则

关键字interface  接口名字

举例,如下图,

2.3 接口的特性

1.接口是一种引用数据类型,但是不能直接new关键字来创建对象。

2.接口中的每一个方法都是默认由public abstract 修饰的,也就是说接口中的方法不能被其他关键字修饰。(可以不写修饰接口中方法的关键字,编译器默认为public abstract)

3. 接口中的方法不能在接口中实现,只能在使用接口的类中实现。(有特殊情况)

 4. 如果接口中的方法被default或者static修饰,可以有具体实现。

5.  重写接口中的方法时,不能使用默认的访问权限。

6. 接口中可以含有变量,但会默认为被 public static final 修饰。  

7. 接口中不能含有静态代码块和构造方法

8.如果类中没有重写接口中所有的抽象方法,则该类要用abstract修饰

9.接口虽然不是类,但接口编译完成后的字节码文件的后缀也是 .java 。

2.4 接口的使用

接口不能直接使用,必须要有一个 “实现类” 来重写接口中的抽象方法,通过这个实现类来使用接口。

如果一个类想使用一个接口,要用到implements关键字。

语法格式

  1. public class 类名称 implements 接口名称{
  2. // ...
  3. }

注意:父类与子类之间的关系为extends,类与接口之间的关系为implements。

实现一个USB接口

  1. interface USB{
  2. void close();
  3. void open();
  4. }
  5. class Mouse implements USB{
  6. @Override
  7. public void close() {
  8. System.out.println("关闭鼠标");
  9. }
  10. public void open(){
  11. System.out.println("打开鼠标");
  12. }
  13. public void click(){
  14. System.out.println("点击鼠标");
  15. }
  16. }
  17. class KeyBoard implements USB{
  18. public void close(){
  19. System.out.println("关闭键盘");
  20. }
  21. @Override
  22. public void open() {
  23. System.out.println("开启键盘");
  24. }
  25. public void input(){
  26. System.out.println("输入功能");
  27. }
  28. }
  29. class Computer implements USB{
  30. @Override
  31. public void close() {
  32. System.out.println("关闭电脑");
  33. }
  34. public void open(){
  35. System.out.println("打开电脑");
  36. }
  37. public void use(USB usb){
  38. usb.open();
  39. if(usb instanceof Mouse){
  40. ((Mouse) usb).click();
  41. }else{
  42. ((KeyBoard)usb).input();
  43. }
  44. usb.close();
  45. }
  46. }
  47. public class Test {
  48. public static void main(String[] args) {
  49. Computer computer=new Computer();
  50. computer.open();
  51. USB usb1=new Mouse();
  52. computer.use(usb1);
  53. System.out.println("=======");
  54. USB usb2=new KeyBoard();
  55. computer.use(usb2);
  56. computer.close();
  57. }
  58. }

2.5  实现多个接口

一个类不能同时继承多个类,但是一个类可以同时使用多个接口。

举个例子:用Java来描述鸭子会飞,会游泳和会跑。

我们可以将会飞,会游泳,会跑设置为三个接口。

ISwimming接口

  1. public interface ISwimming {
  2. void swim();
  3. }

IRunning接口

  1. public interface IRunning {
  2. void run();
  3. }

IFly接口

  1. public interface IFly {
  2. void fly();
  3. }

Duck类

  1. public class Duck extends Animal implements IFly,IRunning,ISwimming{
  2. public Duck(String name){
  3. super(name);
  4. }
  5. @Override
  6. public void fly() {
  7. System.out.println(this.name+"会飞");
  8. }
  9. @Override
  10. public void run() {
  11. System.out.println(this.name+"会跑");
  12. }
  13. @Override
  14. public void swim() {
  15. System.out.println(this.name+"会游泳");
  16. }
  17. }

测试类

  1. public class Test {
  2. public static void main(String[] args) {
  3. Duck duck=new Duck("小鸭");
  4. duck.fly();
  5. duck.run();
  6. duck.swim();
  7. }
  8. }

 快捷操作:CTRL+I键 快速实现接口

 使用接口的好处就是可以让程序员忘记类的限制,只需要关注该类有没有此接口对应的功能。

  1. class Robot implements IRunning{
  2. @Override
  3. public void run() {
  4. System.out.println("机器人再跑1");
  5. }
  6. }
  7. public class Test {
  8. public static void func(IRunning running){
  9. running.run();
  10. }
  11. public static void main(String[] args) {
  12. Duck duck=new Duck("小鸭");
  13. func(duck);
  14. Robot robot=new Robot();
  15. func(robot);
  16. }
  17. }

如以上代码,我们给func函数穿的参数可以是Duck类,也可以是Robot类,只要这两个类具备跑的能力就行了。

2.6 接口之间的继承

在Java中,类与类之间只允许单继承,不允许多继承。但是对于接口来说,接口之间既可以单继承,也可以多继承。

接口之间的继承也是用到extends关键字。

 代码演示

  1. interface Double extends IRunning,ISwimming{
  2. }
  3. class Dog implements Double{
  4. @Override
  5. public void run() {
  6. System.out.println("狗会跑");
  7. }
  8. @Override
  9. public void swim() {
  10. System.out.println("狗会游泳");
  11. }
  12. }
  13. public class Test {
  14. public static void main(String[] args) {
  15. Dog dog=new Dog();
  16. dog.run();
  17. dog.swim();
  18. }
  19. }

到此,抽象类和接口的基础内容就介绍完了,感谢观看。

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/756149
推荐阅读
相关标签
  

闽ICP备14008679号