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

相关推荐
明月看潮生1 分钟前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
雷神乐乐5 分钟前
File.separator与File.separatorChar的区别
java·路径分隔符
小刘|10 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
南宫理的日知录12 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
逊嘘29 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
Half-up32 分钟前
C语言心型代码解析
c语言·开发语言
morris13136 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
Source.Liu1 小时前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust