【学习日记2023.3.25】之 继承_final、static修饰符_代码块_jar包_API帮助文档

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: 调用父类成员
关键字访问成员变量访问成员方法访问构造方法
thisthis.本类成员变量this.本类成员方法()this();this(…);本类构造方法
supersuper.父类成员变量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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值