编程学习
🗒️2019黑马java笔记③
00 分钟
2024-2-26
2024-3-2
type
status
date
slug
summary
tags
category
icon
password

1. 类和对象

1.1 类和对象的理解【理解】

客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。
    • 类的理解
      • 类是对现实生活中一类具有共同属性和行为的事物的抽象
      • 类是对象的数据类型,类是具有相同属性和行为的一组对象的集合
      • 简单理解:类就是对现实事物的一种描述
    • 类的组成
      • 属性:指事物的特征,例如:手机事物(品牌,价格,尺寸)
      • 行为:指事物能执行的操作,例如:手机事物(打电话,发短信)
  • 类和对象的关系
    • 类:类是对现实生活中一类具有共同属性和行为的事物的抽象
    • 对象:是能够看得到摸的着的真实存在的实体
    • 简单理解:类是对事物的一种描述,对象则为具体存在的事物

1.2 类的定义【应用】

类的组成是由属性和行为两部分组成
  • 属性:在类中通过成员变量来体现(类中方法外的变量)
  • 行为:在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)
类的定义步骤:
①定义类
②编写类的成员变量
③编写类的成员方法
示例代码:

1.3 对象的使用【应用】

  • 创建对象的格式:
    • 类名 对象名 = new 类名();
  • 调用成员的格式:
    • 对象名.成员变量
    • 对象名.成员方法();
  • 示例代码

1.4 学生对象-练习【应用】

  • 需求:首先定义一个学生类,然后定义一个学生测试类,在学生测试类中通过对象完成成员变量和成员方法的使用
  • 分析:
    • 成员变量:姓名,年龄…
    • 成员方法:学习,做作业…
  • 示例代码:

2. 对象内存图

2.1 单个对象内存图【理解】

  • 成员变量使用过程
notion image
  • 成员方法调用过程
notion image

2.2 多个对象内存图【理解】

  • 成员变量使用过程
notion image
  • 成员方法调用过程
notion image
  • 总结:
    • 多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份

2.3 多个对象指向相同内存图【理解】

notion image
  • 总结
    • 当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)
      只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。

3. 成员变量和局部变量

3.1 成员变量和局部变量的区别【理解】

  • 类中位置不同:成员变量(类中方法外)局部变量(方法内部或方法声明上)
  • 内存中位置不同:成员变量(堆内存)局部变量(栈内存)
  • 生命周期不同:成员变量(随着对象的存在而存在,随着对象的消失而消失)局部变量(随着方法的调用而存在,醉着方法的调用完毕而消失)
  • 初始化值不同:成员变量(有默认初始化值)局部变量(没有默认初始化值,必须先定义,赋值才能使用)

4. 封装

4.1 private关键字【理解】

private是一个修饰符,可以用来修饰成员(成员变量,成员方法)
  • 被private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
    • 提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
    • 提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰
  • 示例代码:

    4.2 private的使用【应用】

    • 需求:定义标准的学生类,要求name和age使用private修饰,并提供set和get方法以及便于显示数据的show方法,测试类中创建对象并使用,最终控制台输出 林青霞,30
    • 示例代码:

      4.3 this关键字【应用】

      • this修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题)
        • 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
        • 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量

      4.4 this内存原理【理解】

      • this代表当前调用方法的引用,哪个对象调用的方法,this就代表哪一个对象
      • 示例代码:
        • 图解:
          • notion image
            notion image

        4.5 封装思想【理解】

        1. 封装概述 是面向对象三大特征之一(封装,继承,多态) 是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的
        1. 封装原则 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 成员变量private,提供对应的getXxx()/setXxx()方法
        1. 封装好处 通过方法来控制成员变量的操作,提高了代码的安全性 把代码用方法进行封装,提高了代码的复用性

        5. 构造方法

        5.1 构造方法概述【理解】

        构造方法是一种特殊的方法
        • 作用:创建对象 Student stu = new Student();
        • 格式:
          • public class 类名{
            修饰符 类名( 参数 ) {
            }
            }
        • 功能:主要是完成对象数据的初始化
        • 示例代码:

        5.2 构造方法的注意事项【理解】

        • 构造方法的创建
        如果没有定义构造方法,系统将给出一个默认的无参数构造方法 如果定义了构造方法,系统将不再提供默认的构造方法
        • 构造方法的重载
        如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
        • 推荐的使用方式
        无论是否使用,都手工书写无参数构造方法
        • 重要功能!
        可以使用带参构造,为成员变量进行初始化
        • 示例代码

        5.3 标准类制作【应用】

        • 需求:定义标准学生类,要求分别使用空参和有参构造方法创建对象,空参创建的对象通过setXxx赋值,有参创建的对象直接赋值,并通过show方法展示数据。
        • 示例代码:

        1.API

        1.1API概述【理解】

        • 什么是API
          • API (Application Programming Interface) :应用程序编程接口
        • java中的API
          • 指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些API如何使用。

        1.2如何使用API帮助文档【应用】

        • 打开帮助文档
        notion image
        • 找到索引选项卡中的输入框
        notion image
        • 在输入框中输入Random
        notion image
        • 看类在哪个包下
        notion image
        • 看类的描述
        notion image
        • 看构造方法
        notion image
        看成员方法
        notion image

        2.String类

        2.1String类概述【理解】

        String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!

        2.2String类的特点【理解】

        • 字符串不可变,它们的值在创建后不能被更改
        • 虽然 String 的值是不可变的,但是它们可以被共享
        • 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )

        2.3String类的构造方法【记忆】

        • 常用的构造方法
          • 方法名
            说明
            public String()
            创建一个空白字符串对象,不含有任何内容
            public String(char[] chs)
            根据字符数组的内容,来创建字符串对象
            public String(byte[] bys)
            根据字节数组的内容,来创建字符串对象
            String s = “abc”;
            直接赋值的方式创建字符串对象,内容就是abc
        • 示例代码

          2.4创建字符串对象两种方式的区别【理解】

          • 通过构造方法创建
            • 通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
          • 直接赋值方式创建
            • 以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护

          2.5字符串的比较【理解】

          2.5.1==号的作用

          • 比较基本数据类型:比较的是具体的值
          • 比较引用数据类型:比较的是对象地址值

          2.5.2equals方法的作用

          • 方法介绍
            • 示例代码

              2.6用户登录案例【应用】

              2.6.1案例需求

              已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示

              2.6.2代码实现

              2.7遍历字符串案例【应用】

              2.7.1案例需求

              键盘录入一个字符串,使用程序实现在控制台遍历该字符串

              2.7.2代码实现

              2.8统计字符次数案例【应用】

              2.8.1案例需求

              键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)

              2.8.2代码实现

              2.9字符串拼接案例【应用】

              2.9.1案例需求

              定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,
              并在控制台输出结果。例如,数组为 int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]

              2.9.2代码实现

              2.10字符串反转案例【应用】

              2.10.1案例需求

              定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果
              例如,键盘录入 abc,输出结果 cba

              2.10.2代码实现

              2.11帮助文档查看String常用方法【记忆】

              方法名
              说明
              public boolean equals(Object anObject)
              比较字符串的内容,严格区分大小写(用户名和密码)
              public char charAt(int index)
              返回指定索引处的 char 值
              public int length()
              返回此字符串的长度

              3.StringBuilder类

              3.1StringBuilder类概述【理解】

              StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的

              3.2StringBuilder类和String类的区别【理解】

              • String类:内容是不可变的
              • StringBuilder类:内容是可变的

              3.3StringBuilder类的构造方法【记忆】

              • 常用的构造方法
                • 方法名
                  说明
                  public StringBuilder()
                  创建一个空白可变字符串对象,不含有任何内容
                  public StringBuilder(String str)
                  根据字符串的内容,来创建可变字符串对象
              • 示例代码

              3.4StringBuilder类添加和反转方法【记忆】

              • 添加和反转方法
                • 方法名
                  说明
                  public StringBuilder append(任意类型)
                  添加数据,并返回对象本身
                  public StringBuilder reverse()
                  返回相反的字符序列
              • 示例代码

              3.5StringBuilder和String相互转换【应用】

              • StringBuilder转换为String
                • public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String
              • String转换为StringBuilder
                • public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder
              • 示例代码

              3.6字符串拼接升级版案例【应用】

              3.6.1案例需求

              定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,
              并在控制台输出结果。例如,数组为int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]

              3.6.2代码实现

              3.7字符串反转升级版案例【应用】

              3.7.1案例需求

              定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果
              例如,键盘录入abc,输出结果 cba

              3.7.2代码实现

              3.8帮助文档查看StringBuilder常用方法【记忆】

              方法名
              说明
              public StringBuilder append (任意类型)
              添加数据,并返回对象本身
              public StringBuilder reverse()
              返回相反的字符序列
              public int length()
              返回长度,实际存储值
              public String toString()
              通过toString()就可以实现把StringBuilder转换为String

              1.ArrayList

              1.1ArrayList类概述【理解】

              • 什么是集合
                • 提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
              • ArrayList集合的特点
                • 底层是数组实现的,长度可以变化
              • 泛型的使用
                • 用于约束集合中存储元素的数据类型

              1.2ArrayList类常用方法【应用】

              1.2.1构造方法

              方法名
              说明
              public ArrayList()
              创建一个空的集合对象

              1.2.2成员方法

              方法名
              说明
              public boolean remove(Object o)
              删除指定的元素,返回删除是否成功
              public E remove(int index)
              删除指定索引处的元素,返回被删除的元素
              public E set(int index,E element)
              修改指定索引处的元素,返回被修改的元素
              public E get(int index)
              返回指定索引处的元素
              public int size()
              返回集合中的元素的个数
              public boolean add(E e)
              将指定的元素追加到此集合的末尾
              public void add(int index,E element)
              在此集合中的指定位置插入指定的元素

              1.2.3示例代码

              1.3ArrayList存储字符串并遍历【应用】

              1.3.1案例需求

              创建一个存储字符串的集合,存储3个字符串元素,使用程序实现在控制台遍历该集合

              1.3.2代码实现

              1.4ArrayList存储学生对象并遍历【应用】

              1.4.1案例需求

              创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合

              1.4.2代码实现

              1.5ArrayList存储学生对象并遍历升级版【应用】

              1.5.1案例需求

              创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
              学生的姓名和年龄来自于键盘录入

              1.5.2代码实现

              2.学生管理系统

              2.1学生管理系统实现步骤【理解】

              • 案例需求
                • 针对目前我们的所学内容,完成一个综合案例:学生管理系统!该系统主要功能如下:
                  添加学生:通过键盘录入学生信息,添加到集合中
                  删除学生:通过键盘录入要删除学生的学号,将该学生对象从集合中删除
                  修改学生:通过键盘录入要修改学生的学号,将该学生对象其他信息进行修改
                  查看学生:将集合中的学生对象信息进行展示
                  退出系统:结束程序
              • 实现步骤
                  1. 定义学生类,包含以下成员变量
                    1. private String sid // 学生id
                      private String name // 学生姓名
                      private String age // 学生年龄
                      private String address // 学生所在地
                  1. 学生管理系统主界面的搭建步骤
                    1. 2.1 用输出语句完成主界面的编写 2.2 用Scanner实现键盘输入 2.3 用switch语句完成选择的功能 2.4 用循环完成功能结束后再次回到主界面
                  1. 学生管理系统的添加学生功能实现步骤
                    1. 3.1 定义一个方法,接收ArrayList<Student>集合 3.2 方法内完成添加学生的功能 ①键盘录入学生信息 ②根据录入的信息创建学生对象 ③将学生对象添加到集合中 ④提示添加成功信息 3.3 在添加学生的选项里调用添加学生的方法
                  1. 学生管理系统的查看学生功能实现步骤
                    1. 4.1 定义一个方法,接收ArrayList<Student>集合 4.2 方法内遍历集合,将学生信息进行输出 4.3 在查看所有学生选项里调用查看学生方法
                  1. 学生管理系统的删除学生功能实现步骤
                    1. 5.1 定义一个方法,接收ArrayList<Student>集合 5.2 方法中接收要删除学生的学号 5.3 遍历集合,获取每个学生对象 5.4 使用学生对象的学号和录入的要删除的学号进行比较,如果相同,则将当前学生对象从集合中删除 5.5 在删除学生选项里调用删除学生的方法
                  1. 学生管理系统的修改学生功能实现步骤
                    1. 6.1 定义一个方法,接收ArrayList<Student>集合 6.2 方法中接收要修改学生的学号 6.3 通过键盘录入学生对象所需的信息,并创建对象 6.4 遍历集合,获取每一个学生对象。并和录入的修改学生学号进行比较.如果相同,则使用新学生对象替换当前学生对象 6.5 在修改学生选项里调用修改学生的方法
                  1. 退出系统
                    1. 使用System.exit(0);退出JVM

              2.2学生类的定义【应用】

              2.3测试类的定义【应用】

              1. 继承

              1.1 继承的实现(掌握)

              • 继承的概念
                • 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法
              • 实现继承的格式
                • 继承通过extends实现
                • 格式:class 子类 extends 父类 { }
                  • 举例:class Dog extends Animal { }
              • 继承带来的好处
                • 继承可以让类与类之间产生关系,子父类关系,产生子父类后,子类则可以使用父类中非私有的成员。
              • 示例代码

                1.2 继承的好处和弊端(理解)

                • 继承好处
                  • 提高了代码的复用性(多个类相同的成员可以放到同一个类中)
                  • 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
                • 继承弊端
                  • 继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
                • 继承的应用场景:
                  • 使用继承,需要考虑类与类之间是否存在is..a的关系,不能盲目使用继承
                    • is..a的关系:谁是谁的一种,例如:老师和学生是人的一种,那人就是父类,学生和老师就是子类

                2. 继承中的成员访问特点

                2.1 继承中变量的访问特点(掌握)

                在子类方法中访问一个变量,采用的是就近原则。
                1. 子类局部范围找
                1. 子类成员范围找
                1. 父类成员范围找
                1. 如果都没有就报错(不考虑父亲的父亲…)
                • 示例代码

                  2.2 super(掌握)

                  • this&super关键字:
                    • this:代表本类对象的引用
                    • super:代表父类存储空间的标识(可以理解为父类对象引用)
                  • this和super的使用分别
                    • 成员变量:
                      • this.成员变量 - 访问本类成员变量
                      • super.成员变量 - 访问父类成员变量
                    • 成员方法:
                      • this.成员方法 - 访问本类成员方法
                      • super.成员方法 - 访问父类成员方法
                  • 构造方法:
                    • this(…) - 访问本类构造方法
                    • super(…) - 访问父类构造方法

                  2.3 继承中构造方法的访问特点(理解)

                  注意:子类中所有的构造方法默认都会访问父类中无参的构造方法
                  子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化,原因在于,每一个子类构造方法的第一条语句默认都是:super()
                  问题:如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?
                  推荐方案:
                  自己给出无参构造方法

                  2.4 继承中成员方法的访问特点(掌握)

                  通过子类对象访问一个方法
                  1. 子类成员范围找
                  1. 父类成员范围找
                  1. 如果都没有就报错(不考虑父亲的父亲…)

                  2.5 super内存图(理解)

                  • 对象在堆内存中,会单独存在一块super区域,用来存放父类的数据
                    • notion image

                  2.6 方法重写(掌握)

                  • 1、方法重写概念
                    • 子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)
                  • 2、方法重写的应用场景
                    • 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
                  • 3、Override注解
                    • 用来检测当前的方法,是否是重写的方法,起到【校验】的作用

                  2.7 方法重写的注意事项(掌握)

                  • 方法重写的注意事项
                  1. 私有方法不能被重写(父类私有成员子类是不能继承的)
                  1. 子类方法访问权限不能更低(public > 默认 > 私有)
                  • 示例代码

                  2.8. Java中继承的注意事项(掌握)

                  • Java中继承的注意事项
                      1. Java中类只支持单继承,不支持多继承
                          • 错误范例:class A extends B, C { }
                      1. Java中类支持多层继承
                  • 多层继承示例代码:

                    3. 继承练习

                    3.1 老师和学生(应用)

                    • 需求:定义老师类和学生类,然后写代码测试;最后找到老师类和学生类当中的共性内容,抽取出一个父类,用继承的方式改写代码,并进行测试
                    • 步骤:
                      • ①定义老师类(姓名,年龄,教书())
                        ②定义学生类(姓名,年龄,学习())
                        ③定义测试类,写代码测试
                        ④共性抽取父类,定义人类(姓名,年龄)
                        ⑤定义老师类,继承人类,并给出自己特有方法:教书()
                        ⑥定义学生类,继承人类,并给出自己特有方法:学习()
                        ⑦定义测试类,写代码测试
                    • 示例代码:

                      3.2 猫和狗( 应用)

                      • 需求:请采用继承的思想实现猫和狗的案例,并在测试类中进行测试
                      • 分析:
                        • ①猫:
                          成员变量:姓名,年龄
                          构造方法:无参,带参
                          成员方法:get/set方法,抓老鼠()
                          ②狗:
                          成员变量:姓名,年龄
                          构造方法:无参,带参
                          成员方法:get/set方法,看门()
                          ③共性:
                          成员变量:姓名,年龄;构造方法:无参,带参;成员方法:get/set方法
                      • 步骤:
                        • 1、定义动物类(Animal)
                          【成员变量:姓名,年龄】【 构造方法:无参,带参】【成员方法:get/set方法】
                          2、定义猫类(Cat),继承动物类
                          【构造方法:无参,带参】【成员方法:抓老鼠() 】
                          3、定义狗类(Dog),继承动物类
                          【构造方法:无参,带参】【成员方法:看门() 】
                          4、定义测试类(AnimalDemo),写代码测试
                      • 示例代码:

                        4. 修饰符

                        4.1 package(了解)

                        • 1、包的概念
                          • 包就是文件夹,用来管理类文件的
                        • 2、包的定义格式
                          • package 包名; (多级包用.分开)
                          • 例如:package com.heima.demo;
                        • 3、带包编译&带包运行
                          • 带包编译:javac –d . 类名.java
                            • 例如:javac -d . com.heima.demo.HelloWorld.java
                          • 带包运行:java 包名+类名
                            • 例如:java com.heima.demo.HelloWorld

                        4.2 import(理解)

                        • 导包的意义
                          • 使用不同包下的类时,使用的时候要写类的全路径,写起来太麻烦了
                            为了简化带包的操作,Java就提供了导包的功能
                        • 导包的格式
                          • 格式:import 包名;
                            范例:import java.util.Scanner;
                        • 示例代码(没有使用导包,创建的Scanner对象)
                        • 示例代码(使用导包后,创建的Scanner对象)

                        4.3 权限修饰符(理解)

                        notion image

                        4.4 final(应用)

                        • fianl关键字的作用
                          • final代表最终的意思,可以修饰成员方法,成员变量,类
                        • final修饰类、方法、变量的效果
                          • fianl修饰类:该类不能被继承(不能有子类,但是可以有父类)
                          • final修饰方法:该方法不能被重写
                          • final修饰变量:表明该变量是一个常量,不能再次赋值

                        4.5 final修饰局部变量(理解)

                        • fianl修饰基本数据类型变量
                          • final 修饰指的是基本类型的数据值不能发生改变
                        • final修饰引用数据类型变量
                          • final 修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的
                          • 举例:

                          4.6 static(应用)

                          • static的概念
                            • static关键字是静态的意思,可以修饰【成员方法】,【成员变量】
                          • static修饰的特点
                              1. 被类的所有对象共享,这也是我们判断是否使用静态关键字的条件
                              1. 可以通过类名调用当然,也可以通过对象名调用【推荐使用类名调用】
                          • 示例代码:

                          4.7 static访问特点(掌握)

                          • static的访问特点
                            • 非静态的成员方法
                              • 能访问静态的成员变量
                              • 能访问非静态的成员变量
                              • 能访问静态的成员方法
                              • 能访问非静态的成员方法
                            • 静态的成员方法
                              • 能访问静态的成员变量
                              • 能访问静态的成员方法
                            • 总结成一句话就是:
                              • 静态成员方法只能访问静态成员

                          1.多态

                          1.1多态的概述(记忆)

                          • 什么是多态
                            • 同一个对象,在不同时刻表现出来的不同形态
                          • 多态的前提
                            • 要有继承或实现关系
                            • 要有方法的重写
                            • 要有父类引用指向子类对象

                          1.2多态中的成员访问特点(记忆)

                          • 成员访问特点
                            • 成员变量
                              • 编译看父类,运行看父类
                            • 成员方法
                              • 编译看父类,运行看子类
                          • 代码演示
                            • 动物类
                              • 猫类
                                • 测试类

                                1.3多态的好处和弊端(记忆)

                                • 好处
                                  • 提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
                                • 弊端
                                  • 不能使用子类的特有成员

                                1.4多态中的转型(应用)

                                • 向上转型
                                  • 父类引用指向子类对象就是向上转型
                                • 向下转型
                                  • 格式:子类型 对象名 = (子类型)父类引用;
                                • 代码演示
                                  • 动物类
                                  • 猫类
                                  • 测试类

                                1.5多态的案例(应用)

                                • 案例需求
                                  • 请采用多态的思想实现猫和狗的案例,并在测试类中进行测试
                                • 代码实现
                                  • 动物类
                                  • 猫类
                                  • 狗类
                                  • 测试类

                                2.抽象类

                                2.1抽象类的概述(理解)

                                当我们在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了!
                                在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类!

                                2.2抽象类的特点(记忆)

                                • 抽象类和抽象方法必须使用 abstract 关键字修饰
                                  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
                                  • 抽象类不能实例化
                                    • 抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态
                                  • 抽象类的子类
                                    • 要么重写抽象类中的所有抽象方法
                                      要么是抽象类

                                  2.3抽象类的成员特点(记忆)

                                  • 成员的特点
                                    • 成员变量
                                      • 既可以是变量
                                      • 也可以是常量
                                    • 构造方法
                                      • 空参构造
                                      • 有参构造
                                    • 成员方法
                                      • 抽象方法
                                      • 普通方法
                                  • 代码演示
                                    • 动物类
                                    • 猫类
                                    • 测试类

                                  2.4抽象类的案例(应用)

                                  • 案例需求
                                    • 请采用抽象类的思想实现猫和狗的案例,并在测试类中进行测试
                                  • 代码实现
                                    • 动物类
                                    • 猫类
                                    • 狗类
                                    • 测试类

                                  3.接口

                                  3.1接口的概述(理解)

                                  接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
                                  Java中的接口更多的体现在对行为的抽象!

                                  3.2接口的特点(记忆)

                                  • 接口用关键字interface修饰
                                    • 类实现接口用implements表示
                                      • 接口不能实例化
                                        • 接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态。
                                          多态的形式:具体类多态,抽象类多态,接口多态。
                                      • 接口的子类
                                        • 要么重写接口中的所有抽象方法
                                          要么子类也是抽象类

                                      3.3接口的成员特点(记忆)

                                      • 成员特点
                                        • 成员变量
                                          • 只能是常量 默认修饰符:public static final
                                        • 构造方法
                                          • 没有,因为接口主要是扩展功能的,而没有具体存在
                                        • 成员方法
                                          • 只能是抽象方法
                                            默认修饰符:public abstract
                                            关于接口中的方法,JDK8和JDK9中有一些新特性,后面再讲解
                                      • 代码演示
                                        • 接口
                                        • 实现类
                                        • 测试类

                                      3.4接口的案例(应用)

                                      • 案例需求
                                        • 对猫和狗进行训练,他们就可以跳高了,这里加入跳高功能。
                                          请采用抽象类和接口来实现猫狗案例,并在测试类中进行测试。
                                      • 代码实现
                                        • 动物类
                                        • 跳高接口
                                        • 猫类
                                        • 测试类

                                      3.5类和接口的关系(记忆)

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

                                      3.6抽象类和接口的区别(记忆)

                                      • 成员区别
                                        • 抽象类
                                          • 变量,常量;有构造方法;有抽象方法,也有非抽象方法
                                        • 接口
                                          • 常量;抽象方法
                                      • 关系区别
                                        • 类与类
                                          • 继承,单继承
                                        • 类与接口
                                          • 实现,可以单实现,也可以多实现
                                        • 接口与接口
                                          • 继承,单继承,多继承
                                      • 设计理念区别
                                        • 抽象类
                                          • 对类抽象,包括属性、行为
                                        • 接口
                                          • 对行为抽象,主要是行为

                                      4.综合案例

                                      4.1案例需求(理解)

                                      我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。
                                      为了出国交流,跟乒乓球相关的人员都需要学习英语。
                                      请用所学知识分析,这个案例中有哪些具体类,哪些抽象类,哪些接口,并用代码实现。
                                      notion image

                                      4.2代码实现(应用)

                                      • 抽象人类
                                      • 抽象运动员类
                                      • 抽象教练类
                                      • 学英语接口
                                      • 蓝球教练
                                      • 乒乓球教练
                                      • 乒乓球运动员
                                      • 篮球运动员

                                      1. 参数传递

                                      1.1 类名作为形参和返回值(应用)

                                      • 1、类名作为方法的形参
                                        • 方法的形参是类名,其实需要的是该类的对象
                                          实际传递的是该对象的【地址值】
                                      • 2、类名作为方法的返回值
                                        • 方法的返回值是类名,其实返回的是该类的对象
                                          实际传递的,也是该对象的【地址值】
                                      • 示例代码:

                                        1.2 抽象类作为形参和返回值(理解)

                                        • 抽象类作为形参和返回值
                                          • 方法的形参是抽象类名,其实需要的是该抽象类的子类对象
                                          • 方法的返回值是抽象类名,其实返回的是该抽象类的子类对象
                                        • 示例代码:

                                          1.3 接口名作为形参和返回值(理解)

                                          • 接口作为形参和返回值
                                            • 方法的形参是接口名,其实需要的是该接口的实现类对象
                                            • 方法的返回值是接口名,其实返回的是该接口的实现类对象
                                          • 示例代码:

                                            2. 内部类

                                            2.1 内部类的基本使用(理解)

                                            • 内部类概念
                                              • 在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类
                                            • 内部类定义格式
                                              • 格式&举例:
                                              • 内部类的访问特点
                                                • 内部类可以直接访问外部类的成员,包括私有
                                                • 外部类要访问内部类的成员,必须创建对象
                                              • 示例代码:

                                                2.2 成员内部类(理解)

                                                • 成员内部类的定义位置
                                                  • 在类中方法,跟成员变量是一个位置
                                                • 外界创建成员内部类格式
                                                  • 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
                                                  • 举例:Outer.Inner oi = new Outer().new Inner();
                                                • 成员内部类的推荐使用方案
                                                  • 将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。
                                                • 示例代码:

                                                  2.3 局部内部类(理解)

                                                  • 局部内部类定义位置
                                                    • 局部内部类是在方法中定义的类
                                                  • 局部内部类方式方式
                                                    • 局部内部类,外界是无法直接使用,需要在方法内部创建对象并使用
                                                    • 该类可以直接访问外部类的成员,也可以访问方法内的局部变量
                                                  • 示例代码

                                                    2.4 匿名内部类(应用)

                                                    • 匿名内部类的前提
                                                      • 存在一个类或者接口,这里的类可以是具体类也可以是抽象类
                                                    • 匿名内部类的格式
                                                      • 格式:new 类名 ( ) { 重写方法 } new 接口名 ( ) { 重写方法 }
                                                      • 举例:
                                                      • 匿名内部类的本质
                                                        • 本质:是一个继承了该类或者实现了该接口的子类匿名对象
                                                      • 匿名内部类的细节
                                                        • 匿名内部类可以通过多态的形式接受
                                                        • 匿名内部类直接调用方法

                                                          2.4 匿名内部类在开发中的使用(应用)

                                                          • 匿名内部类在开发中的使用
                                                            • 当发现某个方法需要,接口或抽象类的子类对象,我们就可以传递一个匿名内部类过去,来简化传统的代码
                                                          • 示例代码:

                                                            3. 常用API

                                                            3.1 Math(应用)

                                                            • 1、Math类概述
                                                              • Math 包含执行基本数字运算的方法
                                                            • 2、Math中方法的调用方式
                                                              • Math类中无构造方法,但内部的方法都是静态的,则可以通过 类名.进行调用
                                                            • 3、Math类的常用方法
                                                              • 方法名 方法名
                                                                说明
                                                                public static int abs(int a)
                                                                返回参数的绝对值
                                                                public static double ceil(double a)
                                                                返回大于或等于参数的最小double值,等于一个整数
                                                                public static double floor(double a)
                                                                返回小于或等于参数的最大double值,等于一个整数
                                                                public static int round(float a)
                                                                按照四舍五入返回最接近参数的int
                                                                public static int max(int a,int b)
                                                                返回两个int值中的较大值
                                                                public static int min(int a,int b)
                                                                返回两个int值中的较小值
                                                                public static double pow (double a,double b)
                                                                返回a的b次幂的值
                                                                public static double random()
                                                                返回值为double的正值,[0.0,1.0)

                                                            3.2 System(应用)

                                                            • System类的常用方法
                                                            方法名
                                                            说明
                                                            public static void exit(int status)
                                                            终止当前运行的 Java 虚拟机,非零表示异常终止
                                                            public static long currentTimeMillis()
                                                            返回当前时间(以毫秒为单位)
                                                            • 示例代码
                                                              • 需求:在控制台输出1-10000,计算这段代码执行了多少毫秒

                                                            3.3 Object类的toString方法(应用)

                                                            • Object类概述
                                                              • Object 是类层次结构的根,每个类都可以将 Object 作为超类。所有类都直接或者间接的继承自该类,换句话说,该类所具备的方法,所有类都会有一份
                                                            • 查看方法源码的方式
                                                              • 选中方法,按下Ctrl + B
                                                            • 重写toString方法的方式
                                                              • Alt + Insert 选择toString
                                                              • 在类的空白区域,右键 -> Generate -> 选择toString
                                                            • toString方法的作用:
                                                              • 以良好的格式,更方便的展示对象中的属性值
                                                            • 示例代码:
                                                              • 运行结果:

                                                                3.4 Object类的equals方法(应用)

                                                                • equals方法的作用
                                                                  • 用于对象之间的比较,返回true和false的结果
                                                                  • 举例:s1.equals(s2); s1和s2是两个对象
                                                                • 重写equals方法的场景
                                                                  • 不希望比较对象的地址值,想要结合对象属性进行比较的时候。
                                                                • 重写equals方法的方式
                                                                  • alt + insert 选择equals() and hashCode(),IntelliJ Default,一路next,finish即可
                                                                  • 在类的空白区域,右键 -> Generate -> 选择equals() and hashCode(),后面的同上。
                                                                • 示例代码:

                                                                  3.5 冒泡排序原理(理解)

                                                                  • 冒泡排序概述
                                                                    • 一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序
                                                                  • 如果有n个数据进行排序,总共需要比较n-1次
                                                                  • 每一次比较完毕,下一次的比较就会少一个数据参与

                                                                  3.6 冒泡排序代码实现(理解)

                                                                  • 代码实现

                                                                  3.7 Arrays(应用)

                                                                  • Arrays的常用方法
                                                                    • 方法名
                                                                      说明
                                                                      public static String toString(int[] a)
                                                                      返回指定数组的内容的字符串表示形式
                                                                      public static void sort(int[] a)
                                                                      按照数字顺序排列指定的数组
                                                                  • 工具类设计思想
                                                                    • 1、构造方法用 private 修饰
                                                                      2、成员用 public static 修饰