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

相关推荐
考虑考虑18 小时前
Jpa使用union all
java·spring boot·后端
用户37215742613519 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊20 小时前
Java学习第22天 - 云原生与容器化
java
渣哥21 小时前
原来 Java 里线程安全集合有这么多种
java
间彧1 天前
Spring Boot集成Spring Security完整指南
java
间彧1 天前
Spring Secutiy基本原理及工作流程
java
Java水解1 天前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆1 天前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学1 天前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole1 天前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端