Java基础-面向对象进阶-static,继承

Java基础-面向对象进阶-static,继承

static

静态变量

  • 特点:
    • 被该类所有对象共享
    • 不属于对象, 属于类
    • 随着类的加载而加载, 优先于对象存在
  • 调用方式:
    • 类名调用(推荐)
    • 对象名调用

静态方法和工具类

  • 特点:
    • 多用在测试类和工具类中
    • JavaBean类中很少会用
  • 调用方式:
    • 类名调用(推荐)
    • 对象名调用
java 复制代码
// 数组工具类
import java.util.StringJoiner;

public class ArrayUtil {
    private ArrayUtil(){}

    public static String printArr(int[] nums) {
        StringJoiner sj = new StringJoiner(", ", "[", "]");
        for (int i = 0; i < nums.length; i++) {
            sj.add(nums[i]+"");
        }
        return sj.toString();
    }

    public static double getAerage(double[] nums){
        double ret = 0;
        for (int i = 0; i < nums.length; i++) {
            ret += nums[i];
        }
        return ret/nums.length;
    }
}

// 学生工具类
import java.util.ArrayList;

public class StudentUtil {
    private StudentUtil(){}

    public static int getMaxAge(ArrayList<Student> students){
        int ret = 0;
        for (int i = 0; i < students.size(); i++) {
            ret = Math.max(ret, students.get(i).getAge());
        }
        return ret;
    }
}

static的注意事项

  • 静态方法中, 只能访问静态
  • 非静态方法可以访问所有方法
  • 静态方法中没有this关键字

重新认识main方法

  • public: 被JVM调用, 访问权限要足够大
  • static:
    • 被JVM调用, 不用创建对象, 直接类名访问
    • 因为main方法是静态的, 所有测试类中其他方法也需要是静态的
  • void: 被JVM调用, 不需要给JVM返回值
  • main: 一个通用的名称, 虽然不是关键字, 但是被JVM识别
  • String\[\] args: 以前用于接收键盘录入数据, 现在没用

继承

继承的概述

  • 什么是继承、继承的好处
    继承是面向对象三大特征之一,可以让类跟类之间产生子父的关系。
    可以把多个子类中重复的代码抽取到父类中,子类可以直接使用,减少代码冗余,提高代码的复用性

  • 继承的格式

    java 复制代码
    public class 子类 extends 父类 
  • 继承后子类的特点
    子类可以得到父类的属性和行为,子类可以使用子类可以在父类的基础上新增其他功能,子类更强大

继承的特点

  • Java只能单继承: 一个类只能继承一个直接父类
  • Java不支持多继承, 但是支持多层继承
  • Java中所有的类都直接或者间接继承于Object类
  • 子类只能访问父类中非私有的成员

子类继承的内容

  • 父类的构造方法不能被子类继承
  • 父类的成员变量都能被子类继承, 但是私有的成员变量不能被调用
  • 父类的成员方法在虚方法表中的能继承, 不在的不能继承(虚方法指的是非private, 非static, 非final)

子类继承内容的访问特点

成员变量访问特点

  • 就近原则: 先在局部位置找, 本来成员位置找, 父类成员位置找, 逐级往上
  • 成员变量重名
    • name: 从局部位置往上找
    • this.name: 从本类成员位置往上找
    • super.name: 从父类成员位置往上找
java 复制代码
public class demo {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.show();
    }
}

class Fu{
    String name = "Fu";
    String hobby = "喝茶";
}

class Zi extends Fu{
    String name = "Zi";
    String game = "吃鸡";

    public void show(){
        // 打印Zi
        System.out.println(name);
        System.out.println(this.name);
        // 打印Fu
        System.out.println(super.name);
        // 打印喝茶
        System.out.println(hobby);
        System.out.println(this.hobby);
        System.out.println(super.hobby);
        // 打印吃鸡
        System.out.println(game);
        System.out.println(this.game);
    }
}

成员方法访问特点

  • 成员方法访问特点 同 成员变量访问特点
  • 方法重写注意事项和要求
    • @Override: 校验重写是否正确, 同时可读性好
    • 重写方法的名称、形参列表必须与父类中的一致。
    • 子类重写父类方法时,访问权限子类必须大于等于父类 (暂时了解:空着不写< protected< public)
    • 子类重写父类方法时,返回值类型子类必须小于等于父类
    • 建议:重写的方法尽量和父类保持一致。
    • 只有被添加到虚方法表中的方法才能被重写

构造方法访问特点

  • 子类不能继承父类的构造方法, 但是可以通过super调用
  • 子类构造方法的第一行, 有一个默认的super()
  • 默认先访问父类中无参的构造方法, 再执行自己
  • 如果想访问父类有参构造, 必须手动书写

来源

黑马程序员. 阿玮Java零基础

Gitee地址

https://gitee.com/yu-ba-ba-ba/awJava

相关推荐
码匠许师傅10 小时前
【C++三方组件】mbedTLS:面向嵌入式的轻量 TLS
开发语言·c++
云和数据.ChenGuang10 小时前
光哥说Python 异常深度解析:从异常模型到工程化实践
java·前端·人工智能·python·langchain
迪菲赫尔曼10 小时前
【基础篇 12】把环境与源码接起来:检查 GPU,再安装服务器上的项目
运维·服务器·开发语言·人工智能·python·yolo·目标检测
SL_staff10 小时前
APS动态重排实践:在多品种小批量场景下实现5分钟插单响应
java·开源·产品
2601_9628857210 小时前
2026 Python 股票数据接口选型指南(横评 + 决策树)
开发语言·python·区块链
captain37611 小时前
Spring MVC(4)-响应
java·spring boot·后端
Evand J11 小时前
【PMSM例程4】PMSM电阻辨识与模型补偿EKF,MATLAB例程。附下载链接,包运行成功
开发语言·matlab·电机·ekf·卡尔曼·pmsm
王仔小奶11 小时前
Rust 正在接管金融圈?深度拆解一份高薪 FinTech 岗位 JD
开发语言·金融·rust
小王C语言11 小时前
Qt常用控件:多元素控件,纵向列表,表格控件,树状控件
开发语言·qt
fanruitian11 小时前
python 可视化 panda seaborn matplotlib.pyplot
开发语言·python·matplotlib