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

相关推荐
九圣残炎9 分钟前
【从零开始的LeetCode-算法】3354. 使数组元素等于零
java·算法·leetcode
寒笙LED15 分钟前
C++详细笔记(六)string库
开发语言·c++·笔记
IT书架21 分钟前
golang面试题
开发语言·后端·golang
初遇你时动了情39 分钟前
uniapp 城市选择插件
开发语言·javascript·uni-app
天天扭码43 分钟前
五天SpringCloud计划——DAY1之mybatis-plus的使用
java·spring cloud·mybatis
程序猿小柒1 小时前
leetcode hot100【LeetCode 4.寻找两个正序数组的中位数】java实现
java·算法·leetcode
不爱学习的YY酱1 小时前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统
zongzi_4942 小时前
二次封装的天气时间日历选择组件
开发语言·javascript·ecmascript
丁总学Java2 小时前
Maven项目打包,com.sun.tools.javac.processing
java·maven
kikyo哎哟喂2 小时前
Java 代理模式详解
java·开发语言·代理模式