[Java]面向对象-static继承

news2024/11/14 20:11:54

Static

static表示静态,是Java中的一个修饰符,可以修饰成员方法、成员变量

静态变量:

被static修饰的成员变量,叫静态变量

特点: 被该类所有对象共享

调用方式:1.类名调用 2.对象名调用

静态方法:

被static修饰的成员方法,叫静态方法

特点:多用于测试类和工具类中 Javabean类很少使用

调用方式:在本类中:直接调用          在其他类中:1.类名调用 2.对象名调用

工具类:帮我们最一些事情,但不描述任何事物的类

JavaBean描述一类事物的类
测试类检查其他的类是否书写正确,带有main方法,是程序的入口
工具类不描述事物,帮我们做事的类
工具类: 
  1. 类名见名之意
  2. 私有化构造方法

exp1:

编写一个数组的工具类:ArrUtil

  • 提供一个工具方法printArr方法,用于返回整数数组的内容。
  • 提供一个工具方法getAerage方法,用于返回平均分。
  • 定义一个测试类,调用工具类中的方法。

工具类:

public class ArrUtil {
    private ArrUtil(){

    }

    public static void printArr(int[] arr){
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length-1){
                System.out.print(arr[i]);
            }else{
                System.out.print(arr[i]+",");
            }
        }
        System.out.print("]");
    }
    public static double aervge(int[] arr){
        int sum = 0;
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            sum = sum+arr[i];
            count++;
        }
        return sum/count;
    }
}

测试:

public class ArrUtilTest {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,7,9};
        ArrUtil.printArr(arr);
        System.out.println("平均数为:"+ArrUtil.aervge(arr));
    }
}

static内存图:

静态变量优先于对象出现,是随着类的加载而加载的

static不属于对象

那些属性可以用static修饰:共享的属性 

Static注意事项:
  • 静态方法只能访问静态变量和静态方法
  • 非静态方法可以访问所有
  • 静态方法没有this关键字
Main方法:
public static void main(String[] args){}

public:被JVM调用,权限足够大

static:被JVM调用,不用创建对象,直接类名访问

            因为main方法是静态的,所以测试类中其他的方法也需要是静态的

void:JVM调用,不需要给虚拟机返回值

mian:通用名称,但被JVM识别

String[] args:以前用于接收键盘录入数据,现在没用

继承

假如我们要定义如下类: 学生类,老师类和工人类,分析如下。

  1. 学生类 属性:姓名,年龄 行为:吃饭,睡觉

  2. 老师类 属性:姓名,年龄,薪水 行为:吃饭,睡觉,教书

  3. 班主任 属性:姓名,年龄,薪水 行为:吃饭,睡觉,管理

 

如果我们定义了这三个类去开发一个系统,那么这三个类中就存在大量重复的信息(属性:姓名,年龄。行为:吃饭,睡觉)。假如多个类中存在相同属性和行为时,我们可以将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。

extends关键字:

Java中使用extends关键字可以让一个类和另一个类建立继承关系

class 父类 {
    ...
}

class 子类 extends 父类 {
    ...
}

public calss student extends person{}

student称为:子类 person称为:父类

继承的好处:
  1. 提高代码的复用性(减少代码冗余,相同代码重复利用)。

  2. 使类与类之间产生了关系。

  3. 在父类的基础上增加其他功能,使子类更加的强大

当类与类之间存在相同的内容,并满足子类是父类中的一种,就可以考虑继承优化代码

继承的特点:

Java只支持单继承,不支持多继承,但支持多层继承

单继承:一个子类只能继承一个父类

不支持多继承:子类不能同时继承多个父类

多次继承:c继承b,b继承a。a是b及直接父类,a是c的间接父类

每一个类都直接或者间接的继承于Object类

当父类的方法被private修饰时:子类就无法访问只能在本类中访问

why?若子类继承俩个父类,若两个父类中有相同名称的方法,子类调用父类的方法就会出错

子类能继承父类的内容:

构造方法:不能

成员变量:若父类成员变量被private修饰,子类不可调用(但是可以继承,不能直接的调用),反之则可

成员方法:JVM会从最顶级父类设置一个虚方法表 将经常使用的方法抽取出来,不被static private final修饰的方法。在子类中会在父类的虚方法表上添加自己的虚方法。只有父类的虚方法才能被子类继承

继承中的访问:
成员变量

this调用:就近原则

super调用:直接找父类

就近原则---谁离我近,我就用谁(先在本类中找,如果没有就在父类中找。若出现重名的若要访问本类中的就添加this关键字,若访问父类就加super关键字

public class test1 {
    public static void main(String[] args) {
        zi zi = new zi();
        zi.zishow();
    }
}
class Fu{
    String name = "Fu";
}
class zi extends Fu{
    String name = "zi";

    public void zishow(){
        System.out.println(name);//zi
        System.out.println(this.name);//zi
        System.out.println(super.name);//fu
    }
}
成员方法:

直接调用满足就近原则:谁离我近,我就用谁

public class Test2 {
    public static void main(String[] args) {
        S s = new S();
        s.test();
    }
}

class P{

    public void eat(){
        System.out.println("eat p");
    }

    public void sleep(){
        System.out.println("sleep");}
}

class S extends P{
    public void test(){
        eat();
        super.eat();
    }

    public void eat(){
        System.out.println("eat s");
    }
}
构造方法: 
  • 构造方法不会被子类继承
  • 子类中所有的构造方法默认先访问父类中的无参构造,再执行自己

why?

1.子类在初始化时,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据

2.子类初始化之前,一定要调用父类构造方法先完成父类数据空间初始化

怎么调用父类构造方法? 

1.子类构造方法的第一行语句默认都是:super()-调用父类无参构造,不写也存在,且必须在第一行 

2.若想调用父类有参构造,必须手写super进行调用

 方法重写:

当父类的方法不能满足子类的需求时,需要进行方法的重写

书写格式:在继承体系中,子类出现了和父类中一模一样的方法申明,就称子类中的这个方法为重写方法

@Override重写注解

@Override 方法重写时写在方法上面,校验子类重写时语法是否正确

加上注解后若有红色波浪线表示语法错误

建议重写方法都加@Override注解,代码优雅安全

子类覆盖了从父类继承的虚方法表中的方法

注: 
  1. 重写方法的名称,形参列表必须与父类一致
  2. 子类重写父类方法时,访问权限子类必须大于父类
  3. 子类重写父类方法时,返回值类型子类必须小于等于父类
  4. 私有方法不能被重写
  5. 子类不能重写父类的静态方法,若重写会报错

重写方法尽量和父类保持一致

只有能被添加到虚方法表的方法才能被重写

class P{

    public void eat(){
        System.out.println("eat p");
    }

    public void sleep(){
        System.out.println("sleep");}
}

class S extends P{
    public void test(){
        eat();
        super.eat();
    }

    public void eat(){
        System.out.println("eat s");
    }
    @Override
    public void sleep(){
        System.out.println("睡觉觉咯");
    }
}
this&super
thissuper
理解为一个变量,表示当前方法调用者的地址值代表父类存储空间
this(...)访问本类构造方法\本类其他构造方法(有参构造)super(...)访问父类构造方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1996765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyFluent入门之旅(8) PyFluent API 分类与区别

PyFluent提供了两种主要的API来与Ansys Fluent进行交互&#xff1a; Settings APITUI API 通过这两种接口方式&#xff0c;可以控制 Ansys Fluent 的各个方面&#xff0c;包括从网格生成到后处理的所有操作。 分类 Settings API pyFluent 的 Settings API类似于 Ansys Flu…

线性表——数据结构

线性表 文章目录 线性表线性表的定义和基本操作线性表的定义线性表的基本操作 线性表的顺序表示顺序表的定义顺序表的实现——静态分配顺序表的实现——动态分配顺序表的特点 线性表的定义和基本操作 线性表的定义 线性表&#xff08;Linear List&#xff09;的定义 ​ 线性…

略谈set与map的pair封装与进入哈希

引子&#xff1a;之前我们讲了红黑树的自实现&#xff0c;与小小的接口实现&#xff0c;那set与map的pair封装是如何实现的呢&#xff1f;&#xff0c;今天我们来一探究竟&#xff0c;而且我们也要进入新章节--哈希 对于operator--()的封装&#xff1a; 注意&#xff1a;牢记思…

动手学深度学习V2每日笔记(批量归一化、ResNet)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1Uv411G71b/spm_id_fromautoNext&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d https://cv.gluon.ai/model_zoo/classification.html 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不…

【OpenHarmony】openharmony移植到RK3568------搭建开发环境

一、关于OpenHarmony OpenHarmony是由开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目&#xff0c;目标是面向全场景、全连接、全智能时代&#xff0c;基于开源的方式&#xff0c;搭建一个智能终端设备操作系统的框架和平台&#xff0c;促…

各种高端链游 区块链游戏 休闲小游戏DAPP开发

【西游闯关】-高端区块链3D手游 【我朝有马】-高端区块链3D手游 【弹弹岛2】-高端区块链3D手游

FiddlerCharles请求包导入Postman教程

前言 晓杰因开发需要经常需要使用抓包工具进行抓包然后使用POSTMAN测试&#xff0c;每次复制都很麻烦&#xff0c;就想着如何直接抓包工具中导出&#xff0c;postman导入&#xff01; Fiddler 这个有2个方案&#xff0c;第一个方案是因为第二个方案发现的&#xff01; 方案…

html+css+js网页设计 找法网2个页面(带js)ui还原度百分之90

htmlcssjs网页设计 找法网2个页面&#xff08;带js&#xff09;ui还原度百分之90 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑…

私域流量运营中的精准量化与开源AI智能名片O2O商城小程序的应用深度解析

摘要&#xff1a;在数字化时代&#xff0c;私域流量作为品牌直接与消费者建立联系的重要桥梁&#xff0c;其管理和运营策略直接影响着企业的市场竞争力。本文深入探讨了私域流量运营的底层逻辑——精准量化运营&#xff0c;详细分析了其核心要素及实现路径。同时&#xff0c;结…

Java学习篇(一)| 如何生成分布式全局唯一ID

Java学习篇&#xff08;一&#xff09;| 如何生成分布式全局唯一ID 一、使用场景二、常用方法1、UUID &#xff08;尽量不要用&#xff09;2、数据库自增 &#xff08;用的最多-但不适合做分布式ID&#xff09;3、Redis 生成ID &#xff08;可用&#xff09;1、原因2、通过代码…

AI革新3D建模:Stable Fast 3D工具的高效应用——图片快速生成3D模型

在3D建模领域,AI技术的介入正引发一场革命。Stable Diffusion(SD)的最新应用——Stable Fast 3D,为快速生成3D模型提供了一个强大的解决方案。以下是对这项技术及其应用的详细介绍和优化建议。 一、工具概览 Stable Fast 3D模型:这是一个基于AI的3D模型生成工具,可通过H…

Linux基础-总结篇

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 经过前面30多小节的内容介绍&#xff0c;我们从虚拟机的安装&#xff0c;到Linux文件的基本操作(增删改查)&#xff0c;打包…

贪心算法总结(3)

一、最长回文串 409. 最长回文串 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int longestPalindrome(string s) {int hash[127]{0};for(char&ch:s) hash[ch];int ret0;for(int&x:hash) retx/2*2; //技巧1 利用向下取整return ret<s.size()?…

linux文件——深度学习文件fd、文件系统调用

前言&#xff1a;从本片开始正式进入linux文件的学习&#xff0c;本片内容主要是文件的fd。 本篇内容博主将要先带友友回忆C语言中的文件操作接口&#xff0c;然后再过渡到操作系统中的系统调用的学习&#xff0c;最后理解操作系统中的文件操作。 ps&#xff1a;本节内容设计一…

Android 10.0 DocumentsUI文件管理器首次进入默认显示内部存储文件功能实现

1.前言 在10.0的系统rom定制化开发中,在关于文件管理器的某些功能中,在首次进入文件管理器的时候默认进入下载 文件夹,点击菜单选择内部存储的时候,会显示内部存储的内容,客户开发需要要求默认显示内部存储的文件 接下来分析下功能的实现 如图: 2.DocumentsUI文件管理器首…

入营测评题解

第一题&#xff1a;first 第二题&#xff1a;chengji 打擂台&#xff0c;每个数跟当前最大、最小值比较&#xff0c;维护当前最值即可。 #include<bits/stdc.h> using lllong long; using namespace std;const int N1e610;int n; int x;//1e9, ll最大9e18 ll maxn0,minn…

C++ 新特性 | C++17 常用新特性介绍

目录 1、结构化绑定 2、constexpr扩展 2.1、constexpr lambda 2.2、constexpr if 2.3、constexpr string 4、if with initializer 5、std::optional 6、使用inline定义内联变量 7、std::filesystem库 8、折叠表达式 9、模板的模板参数推导 9.1、从构造函数参数推导…

景联文科技:破解数据标注行业痛点,引领高质量AI数据服务

数据标注行业是人工智能和机器学习领域中一个非常重要的组成部分。随着AI技术的发展&#xff0c;对高质量标注数据的需求也在不断增长。 数据标注市场的痛点 1. 团队管理 在众包和转包模式下&#xff0c;管理大量的标注人员是一项挑战。 需要确保标注人员的专业性、稳定性和…

【ConcurrentHashMap】JDK1.7版本源码解读与分析

如果对文章中提到的与 HashMap 相关的部分有任何疑问, 请移步HashMap源码详解 简介 底层是一个 Segment[] 数组, 每个 Segment对象 内部又有一个 Entry[ ] 数组, 一个 Entry[] 数组就相当于一个HashMap Entry[ ]采用拉链法解决冲突, 但是没有红黑树, 红黑树是1.8才引入的; 一…

音频进阶学习一——模拟信号和数字信号

文章目录 前言|版本声明&#xff1a;山河君&#xff0c;未经博主允许&#xff0c;禁止转载 一、什么是模拟信号和数字信号信号模拟信号数字信号数字和模拟信号的区别一览 二、信号处理系统总结 前言 所有软件的运行都得益于硬件上的突破&#xff0c;数字信号是从40年前就开始高…