1. 继承
1.1 继承的概念:
类与类之间存在关系,如父子类关系,子类能够继承父类非私有的成员
1.2 继承的使用条件:
满足is … a,父类又叫超类,基类;子类又叫派生类
1.3 继承的优点:
- 提高了代码的复用率和维护性
- 继承的弊端:提高了类的耦合性
- 开发需要讲究:高内聚,低耦合
1.4 继承中的成员访问特点:
1.4.1 访问成员变量
this指代当前类:调用本类成员,super指代父类: 调用父类成员;
当子父类中出现了重名的成员变量,在使用的时候,会根据就近原则进行使用
1.4.2 访问成员方法
- 子父类中出现了方法声明相同的成员方法,在创建子类对象,并调用方法时,会使用子类的方法逻辑
- 这虽然是就近原则的现象,但其实是子类的方法,对父类的方法,进行了重写
1.4.3 重写(Override):
在继承关系中,出现了一模一样的方法声明,就是子类对父类的方法进行了重写(覆盖)
方法声明相同(方法名,参数,返回类型)
注:父类方法被final,static关键字修饰时不能重写父类的方法
可以校验方法,是否是重写的方法
使用场景:子类并不想原封不动地继承父类的方法,而是想作一定的修改, 就可以使用方法的重写
- 父类方法中执行的内容不能满足子类的需求
- 延续了父类的所具有的功能, 又定义了子类特有的内容
super关键字的用法:super.成员变量,super.方法,super()空参构造,子类构造方法中默认第一行隐藏了super()空参构造
1.5 权限修饰符
权限修饰符 同一个类中 同一个包中 不同包的子类中 不同包的无关类中 private √ 默认(default) √ √ protected √ √ √ public √ √ √ √
1.6 继承中的构造方法执行流程
字节码文件先加载到方法区,运行时main方法入栈,栈内存创建Student对象并在堆内存开辟空间,赋初值,Student构造方法入栈进行赋值,由于Student继承了Person,执行super(name,age),故Person的构造函数也入栈,name、age赋值完成后Person的构造函数弹栈,score赋值完成后Student构造方法弹栈,
stu
在栈中记录堆中开辟空间的地址值,执行实例对象调用的各种get方法。
1.7 this和super
- this: 调用本类成员
- super: 调用父类成员
关键字 访问成员变量 访问成员方法 访问构造方法 this this.本类成员变量 this.本类成员方法() this();this(…);本类构造方法 super super.父类成员变量 super.父类成员方法() super();super(…);父类构造方法 注意: this()和 super()都在争夺构造方法第一行的位置,所以二者不能共存
1.8 继承补充总结
- 继承的格式:public class 子类名 extends 父类名{}
- 范例:
public class Zi extends Fu{}
- 父类又叫超类,基类;子类又叫派生类
- 使用场景:当类与类之间,存在相同 (共性) 的内容,并且产生了 is a 的关系,就可以考虑使用继承,来优化代码。
- 继承中的特点:Java只支持单继承,不支持多继承,但支持多层继承
2. final修饰符
static修饰变量,方法,类
2.1 修饰变量
final修饰的变量称为自定义常量
常量
- 字面量常量: “张三”,‘中’,false,0,0.0,null
- 自定义常量: final int a = 10;
final修饰的变量不能被重新赋值
final修饰成员变量
- 赋值时机
- 可以在定义时赋值
- 可以在构造方法中赋值
基本类型变量:final修饰基本类型变量这个变量为常量,不允许修改,
引用类型变量(final修饰引用类型变量,地址不允许修改,内容可以修改,如数组)
2.2 修饰方法
该方法不能被重写
2.3 修饰类
该类不能被继承
2.4 final修饰符补充总结
3. static 修饰符
3.1 static 修饰的内容及其特点
static可以修饰成员变量(静态变量、类变量)和成员方法(静态方法、类方法)
特点
- 被同一个类的多个对象共享(
JDK8
开始在堆内存中的静态成员变量区,JDK8
之前存储在方法区中)- 多了一种调用方式,可以通过类名调用
- 随着类的加载而加载,优先于对象存在
3.2 static 修饰成员变量场景和内存图(JDK7
之后)
3.3 static修饰成员方法场景和工具类
- 场景: 一个网站需要统计同时在线的人数
- 如果一个类中的方法,功能可以独立存在,并且没有访问非static成员,就可以设计为static方法
- 如
java.lang.Math
工具类
3.4 名词
类变量: static修饰的成员变量
实例变量(对象变量): 非static的成员变量
类方法: static修饰的成员方法
实例方法(对象方法): 非static修饰的成员方法
3.5 static 修饰的成员访问特点
- 静态方法只能访问静态成员
- 实例方法可以访问静态成员,也可以访问实例成员
- 静态方法中不可以出现this关键字
- 以上特点产生根本原因: 静态修饰的内容随着类的加载而加载,优先于对象的存在
3.6 static 修饰符补充总结
4. 代码块
4.1 静态代码块
- 格式: static{ //代码 }
- 特点: 类加载时自动执行, 由于类只会加载一次, 所以静态代码块也只会执行一次
- 作用: 完成类的初始化.
- 场景: 对类变量的初始化赋值
- 例:
public class Demo1 { public static void main(String[] args) { /* Father static Son static Father constructor Son constructor */ new Son(); } } class Father{ //父类静态代码 static { System.out.println("Father static"); } //父类无参构造方法 public Father(){ System.out.println("Father constructor"); } } class Son extends Father{ //子类静态代码 static { System.out.println("Son static"); } //子类无参构造方法 public Son(){ System.out.println("Son constructor"); } }
运行结果:
Father static Son static Father constructor Son constructor
4.2 实例代码块
- 格式: { //代码 }
- 特点: 每次创建对象时, 执行实例代码块, 并在构造器前执行
- 作用: 完成对象的初始化.
- 场景: 构造器中公共的代码抽取到实例代码块中执行
- 例:
public class B { private int num; { System.out.println("通知B对象被创建了~~~~"); } public B() { System.out.println("空参构造器执行了"); } public B(int num) { System.out.println("带参构造器执行了"); this.num = num; } } public class Demo { public static void main(String[] args) { /* 通知B对象被创建了~~~~ 空参构造器执行了 通知B对象被创建了~~~~ 带参构造器执行了 */ B b1 = new B(); B b2 = new B(100); } }
5. jar包和 API
帮助文档(了解)
5.1 自制jar包
- 什么是jar包: 将编译好的class字节码文件,打成压缩包,可以给他人使用
第一步:把工具类的代码,单独写到一个模块中,并添加文档注释
package com.itheima; /** * @auther: Yishooo * @Date: 2023-3-25 - 03 - 25 - 16:30 * @Description: 此工具类提供操作数组的一些常用方法 * @version 1.0 */ public class ArraysUtil { private ArraysUtil(){ } /** * 此方法用于遍历打印数组 * @param arr 存储 int 类型数据的数组 */ public static void printArray(int[] arr){ System.out.print("["); for (int i = 0; i < arr.length-1; i++) { System.out.print(arr[i]+","); } System.out.println(arr[arr.length-1] + "]"); } /** * 此方法用于求数组中元素中的最大值 * @param arr 存储 int 类型数据的数组 * @return 最大值 */ public static int getMax(int[] arr){ int max = arr[0]; for (int i = 0; i < arr.length; i++) { if (arr[i]>max){ max = arr[i]; } } return max; } /** * 此方法用于求数组中所有元素的和 * @param arr 存储 int 类型数据的数组 * @return 和 */ public static int getSum(int[] arr){ int sum = 0; for (int i = 0; i < arr.length; i++) { sum += arr[i]; } return sum; } }