Java学习笔记(六)

偏执的太偏执、 2023-10-01 19:33 74阅读 0赞

目录

一:多态

二:抽象类

三:接口


一:多态

1.1 多态的概述

在同一个对象中,在不同时刻表现出来的不同形态。

举例:猫

我们可以说猫是猫: 猫 cat=new 猫();

可以说猫是动物: 动物 animal=new 猫();

这里的猫在不同的时刻表现出来了不同的形态,这就是多态。

多态的前提和体现:

1.有继承/实现关系。

2.有方法重写。

3.有父类引用指向子类对象。

  1. public class Demo {
  2. public static void main(String[] args) {
  3. animal a=new cat();
  4. a.eat();//猫吃鱼
  5. }
  6. }
  7. class animal {
  8. public void eat(){
  9. System.out.println("动物吃东西!");
  10. }
  11. }
  12. class cat extends animal {
  13. @Override
  14. public void eat(){
  15. System.out.println("猫吃鱼!");
  16. }
  17. }

1.2 多态中成员访问特点

成员变量:编译看左边,执行看左边

成员方法:编译看左边,执行看右边

为什么成员变量和成员方法的访问不一样呢?

因为成员方法有重写,而成员变量没有。

1.3 多态的好处和弊端

多态的好处:提高了程序的拓展性。

具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作。

多态的弊端:不能使用子类的特有功能。

  1. public class Demo {
  2. public static void main(String[] args) {
  3. AniamlOperator ao = new AniamlOperator();
  4. cat c = new cat();
  5. // ao.useanimal(c);
  6. ao.useaniaml(c);
  7. dog d = new dog();
  8. // ao.useanimal(d);
  9. ao.useaniaml(d);
  10. }
  11. }
  12. class animal {
  13. public int age = 10;
  14. public void eat() {
  15. System.out.println("动物吃东西!");
  16. }
  17. }
  18. class cat extends animal {
  19. public int age = 18;
  20. public int weight = 10;
  21. @Override
  22. public void eat() {
  23. System.out.println("猫吃鱼!");
  24. }
  25. public void play() {
  26. System.out.println("猫捉老鼠!");
  27. }
  28. }
  29. class dog extends animal {
  30. public void eat() {
  31. System.out.println("狗吃骨头!");
  32. }
  33. }
  34. class AniamlOperator {
  35. public void useanimal(cat c) {
  36. c.eat();
  37. }
  38. public void useanimal(dog d) {
  39. d.eat();
  40. }
  41. public void useaniaml(animal a) {
  42. a.eat();
  43. }
  44. }

1.4 多态的转型

1.向上转型

从子到父,父类引用指向子类对象。

2.向下转型

从父到子,父类引用转为子类对象。

  1. public class Demo {
  2. public static void main(String[] args) {
  3. //多态
  4. animal a = new cat();//向上转型
  5. a.eat();
  6. /*cat c = new cat();
  7. c.eat();
  8. c.play();*/
  9. //向下转型
  10. cat c = (cat) a;
  11. c.eat();
  12. c.play();
  13. }
  14. }
  15. class animal {
  16. public int age = 10;
  17. public void eat() {
  18. System.out.println("动物吃东西!");
  19. }
  20. }
  21. class cat extends animal {
  22. public int age = 18;
  23. public int weight = 10;
  24. @Override
  25. public void eat() {
  26. System.out.println("猫吃鱼!");
  27. }
  28. public void play() {
  29. System.out.println("猫捉老鼠!");
  30. }
  31. }

二:抽象类

2.1 抽象类的概述:

在Java中,一个没有方法体的方法应该定义为抽象方法,二类中如果有抽象方法,该类必须定义为抽象类。

2.2 抽象类的特点 :

  • 抽象类和抽象方法必须使用abstract关键字修饰

public abstract class 类名{}

public abstract void eat();

  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
  • 抽象类不呢实例化

抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态。

  • 抽象类的子类

要么重写抽象类中的所有方法

要么是抽象类

  1. public class Demo {
  2. public static void main(String[] args) {
  3. // animal a=new animal(); 这里报错,因为抽象类不能直接实例化
  4. animal a=new cat();
  5. a.eat();
  6. a.sleep();
  7. }
  8. }
  9. abstract class animal{//抽象类
  10. public abstract void eat();//抽象方法(有抽象方法就一定是抽象类)
  11. public void sleep(){
  12. System.out.println("睡觉");
  13. }
  14. }
  15. class cat extends animal{
  16. @Override
  17. public void eat(){
  18. System.out.println("猫吃鱼");
  19. }
  20. }
  21. abstract class dog extends animal{
  22. public abstract void eat();
  23. }

2.3 抽象类的成员特点

  1. 成员变量:可以是变量,也可以是常量。
  2. 构造方法:有构造方法,但不能实例化(构造方法的作用是什么?用于子类访问父类数据的初始化)
  3. 成员方法:可以有抽象方法(限定子类必须完成某些动作),也可以有非抽象方法(提高代码复用性)

三:接口

3.1 接口的概述:

接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用

Java中的接口更多的体现在对行为的抽象。

3.2 接口的特点

  • 接口用关键字interface修饰:public interface 接口名{}
  • 类实现接口用implements表示:public class类名 implements 接口名{}
  • 接口不能实例化

接口如何实现实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态

多态的形式:具体类多态,抽象类多态接口多态

多态的前提:有继承或者实现关系;有方法重写;有父(类/接口)引用指向(子/实现)类对象

  • 接口的实现类

要么重写接口中的所有抽象方法

要么是抽象类

演示代码:

  1. public class jumpDemo {
  2. public static void main(String[] args) {
  3. jumpping j=new cat();
  4. j.jump();//猫可以跳高了
  5. }
  6. }
  7. interface jumpping{//定义一个接口
  8. public abstract void jump();
  9. }
  10. class cat implements jumpping{
  11. @Override
  12. public void jump(){
  13. System.out.println("猫可以跳高了!");
  14. };
  15. }
  16. abstract class dog implements jumpping{//抽象类,可以不重写方法
  17. }

3.3 接口的成员特点

  • 成员变量:只能是常量,默认修饰符:public static final
  • 构造方法:接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在(一个类如果没有父类,默认继承自Object类)
  • 成员方法:只能是抽象方法,默认修饰符:public abstract

(案例:猫)
watermark_type_d3F5LXplbmhlaQ_shadow_50_text_Q1NETiBASmlhWGluZ05hc2hpc2h1YQ_size_14_color_FFFFFF_t_70_g_se_x_16

  1. public class jumpDemo {
  2. public static void main(String[] args) {
  3. //创建对象,调用方法
  4. jumpping j = new cat();
  5. j.jump();//猫跳高了!!!
  6. // j.eat();//猫吃鱼!!!
  7. System.out.println("-----------");
  8. //创建对象,调用方法
  9. animal a=new cat();
  10. a.setName("小米");
  11. a.setAge(5);
  12. System.out.println(a.getName()+","+a.getAge());
  13. // a.show();//小米,5
  14. a=new cat();
  15. //cat c=new cat("小花",12);
  16. }
  17. }
  18. /*
  19. jumping接口
  20. */
  21. interface jumpping {
  22. public void jump();
  23. // public void eat();
  24. }
  25. /*
  26. 动物类
  27. */
  28. abstract class animal {
  29. private String name;
  30. private int age;
  31. public animal() {
  32. }
  33. public animal(String name, int age) {
  34. this.name = name;
  35. this.age = age;
  36. }
  37. public String getName() {
  38. return name;
  39. }
  40. public void setName(String name) {
  41. this.name = name;
  42. }
  43. public int getAge() {
  44. return age;
  45. }
  46. public void setAge(int age) {
  47. this.age = age;
  48. }
  49. abstract public void eat();
  50. /* public void show() {
  51. System.out.println(name + "," + age);
  52. }*/
  53. }
  54. /*
  55. 猫类
  56. */
  57. class cat extends animal implements jumpping {
  58. public cat() {
  59. }
  60. public cat(String name, int age) {
  61. super(name, age);
  62. }
  63. @Override
  64. public void jump() {
  65. System.out.println("猫跳高了!!!");
  66. }
  67. @Override
  68. public void eat() {
  69. System.out.println("猫吃鱼!!!");
  70. }
  71. }

3.4 类和接口的关系

  • 类和类的关系:继承关系,只能单继承,但是可以多层继承。
  • 类和接口的关系:实现关系,可以单实现,还可以在继承一个类的同时实现多个接口。
  • 接口和接口的关系:继承关系,可以单继承,也可以多继承。

    public interface inter1 {
    }
    interface inter2{

    }
    interface inter3 extends inter1,inter2{
    //接口和接口是继承关系,并且是多继承
    }
    class interimple extends Object implements inter1,inter2,inter3{
    //继承了一个Object类和三个接口
    }

3.5 抽象类和接口的区别

  • 成员区别

抽象类:变量,常量:有构造方法:有抽象方法;也有非抽象方法

接口:常量:抽象方法

  • 关系区别

类与类:继承,单继承

类与接口:实现,可以单实现,也可以多实现

接口与接口:继承,单继承,多继承

  • 设计理念区别

抽象类:对类抽象,包括属性、行为

接口:对行为抽象,主要是行为

(再次强调:抽象类是对事物的抽象,而接口是对行为的抽象。)

(PS:以上图片截至黑马程序员java全套教程)

发表评论

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

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

相关阅读