JavaSE——类与对象(4)

一、静态变量

1.1为什么要有静态变量

        现在有一群小朋友在做游戏,不是有新的小朋友加入,请问如何知道现在共有多少人在完?看这段代码:

public class first {
    public static void main(String[] args) {
        int count = 0;
        child child1 = new child("小明");
        child1.join();
        ++count;

        child child2 = new child("小红");
        child2.join();
        ++count;

        child child3 = new child("小李");
        child3.join();
        ++count;
    }
}

class child{
    private String name;

    public child(String name){
        this.name=name;
    }

    public void join(){
        System.out.println(name + "加入了游戏");
    }
}

        这种实现方法中,count是一个独立于对象的变量,不符合Java面向对象的特点,并且访问起来比较麻烦。如果有一个变量能够表示对象的总个数,我们在创建一个对象时,就把这个变量加1,并且这个变量是所有同类对象共享的就ok了。因此这里引入了静态变量。

1.2什么是静态变量

        在定义一个成员变量时,如果使用static关键字修饰它,则该成员变量又可被称为静态变量或类变量,它是该类的所有对象共享的变量,任何一个该类的对象访问它时,取到的都是相同的值。它随着类的加载而创建,即使没有创建对象实例也可以访问。

public class first {
    public static void main(String[] args) {
        child child1 = new child("小明");
        child1.join();
        ++child.count;

        child child2 = new child("小红");
        child2.join();
        ++child.count;

        child child3 = new child("小李");
        child3.join();
        ++child.count;
        
    }
}

class child{
    private String name;
    public static int count = 0;//静态变量
    public child(String name){
        this.name=name;
    }

    public void join(){
        System.out.println(name + "加入了游戏");
    }
}

1.3静态变量内存分析 

        我们知道,Java的内存空间被分为栈区、堆区和方法区,静态变量具体存在于那一块由JDK决定。

  1. JDK8以前,静态变量存放在方法区中。
  2. JDK8以后,类加载后会在堆中生成一个对应的class对象,这时,静态变量存放在堆中反射的class对象的尾部。

        不管静态变量在哪,我们只要记住:

  1. static变量由同一个类的所有对象共享。
  2. static变量在类加载的时候就生成了。

1.4静态变量的使用

定义的基本语法:

访问修饰符 static 数据类型 变量名;//推荐

static 访问修饰符 数据类型 变量名;//也可以

访问的基本语法:

         静态变量的访问修饰符的访问权限和范围与普通属性一样。

类名.静态变量名;//推荐

对象名.静态变量名;//也可以

二、静态方法

2.1静态方法的使用场景

        当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。如果我们希望不创建实例,也可以调用某个方法,那么将其设计为静态方法就非常合适。

2.2静态方法的使用

        静态方法也叫类方法。

定义的基本语法:

访问修饰符 static 数据返回类型 方法名(){ }//推荐
static 访问修饰符 数据返回类型 方法名(){ }

调用的基本语法,前提是满足访问修饰符的访问权限和范围:

类名.静态方法名
对象名.静态方法名

 比如说:

public class first {
    public static void main(String[] args) {
        
        System.out.println(Mytools.calsum(10.2,52.3));//62.5
    }
}

class Mytools{
    public static double calsum(double n1, double n2){
        return n1 + n2;
    }
}

        这里直接才类名.静态方法名就成功调用了该函数。

2.3静态方法的细节

  1. 静态方法和普通方法都随着类的加载而加载,将结构信息存储在方法区。类中没有this的参数,普通方法中也许存在。
  2. 静态方法可以通过类名调用,也可以通过对象名调用。
  3. 普通方法和对象有关,不能通过类名调用。
  4. 静态方法中不允许使用和对象有关的关键字,比如this和super。
  5. 静态方法只能访问静态变量和静态方法,而普通方法既可以访问普通变成员也可以访问静态成员

        

三、main方法

3.1main语法说明

public static void main(String[] args)
  1. main方法由Java虚拟机调用,所以访问权限必须是public。
  2. Java虚拟机在调用时不会创建对象,所以该方法必须是static。
  3. args数组保存执行java命令时传递给所运行的类的参数。

3.2main特别说明

  1. 在main方法中,我们可以直接调用main方法所在类的静态方法或者静态属性
  2. 但是,不能直接访问该类的非静态成员,必须创建一个该类的实例对象后,才能通过这个类区访问类中的非静态成员。
public class first {
    int age = 10;
    static int k = 20;

    public static void main(String[] args) {
        first obj = new first();
        System.out.println(age);//不可以
        System.out.println(obj.age);//可以
        System.out.println(k);//可以
        
    }
}

四、代码块

4.1为什么要有代码块

        如果多个构造器中都有重复的语句,那么就可以将它们抽取到初始化块中,提高代码的重用性,相当于另一种形式的构造器,可以做初始化的操作。

4.2什么是代码块

        代码化块又称为初始化块,属于类中的成员(即类的一部分),类似于方法,将逻辑语句封装在方法体中,通过{}包围起来。但它和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不需要通过对象或者类显示调用,而是加载类时,或创建对象时隐式调用。

基本语法:

[修饰符]{
    代码;
};
  1. 这里的修饰符可写可不写,要写的话只能是static。
  2. 使用static修饰的被称为静态代码块,没有static修饰的,叫做普通代码块。
  3. ;号可写可不写。

4.3代码块使用细节

  1. static代码块又叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而进行,并且只会执行一次。如果是普通代码块,每创建一个对象就会执行一次
  2. 类什么时候被加载,类即使多次被加载,也只会执行一个static代码块:
    1. 创建对象实例时。
    2. 创建子对象实例时,父类也会被加载。
    3. 使用类的静态成员时。
    4. 子类使用静态成员时,父类也会被加载。
  3. 普通代码块,在创建实例时,会被隐式的调用,被创建一次调用一次,如果只是使用类的静态成员,普通代码块并不会执行。
  4. 对象创建时,一个类的调用顺序是:
    1. 首先调用静态代码块和静态属性初始化,它们的优先级一样,按定义的顺序调用。
    2. 再调用普通代码块和普通属性初始化,按定义顺序调用。
    3. 调用构造方法。
  5. 构造器的最前面,隐含了super方法和调用普通代码块以及普通属性初始化。
    
    public class first {
        public static void main(String[] args) {
            B b = new B();//输出为01->02->03->04
        }
    }
    
    class A{
        static{
            System.out.println("01");
        }
    
        {
            System.out.println("02");
        }
        public A(){
        //代码块
        }
    }
    
    class B extends A{
        {
            System.out.println("03");
        };
        public B(){
            //super()
            //调用普通代码块和普通属性初始化
            System.out.println("04");
        }
    }

    创建一个B类的对象,B类本身没有静态代码块,所以直接加载A类的静态代码块,第一个输出为01,然后B的构造器中,会先调用A的构造器,A的构造器调用A自己的普通代码块,输出为02,然后调用B自己的普通代码块,输出03,最后执行自己的构造器输出04。

  6. 一个子类创建一个子类对象时,它们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造起的调用顺序如下执行:
    1. 父类的静态代码块和静态属性。
    2. 子类的静态代码块和静态属性。
    3. 父类的普通代码块和普通属性初始化。
    4. 父类的构造方法。
    5. 子类的普通代码块和普通属性初始化。
    6. 子类的构造方法。
  7. 静态代码块只能调用静态成员,普通代码块可以调用任意成员。

五、final关键字

5.1final关键字使用场景

  1. 使一个类不能再被继承。
  2. 使一个方法不能被重写。
  3. 当不希望类的某个属性的值被修改。
  4. 当不希望某个局部变量被修改。

5.2final关键字使用细节

  1. final修饰的属性又叫做常量,一般用 xx_xx_xx来命名
  2. final修饰符的属性再定义时,必须赋初值,并且以后不能再修改,赋值可以如下位置之一
    1. 定义时。
    2. 在构造器中。
    3. 在代码块中。
  3. 如果final修饰的属性是静态的,则初始化的位置只能是定义时或者静态代码块中,不能在构造器中赋值,因为静态属性在定义是需要被赋初值,但是构造器要在实例化的时候才会被调用。
  4. final类不能继承,但是可以实例化对象。
  5. 如果类不是final类对象,但是具有final方法,则该方法虽然不能重写,但是可以被继承。
  6. 如果一个类已经是final类了,就没必要再给它的方法添上final关键字。
  7. final不能修饰构造器。
  8. final和static往往搭配使用,这样不会导致类加载,可以提高效率。

        

        

        

       

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7如何同时安装Java8和Java17

Java17是长期支持版本,升级到Java17的公司越来越多,特别是Spring Boot3.0最低要求Java17,放弃了对Java8的支持。 但是在升级的时候,还不能保证服务器上的所有Java进程都同步升级,所以系统需要同时安装Java8和Java17。 …

Python Turtle召唤童年:《哆啦A梦的奇妙世界》

Python Turtle召唤童年:《哆啦A梦的奇妙世界》 🐸 前言 🐸🐋 效果图 🐋🐉 代码 🐉 🐸 前言 🐸 欢迎来到 《哆啦A梦的奇妙世界》,在这个博客里,我们…

Java接收LocalDateTime、LocalDatee参数

文章目录 引言I java服务端的实现1.1 基于注解规范日期格式1.2 json序列化和反序列化全局配置自动处理日期格式化II 知识扩展: 枚举的转换和序列化III 签名注意事项引言 应用场景举例:根据时间段进行分页查询数据 前后端交互日期字符串统一是yyyy-MM-dd HH:mm:ss 或者yyyy-M…

LayaBox1.8.4实现战争迷雾效果

实现思路: 和Unity实现思路一样,可看我写的下面的一篇文章 战争迷雾FogOfWar---Unity中实现-CSDN博客 根据碰撞点可以计算出需要透明的位置,怎样计算如下: 根据迷雾mesh的长宽和纵向横向的的像素数可以得出,每个小方…

linux安装部署mysql资料

安装虚拟机 等待检查完成 选择中文 软件选择 网络和主机名 开始安装 设置root密码 ADH-password 创建用户 等待安装完成 重启 接受许可证 Centos 7 64安装完成 安装mysql开始 Putty连接指定服务器 在 opt目录下新建download目录 将mysql文件传到该目录下 查看linux服务器的…

【计算机系统基础】程序数据与ELF数据节

目录 1. 任务描述 2. 实验阶段 2.1 反汇编获取重定位记录 2.2 分析 2.3 查看节头表,确定偏移量 2.4 使用hexedit工具修改指定内容 1. 任务描述 修改二进制可重定位目标文件“phase1.o”的数据(.data)节内容(不允许修改其他节…

csp-j初赛模拟试题(解析)

题目: 在 C中,以下哪个关键字用于实现多态性? A. virtualB. staticC. externD. const 以下数据结构中,不属于线性结构的是( )。 A. 栈B. 队列C. 二叉树D. 链表 一个有 8 个顶点的无向图,若每个…

OSG开发笔记(三十五):OsgUtil::Optimizer:优化场景策略,提升显示性能和渲染效率

​若该文为原创文章,未经允许不得转载 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/144092964 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 长沙红胖子Qt…

Axure RP教程:创建高效用户界面和交互

Axure RP是一款广受好评的软件,专门用于设计精致的用户界面和交互体验。这款软件提供了众多UI控件,并根据它们的用途进行了分类。与此同时,国产的即时设计软件作为Axure的替代品,支持在线协作和直接在浏览器中使用,无需…

1 ISP一键下载

BOOT0BOOT1启动模式说明0X用户Flash用户闪存存储器,也就是Flash启动10系统存储器系统存储器启动,串口下载11SRAM启动SRAM启动,用于在SRAM中调试代码 闪存存储器 是STM32 的内置FLASH,一般使用JTAG或者SWD模式下载程序时,就是下载…

【数据结构与算法】链表之美-复杂链表的复制与链表的插入排序

主页:HABUO🍁主页:HABUO 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 1.复杂链表的复制 题目:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中…

统计字符串中单词出现的次数

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <map> #include <string> int main() {std::string s;//std::cin >> s;s " aaa aaaaa a aa aaa aaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa Hi I am a person a…

comfyui使用记录-PuLID_Flux模型使用

文章目录 1.PuLID模型简介&#xff1a;2.PuLID_Flux 工作流的部署流程安装pulid节点 3.部署遇到的一些问题加载这个节点错误&#xff1a;PulidFluxInsightFaceLoaderPulidFluxEvaClipLoader加载错误 4.PuLID模型的出图效果5.一些参数的设置用到的提示词 1.PuLID模型简介&#x…

threeJs学习 贴图 :地球

效果图&#xff1a; 贴图以后的效果&#xff1a; vue代码&#xff1a; <template><div class"scene_box"><p>创建纹理贴图TextureLoader</p><div class"canvas"></div></div> </template><script s…

联想品牌的电脑 Bios 快捷键是什么?如何进入 Bios 设置?

在某些情况下&#xff0c;您可能需要通过U盘来安装操作系统或进行系统修复。对于联想电脑用户来说&#xff0c;了解如何设置U盘作为启动设备是非常有用的技能之一。本文简鹿办公将指导您如何使用联想电脑的 U 盘启动快捷键来实现这一目标。 联想笔记本 对于大多数联想笔记本电…

SmartSQL:一款方便、快捷的数据库文档查询、导出工具

&#x1f6a9; 项目介绍 SmartSQL 是一款方便、快捷的数据库文档查询、导出工具&#xff01;从最初仅支持SqlServer数据库、CHM文档格式开始&#xff0c;通过不断地探索开发、集思广益和不断改进&#xff0c;又陆续支持Word、Excel、PDF、Html、Xml、Json、MarkDown等文档格式…

Transformer?Attention?——Are All You Need!

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要较为深入地讲述 transformer 模型及 attention 机制等相关深度学习的知识&#xff0c;主要介绍模型结构、原理等。Transformer 属于是当下比较流行和创新的深度学习的基础模型架构&#xff0c;主要应用于自然语言处理&a…

24.11.28 Cookie

cookie_webstorage 1.cookie 每次请求时 可以把cookie自定义的数据 传给服务端 (请求参数 请求头之外 报文传自定义数据的位置 cookie可以长期保存) cookie特点 1.数据格式只有字符串 2.按键值对存储 3.对中文支持较差(尽量不要用中文) 4.按照网站(域 domain)存储 5.可…

尚硅谷前端 (wsy答辩)

尚硅谷前端 &#xff08;wsy答辩&#xff09; 文章目录 尚硅谷前端 &#xff08;wsy答辩&#xff09;一、前端开发过程和框架1.框架目录结构认识1.程序的入口 有两个 第一个是index,html , 第二个在SRC目录下的main,js2.前端页面环境使用框架&#xff08;模板&#xff09;3、框…

不间断电源 (UPS) 对现代技术可靠性的影响

在这个技术型世界里&#xff0c;无论是在个人还是商业环境中&#xff0c;电力供应商提供的稳定供电都变得越来越重要。 不间断电源 (UPS) 系统是一种不可或缺的解决方案&#xff0c;可保证终端设备不受干扰地运行&#xff0c;在出现电源问题或故障时让用户继续工作。 这篇文章…