java面向对象——抽象类、接口

拼搏现实的明天。 2023-07-21 06:20 137阅读 0赞

抽象类

抽象类的概念有人会觉得有些抽象,下面我将彻头彻尾的介绍抽象类的概念及其应用
我们先来看下面这组代码
在这里插入图片描述
在刚才的例子中, 我们发现,父类 Shape 中的 draw 方法好像并没有什么实际工作,主要的输出都是由Shape 的各种子类的 draw 方法来完成的。像这种没有实际工作的方法,我们可以把它设计成一个抽象方法,包含抽象方法的类我们称之为抽象类

  1. abstract class Shapes{
  2. public abstract void draw();
  3. }

1.在 draw 方法前加上 abstract 关键字, 表示这是一个抽象方法. 同时抽象方法没有方法体(没有 { }, 不能执行具体代码).
2.对于包含抽象方法的类, 必须加上 abstract 关键字表示这是一个抽象类。

注意事项:

  • 1.用关键字abstract进行修饰
  • 2.在抽象类中,可以有普通类的所有属性
  • 3.和普通类不一样的地方是:包含了抽象方法
  • 4.不能被实例化:不能new
  • 5.主要作用就是被继承
  • 6.不能用final修饰
  • 7.不能是私有的,不能是static的
  • 8.只要是有一个类,继承了这个抽象类,那么必须重写抽象类中的方法

下面来看一下代码的执行应用:

  1. abstract class Shapes{
  2. public abstract void draw();
  3. }
  4. class Cycles extends Shapes{
  5. @Override
  6. public void draw(){
  7. System.out.println("这是一个圆");
  8. }
  9. }
  10. class Rects extends Shapes{
  11. @Override
  12. public void draw(){
  13. System.out.println("这是一个矩形");
  14. }
  15. }
  16. public class TextDemo3 {
  17. public static void main(String[] args) {
  18. Shapes[] shapes2 = {
  19. new Cycles(), new Rects()};
  20. for (Shapes shape : shapes2) {
  21. shape.draw();
  22. }
  23. }
  24. }

输出结果:
这是一个圆
这是一个矩形

抽象类主要的作用是继承,需要注意的是,继承后必须在子类的里面进行重写!!

接口

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

下面是接口的具体实现方法

  1. interface Shape{
  2. void draw();//有几个这种方法,下面重写多少个
  3. }
  4. class Cycle implements Shape{
  5. @Override
  6. public void draw(){
  7. System.out.println("这是一个圆");
  8. }
  9. }
  10. class Rect implements Shape {
  11. @Override
  12. public void draw(){
  13. System.out.println("这是一个矩形");
  14. }
  15. }
  16. public class TestDemo1 {
  17. public static void main(String[] args) {
  18. Shape shape1 = new Cycle();
  19. shape1.draw();
  20. }
  21. }

注意事项

1.使用 interface 定义一个接口
2.接口中的方法一定是抽象方法, 因此可以省略 abstract
3.接口中的方法一定是 public, 因此可以省略 public
4.Cycle 使用 implements 继承接口. 此时表达的含义不再是 “扩展”, 而是 “实现”
5.在调用的时候同样可以创建一个接口的引用, 对应到一个子类的实例.
6 接口不能被实例化
7 在接口中不能定义已经实现的方法
8 实现了该接口,一定重写该接口中的方法
9 接口和接口之间可以通过extends进行联系

补充:

1.接口中的方法都是抽象方法
2.其实可以有具体实现的方法(再jdk1,8加入的),方法前面加上default:(一般情况不用)
default public void func(){}
3.接口中定义的成员变量默认为常量 ,需要初始化
4.接口中的成员变量,默认为public static final
接口中的成员方法默认为: public abstract
5.接口是不可以用来实例化
6.接口和类之间的关系为implements
7.解决java中的单继承问题,可以实现多个接口
8.只要这个类实现了该接口,那么你就可以进行向上转型

实现多个接口(可以实现多继承)

多个接口的实现可以配合继承来完成,该类连接了有几个接口,就要重写多少个方法
在这里插入图片描述
下面是完整代码

  1. class Animal{
  2. public String name;
  3. public Animal(String name){
  4. this.name = name;
  5. }
  6. }
  7. interface Flying{
  8. void fiy();
  9. }
  10. interface Jumping{
  11. void jup();
  12. }
  13. interface Swimming{
  14. void swim();
  15. }
  16. class Dog extends Animal implements Swimming{
  17. public Dog(String name){
  18. super(name);
  19. }
  20. @Override
  21. public void swim() {
  22. System.out.println(this.name +"会游泳");
  23. }
  24. }
  25. class Bird extends Animal implements Jumping,Flying{
  26. public Bird(String name){
  27. super(name);
  28. }
  29. @Override
  30. public void fiy() {
  31. System.out.println(this.name +"会飞");
  32. }
  33. @Override
  34. public void jup() {
  35. System.out.println(this.name + "会跳");
  36. }
  37. }
  38. public class MoreImp {
  39. public static void jum(Jumping jumping){
  40. jumping.jup();
  41. }
  42. public static void swim(Swimming swimming){
  43. swimming.swim();
  44. }
  45. public static void fly(Flying flying){
  46. flying.fiy();
  47. }
  48. public static void main(String[] args) {
  49. Dog dog = new Dog("露露");
  50. swim(dog);
  51. Bird bird = new Bird("huahua");
  52. fly(bird);
  53. jum(bird);
  54. }
  55. }

接口使用示例(综合)

如果想比较一串数字的大小,并且从小到大输出,我们自然想到了以下函数

Arrays.sort();

但是如果想比较一个学生的分数、姓名等属性,应该怎么去写呢,下面是完整代码

自定义比较用Comparable或者Comparator接口

  1. import java.util.Arrays;
  2. //**自定义比较用Comparable接口**
  3. class Student implements Comparable<Student>{
  4. public String name;
  5. public int age;
  6. public int score;
  7. public Student(String name, int age, int score) {
  8. this.name = name;
  9. this.age = age;
  10. this.score = score;
  11. }
  12. @Override
  13. public String toString() {
  14. return "Student{" +
  15. "name='" + name + '\'' +
  16. ", age=" + age +
  17. ", score=" + score +
  18. '}';
  19. }
  20. @Override
  21. public int compareTo(Student o) {
  22. if(this.age<o.age){
  23. return -1;
  24. }
  25. if (this.age==o.age){
  26. return 0;
  27. }
  28. return 1;
  29. }
  30. //或者是以下几种
  31. // return this.age - o.age;//根据年龄从小到大(前面跟后面比)
  32. //return this.score - o.score;//根据分数从小到大
  33. //return this.name.compareTo(o.name);//字符串的比较大小
  34. }
  35. public class TestDemocracy {
  36. public static void main(String[] args) {
  37. Student[] student = new Student[3];
  38. student[0] = new Student("bit",10,32);
  39. student[1] = new Student("bi",13,38);
  40. student[2] = new Student("b",14,34);
  41. Arrays.sort(student);//比较
  42. System.out.println(Arrays.toString(student));
  43. }
  44. }

其中:其中Student 类实现 Comparable 接口, 并实现其中的 compareTo 方法,这样就可以实现几个对象属性的比较大小

发表评论

表情:
评论列表 (有 0 条评论,137人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java -- 面向对象抽象

    今天我们来说一下抽象类,这算是开始步入Java高级阶段的门了,由浅入深,慢慢的接触Java的核心技术,今天乃至于以后的学习都是以前面的基础作为铺垫的,也可以说是 ---- “啃

    相关 Java面向对象-抽象

    定义:在java中,含有抽象方法的类称为抽象类,同样不能生成对象; 注意点: 1,包含一个抽象方法的类是抽象类; 2,抽象类和抽象方法都要用abstract关键字修饰;