【Java】:static成员和代码块

目录

1.static成员

1.1再谈学生类

1.2static修饰成员变量

1.3static修饰成员方法

1.4static成员变量初始化

1.4.1就地初始化

1.4.2静态代码块初始化

2.代码块

2.1代码块概念以及分类

2.2普通代码块

2.3构造代码块

2.4静态代码块


1.static成员

1.1再谈学生类

        使用类和对象文章中介绍的学生类实例化三个对象s1、s2、s3,每个对象都有自己特有的名字、性别、年龄,学分绩点等成员信息,这些信息就是对不同学生来进行描述的,如下所示:

public class Student {
    public String name;
    public String gender;
    public int age;
    public double score;
    
    public Student(String name, String gender, int age, double score){
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.score = score;
    }
    public static void main(String[] args) {
        Student s1 = new Student("Lihua","男",18,3.8);
        Student s2 = new Student("Xiaohua","女",19,4.0);
        Student s3 = new Student("Jim","男",18,2.6);
    }
}

        假设三个同学是同一个班上的,那么他们上课肯定是在同一个教师,那既然在一个教室,那能否给类中再加一个成员变量,来保存同学上课的教室呢?但是不行的。

        在Student类中定义的成员变量,每个对象都会包含一份(称之为实例变量),因为需要使用这些信息来描述具体的学生。而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都储存一份,而是需要让所有的学生来共享。在Java中,被static修饰的成员变量,也可以称他们为类成员,其不属于某个具体的对象,是所有对象所共有的。

1.2static修饰成员变量

static修饰的成员变量,称之为静态成员变量,静态成员变量最大的特征是:不属于某个具体的对象,是所有对象所共享的。

【静态成员变量特性】:

  • 不属于某个具体的对象,是类的属性,所有对象共享的,不储存在某个对象的空间中
  • 既可以通过对象访问,也可以通过类名访问,但一般更推荐用类名访问
  • 类变量存储在方法区中。
  • 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
public class Student {
    public String name;
    public String gender;
    public int age;
    public double score;
    public static String classRoom = "404";

    public Student(String name, String gender, int age, double score){
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.score = score;
    }
    public static void main(String[] args) {
        //静态成员变量可以直接通过类名进行访问
        System.out.println(Student.classRoom);

        Student s1 = new Student("Lihua","男",18,3.8);
        Student s2 = new Student("Xiaohua","女",19,4.0);
        Student s3 = new Student("Jim","男",18,2.6);

        //也可以通过对象进行访问;但classRoom是三个对象共享的
        System.out.println(s1.classRoom);
        System.out.println(s2.classRoom);
        System.out.println(s3.classRoom);
    }
}

1.3static修饰成员方法

       一般类中的数据成员都设置成private,而成员方法设置为public,那设置之后,Student类中的classRoom属性如何在类外访问呢?

 public class Student {
    public String name;
    public String gender;
    public int age;
    public double score;
    private static String classRoom = "404"; //private属性

    public Student(String name, String gender, int age, double score){
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.score = score;
    }
}
public class TestStudent {
    public static void main(String[] args) {
        System.out.println(Student.classRoom);
        //编译失败:classRoom在Student中是private访问控制
    }
}

那static属性应该如何访问呢?

Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。

public class Student {
    public String name;
    public String gender;
    public int age;
    public double score;
    private static String classRoom = "404";

    public Student(String name, String gender, int age, double score){
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.score = score;
    }

    public static String getClassRoom(){ //静态方法
        return classRoom;
    }
}
public class Test{
    public static void main(String[] args) {
        System.out.println(Student.getClassRoom());
        //输出:404
    }
}

【静态方法特征】:

  • 不属于某个具体的对象,是类方法。
  • 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐后者
  • 不能在静态方法中访问任何非静态成员变量。
public static String getClassRoom(){
    System.out.println(this);
    return classRoom;
}
//编译失败:无法从静态上下文中引用非静态变量this
public static String getClassRoom(){
    age += 1;
    return classRoom;
}
//编译失败:无法从静态上下文中引用非静态变量age
  • 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时无法传递this引用。
public static String getClassRoom(){
    doClass();
    return classRoom;
}
//编译失败:无法从静态上下文中引用非静态方法doClass()

可以在一个依赖对象的方法中调用静态方法,但不可以在一个静态方法中调用依赖对象的方法。

1.4static成员变量初始化

【注意】:

静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性。

静态成员变量的初始化分为两种:就地初始化静态代码块初始化

1.4.1就地初始化

就地初始化指的是:在定义时直接给出初始值

class Student {
    public String name;
    public String gender;
    public int age;
    public double score;
    private static String classRoom = "404";

    //...
}

1.4.2静态代码块初始化

那什么是代码块呢?请继续往后看。

2.代码块

2.1代码块概念以及分类

使用 { } 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可以分为以下四种:

  • 普通代码块
  • 构造块
  • 静态块
  • 同步代码块

2.2普通代码块

普通代码块:定义在方法中的代码块。

public class Student{
    public static void main(String[] args) {
        {//直接用{}定义,普通代码块
            int x = 10;
            System.out.println("x1="+x);
        }
        int x = 100;
        System.out.println("x2="+x);
    }
}
//执行结果:
x1=10
x2=100

这种方法较少见。

2.3构造代码块

构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块(非静态代码块)。构造代码块一般用于初始化实例成员变量。

public class Student {
    private String name;
    private String gender;
    private int age;
    private double score;

    public Student(){//构造方法
        System.out.println("I am Student init()");
    }

    {//实例代码块
        this.name = "小黑";
        this.age = 18;
        this.gender = "男";
        System.out.println("I an instance init()");
    }

    public void show(){
        System.out.println("name:"+name+" gender:"+gender+" age:"+age);
    }
}
public class Main {
    public static void main(String[] args){
        Student stu = new Student();
        stu.show();
    }
}
//运行结果:
I an instance init()
I am Student init()
name:小黑 gender:男 age:18

2.4静态代码块

使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。

public class Student {
    private String name;
    private String gender;
    private int age;
    private double score;
    private static String classRoom;

    {//实例代码块
        this.name = "小黑";
        this.age = 18;
        this.gender = "男";
        System.out.println("I an instance init()");
    }

    static{//静态代码块
        classRoom = "404";
        System.out.println("I am static init()");
    }

    public Student(){
        System.out.println("I am Student init()");
    }

    public void show(){
        System.out.println("name:"+name+" gender:"+gender+" age:"+age);
    }
}
public class Main {
    public static void main(String[] args){
        Student stu1 = new Student();
        Student stu2 = new Student();
        stu1.show();
        stu2.show();
    }
}
//运行结果:
I am static init()
I an instance init()
I am Student init()
I an instance init()
I am Student init()
name:小黑 gender:男 age:18
name:小黑 gender:男 age:18

【执行顺序】:

  1. 静态代码块;
  2. 实例代码块/构造块/非静态代码块...
  3. 构造方法。

【注意事项】:

  • 静态代码块不管生成多少个对象,其只会执行一次;
  • 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的;
  • 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并);
  • 示例代码块只有在创建对象时才会执行。

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

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

相关文章

MATLAB 点云随机渲染赋色(51)

MATLAB 点云随机渲染赋色(51) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 为点云中的每个点随机赋予一种颜色,步骤和效果如图: 1、读取点云 (ply格式) 2、随机为每个点的RGB颜色字段赋值 3、保存结果 (ply格式) 二、算法实现 1.代码 代码如下(示例):…

gin基础学习笔记--参数验证

用gin框架的数据验证,可以不用解析数据,减少if else,会简洁许多。 package mainimport ("fmt""time""github.com/gin-gonic/gin""github.com/gorilla/sessions" )// 初始化一个cookie存储对象 // s…

基于STM32的武警哨位联动报警系统设计,支持以太网和WIFI通信

1.功能 本文提出的武警报警信息系统终端,可实现报警和联动响应,支持以太网和WIFI两种通信模式,可实现移动哨位报警和固定哨位报警,语音和显示报警信息用户可自行定制。 本终端主要由STM32F103处理器模块和C8051F340处理器模块构…

P-MapNet:Far-seeing Map Generator Enhanced by both SDMap and HDMap Priors

主页:homepage 参考代码:P-MapNet 动机与出发点 在感知系统中引入先验信息是可以提升静态元素感知网络的上限的,这篇文章对SD地图采用栅格化表示(也就是图像形式),之后用CNN网络去抽取栅格化SD地图的信息&…

linux ubuntu 在保存文件不被允许,但是root权限

现象:MobaXterm_Personal_2登录到服务器,切换到root用户,然后使用MobaXterm_Personal_2自带的编辑器,编写文件,进行保存不被允许;查看目录root是有权限进行修改文件的,然后使用vim进行修改保存&…

网络安全-内网渗透2

一、MIC 将我们上次未描述完的MIC在这里详细解释一下 咱们所抓的第二个包会给返回一个服务端的challenge 之后服务器回包的第三个包会回复一个client challenge 所以咱们客户端和服务端现在分别有两个challenge,相当于客户端和服务端互相交换了一下challenge 因此…

本地搭建多人协作ONLYOFFICE文档服务器并结合Cpolar内网穿透实现公网访问远程办公

文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE,并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…

高精度(大整数)

本文用于记录个人算法竞赛学习,仅供参考 一.什么是大整数 当一个数的位数已经很大了(比如有10^6),常规的数据类型已经存不下了,那么这个时候就可以用数组来存,数组的每个元素代表数的每一位,且…

Base64编码的全面介绍

title: Base64编码的全面介绍 date: 2024/3/31 18:55:49 updated: 2024/3/31 18:55:49 tags: Base64编码网络传输文本转换数据膨胀非加密性质应用场景安全传输 1. Base64的定义和作用 Base64是一种用64个字符表示二进制数据的编码方式,通常用于在网络传输中将二进…

什么是Redis数据一致性?如何解决?

在系统中缓存最常用的策略是:服务端需要同时维护DB和cache,并且是以DB的结果为准–Cache-Aside Pattern(缓存分离模式、旁路缓存) 读数据 单纯的读数据是不会产生数据不一致,只有并发下读和写才会存在数据不一致。 写…

安装即启动?探索流氓App的自启动“黑科技” (Android系统内鬼之ContentProvider篇)

前段时间发现了一个神奇的app,它居然可以在安装之后立即自启动: 看到没有,在提示安装成功大概1到2秒后,就直接弹出Toast和通知了! 好神奇啊,在没有第三方app帮忙唤醒的前提下,它是怎么做到首次安…

2024年 前端JavaScript 进阶 第2天 笔记

2.1-内容和创建对象方式 2.2-164-构造函数 2.3-new实例化执行过程 2.4-实例成员和静态成员 2.5-基本包装类型 2.6-0bject静态方法 2.7-数组reduce累计方法 对象数组 加0 2.7-数组find、every和转换为真 --说明手册文档 MDN Web Docs 2.8-字符串常见方法 2.3 String 1.常见实例…

【yolo检测】基于YOLOv8与DeepSORT实现多目标跟踪

1.配置环境 conda版本23.5.0 创建虚拟环境,Python版本选择3.10,环境命名为yolov8 conda create --name yolov8 python3.10进入环境 conda activate yolov82.安装工具包 实测网络问题可以用手机热点或者加-i镜像解决。 pip install -r requirements.t…

C语言操作符详细讲解

前言 本次博客一定会让刚刚学习C语言小白有所收获 本次操作符讲解不仅分类还会有代码示例 好好看 好好学 花上几分钟就可以避免许多坑 1 操作符的基本使用 1.1操作符的分类 按功能分 算术操作符&#xff1a; 、- 、* 、/ 、% 移位操作符: >> << 位操作符…

Keil界面乱了,某些图标消失

文章目录 如图 如图 我都不知道怎么搞的第一个 重启界面解决了

【微服务框架】微服务简介

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

刷LeetCode:冒泡排序详解 【2/1000 第二题】含imagemagick动态效果图

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 LeetCode解锁1000题: 打怪升级之旅htt…

文生图大模型三部曲:DDPM、LDM、SD 详细讲解!

1、引言 跨模态大模型是指能够在不同感官模态(如视觉、语言、音频等)之间进行信息转换的大规模语言模型。当前图文跨模态大模型主要有&#xff1a; 文生图大模型&#xff1a;如 Stable Diffusion系列、DALL-E系列、Imagen等 图文匹配大模型&#xff1a;如CLIP、Chinese CLIP、…

网络基础(二)——序列化与反序列化

目录 1、应用层 2、再谈“协议” 3、网络版计算器 Socket.hpp TcpServer.hpp ServerCal.hpp ServerCal.cc Protocol.hpp ClientCal.cc Log.hpp Makefile 1、应用层 我们程序员写的一个个解决我们实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在…

H5抓包——Android 使用电脑浏览器 DevTools调试WebView

H5抓包——Android 使用电脑浏览器 DevTools调试WebView 一、使用步骤 1、电脑通过数据线连接手机&#xff0c;开启USB调试&#xff08;打开手机开发者选项&#xff09; 2、打开待调试的H5 App&#xff0c;进入H5界面 3、打开电脑浏览器&#xff0c;调试界面入口 如果用ed…