46从零开始学Java之静态代码块和静态类、静态导入

news2024/12/24 9:12:36

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦

千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者

前言

在上一篇文章中,壹哥给大家讲解了static静态关键字,以及静态变量、静态常量和静态方法等内容。但是关于static,还有其他的一些内容,比如静态类、静态代码块和静态导入等,接下来壹哥给大家继续分析讲解。我们一起来看看这些内容都是怎么用吧。

-------------------------------------------------前戏已做完,精彩即开始-----------------------------------------------

全文大约【3300】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,可以让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

配套开源项目资料

Github:

GitHub - SunLtd/LearnJava

Gitee:

一一哥/从零开始学Java

一. 静态代码块

1. 概念

由static修饰的代码块称为静态代码块,每个类中可以有多个静态代码块,每个静态代码块都只会在类加载时执行一次。对那些只需要进行一次操作的初始化代码,就可以放在静态代码块中执行。静态代码块具有如下特性:

  • 静态代码块类似于是一个方法,但它不可以在方法中调用,也不能存在于任何方法体中;
  • 静态代码块可以写在类中的任何地方,一个类中也可以有多个静态代码块;
  • 静态代码块在类加载时执行;
  • 静态代码块优先于动态代码块执行;
  • 如果类中包含多个静态代码块,则JVM虚拟机会按它们在类中出现的先后顺序依次执行,每个静态代码块只会被执行一次;
  • 静态代码块与静态方法一样,不能直接访问类的实例变量和实例方法,需要通过类的实例对象来访问。

2. 语法

静态代码块的语法格式如下:

static {
//代码内容
}

静态代码块的语法格式比较奇特,static关键字后面直接跟一个{ }花括号,这就是静态代码块。我们可以在这个静态代码中编写若干代码,效果类似于是一个方法。

3. 案例

3.1 定义User类

我们先来定义一个User类,在该类中定义一个静态代码块,一个非静态代码块,还有一个构造方法。在Java中,按照代码执行时间的早晚:

静态代码块 > 非静态代码块 > 构造方法 > 普通方法

我们要记住以下几点:

  • 静态代码块,在类被加载时就会自动调用,且只会被调用一次。
  • 非静态代码块,在对象被创建时自动调用,每次创建对象时都会执行。
  • 而构造方法,每创建一个对象就会执行一次。
/**
 * @author 一一哥Sun
 */
public class User {
	//静态属性,属于整个类,被整个类的所有对象共享!
	static int num = 10;
	//普通属性,属于某个对象,是对象私有的!
	private int age=20;
	
	//静态代码块,在类被加载时自动调用,且只会被调用一次。比普通代码块先执行!
    static {
    	//无论创建几个User对象,本静态代码块都只会执行一次,num++变成11
        System.out.println("这是静态代码块,num="+(num++));
    }    
	
	//非静态代码块,在对象被创建时自动调用,每次创建对象时都会执行,比构造方法先执行!
    {
    	//每创建一个User对象,就会执行一次本代码块,num++变成12,age=20.
        System.out.println("这是非静态代码块,num="+(num++)+",age="+(age++));
    }
	
    //构造方法
    public User(){
    	//每创建一个User对象,就会执行一次构造方法,num++变成13,age=21.
        System.out.println("这是无参构造方法,num"+(num++)+",age="+(age++));
    }
}

3.2 定义测试类

接下来我们再定义一个测试类,在这里创建3个User对象。

/**
 * @author 一一哥Sun
 */
public class UserTest {
	public static void main(String[] args) {
		//创建第一个User对象
		User user1=new User();
		//创建第2个User对象
		User user2=new User();
		//创建第3个User对象
		User user3=new User();	
	}
}

3.3 执行结果分析

上面的代码执行结果如下图所示:

在上述代码中,我们创建了3个User对象。其中,无论构造几次对象,一个类中的一个static静态代码块都只会执行一次,所以在构造第一个User对象时num是10。然后执行非静态代码块,num变成11,age等于20。接着执行构造方法。num=12,age=21。

之后开始构造第2个对象,此时只执行非静态代码块和构造方法,不会再执行静态代码块。因为num是静态属性,所以第2个user对象继续共享num变量,num=13;而因为age是成员变量,所以age是一个新的成员变量,age仍然是20。接着执行构造方法,num=14,age=21。

最后创建第3个User对象,过程和上述一样。

4. 配套视频

与本节内容配套的视频链接如下:

Bilibili External Player

二. 静态内部类

1. 概念

在Java中,我们可以在一个类的内部定义另一个类,也就是A类里面可以嵌套一个B类,这个内部的B类就叫做内部类。而内部类根据是否带有static关键词,可以分为静态内部类和非静态内部类。

其中,静态内部类使用 static关键字修饰。对于静态内部类,我们可以直接访问,不需要创建外部类来访问它。

注意,对于内部类,壹哥会在后面进行专门的讲解,所以此处我们大家先有个印象即可。

2. 语法

静态内部类的语法格式如下:

public class 外部类 {
    //代码...
    static class 内部类{
        //代码...
    }
}

3. 案例

3.1 定义静态内部类

这里壹哥先简单定义一个静态内部类,后面我们在学习内部类时再专门讲解。在这个静态内部类中,壹哥定义了一个方法,来访问外部类中的普通属性和静态属性。我们要记住以下几点:

  • 静态内部类访问外部类的成员变量时,需要先创建外部类对象;
  • 非静态内部类可以直接访问使用外部类的成员变量,如同使用本类中的变量;
  • 所有的内部类访问外部类的静态变量时,可以直接通过"外部类.静态变量"的形式访问。
/**
 * @author 一一哥Sun
 * 外部类和内部类
 */
public class OuterClass {
	//普通属性,属于外部类
	static int outerNum=10;
	
	//定义一个静态的内部类,如果不带static,就是一个普通的内部类。
	//内部类的使用,和普通类一样,里面可以正常定义属性、方法、构造方法等。
	static class InnerClass{
		//私有属性无法在类的外部直接访问
		//private int innerNum=20;
		int innerNum=20;
		
		public void printNum() {
			//定义外部类对象
			OuterClass outer=new OuterClass();
            //这里的this是指InnerClass内部类对象!
System.out.println("innerNum="+this.innerNum+",outerAge="+outer.outerAge+",outerNum="+OuterClass.outerNum);
		}
	}
}

3.2 定义测试类

我们再定义一个测试类,看看内部类对象是怎么调用的。

/**
 * @author 一一哥Sun
 * 测试访问内部类
 */
public class InnerClassTest {
	public static void main(String[] args) {
		//创建内部类对象,格式为“外部类.内部类 对象名 = new 外部类.内部类的构造方法”
		OuterClass.InnerClass inner = new OuterClass.InnerClass();
		//调用内部类的方法
		inner.printNum();
		
		//访问外部类属性
	    System.out.println("outerNum="+OuterClass.outerNum);
	    //访问内部类属性
	    System.out.println("innerNum="+inner.innerNum);
	}
}

三. 静态导入

1. 概念

JDK 1.5之后,Java中新增了一种静态导入的语法,用于导入指定类中的某个静态变量、静态方法或全部的静态变量和静态方法如果一个类中的方法全都是使用 static 声明的静态方法,我们就可以通过import static的方式进行导入,这种导包方式就叫做静态导入。

2. 语法

我们要使用import static语句进行静态导入,根据导入数量的多少,会有两种情况:

  • 部分导入:导入部分静态变量或静态方法;
  • 全部导入:导入全部静态变量或静态方法。

2.1 部分导入

部分导入是指利用静态导入的语法,导入指定类中单个的静态变量或静态方法。语法格式如下:

import static package.ClassName.fieldName|methodName;

package要导入的包名,ClassName类名,fieldName是静态变量名或methodName静态方法名。

2.2 全部导入

全部导入是指利用静态导入的语法,导入指定类中全部的静态变量或静态方法。语法格式如下:

import static package.ClassName.*;

上面的星号是java中的一种通配符,代表所有导入的静态变量或静态方法名。

我们要注意,import static语句要放在Java代码的 package 语句之后、类定义之前,与普通的import语句平级。

3. 案例

壹哥在这里设计一个简单的案例,给大家演示一下静态导入的使用。我们之前进行输出的时候,经常使用System.out.println("");语句,其实这样就挺麻烦,每次都要写System.out,实际上我们只需要调用println()方法就可以了。而println()就是一个静态方法,所以我们就可以使用静态导包来简化操作了。

package com.yyg.staticdemo;

//静态导入System类中的所有静态成员
import static java.lang.System.*;

//静态导入Math类中的所有静态成员
import static java.lang.Math.*;

/**
 * @author 一一哥Sun 
 * 静态导包案例
 */
public class StaticImportDemo {
	public static void main(String[] args) {
		//System.out.println("静态导包");
		//out其实是java.lang.System类的静态变量,表示标准输出;
		//PI是java.lang.Math类中的静态变量,表示数学里的π常量;
		//java.lang.Math.PI
		out.println(PI);
		
		//我们可以直接调用Math类的sqrt静态方法,返回64的正平方根
		//java.lang.Math.sqrt(E)
		out.println(sqrt(64));
	}
}

------------------------------------------------正片已结束,来根事后烟----------------------------------------------

四. 结语

至此,壹哥就把static静态变量、静态常量、静态代码块、静态类、静态导入等相关的内容给大家全部介绍完毕了。这些都是我们开发时很常用的内容,所以壹哥希望各位初学者,要把static相关的内容牢牢掌握。最后壹哥再来给大家简单总结一下本文要点:

  • 静态成员属于所有实例对象都“共享”的字段,是中的“公共财产”;
  • 调用静态方法不需要实例对象,静态方法中不能使用this和super
  • 静态方法中可以访问静态变量和其他静态方法;
  • 静态方法一般是在工具类中定义;
  • 掌握静态代码块的写作方式;
  • 掌握静态内部类的调用方式;
  • 掌握静态导入的使用方式。

另外如果你独自学习觉得有很多困难,可以加入壹哥的学习互助群,大家一起交流学习。

五. 今日作业

1. 第一题

//父类
class Super{
    public static void m1(){
        System.out.println("m1inSuper");
    }
    
    public void m2(){
        System.out.println("m2inSuper");
    }
}

//子类
class Sub extends Super{
    public static void m1(){
        System.out.println("m1inSub");
    }
    
    public void m2(){
        System.out.println("m2inSub");
    }
}

//测试类
public class TestMain{
    public static void main(String args[]){
        Super sup=new Sub();
        sup.m1();
        sup.m2();
        
        Sub sub=(Sub)sup;
        sub.m1();
        sub.m2();
    }
}

写出上述代码的执行结果,请在评论区给出你的答案。

 

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

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

相关文章

C4.5算法

假设我们有一个关于餐厅顾客的数据集,其中包括9个样本,每个样本有3个属性:天气、是否有预订和是否是周末,以及一个类别标签,表示该顾客是否会来餐厅(是或否)。 数据集如下: 使用C4.5算法来构建…

DAMO-YOLO:一种平衡速度和准确性的新目标检测框架

DAMO-YOLO:一种平衡速度和准确性的新目标检测框架 1.介绍2.关键技术2.1. NAS主干网络:MAE-NAS2.2. Large Neck:RepGFPN2.3. Small Head:ZeroHead2.4. 标签分配:AlignOTA2.5 模型蒸馏 3.性能效果展示 作者:K…

CART算法

假设我们有一个二元分类问题,数据集包含以下四个样本: 特征1特征2类别0.20.310.40.500.60.700.80.90 可以使用CART算法来建立一个决策树模型。 1、首先,我们需要选择一个特征和阈值来对数据集进行划分。假设我们选择特征1和阈值0.5&#x…

基于Java中国咖啡文化宣传网站设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

IDEA创建maven工程JDBC连接MySQL数据库中的遇到的问题以及相应的解决方案

首先创建一个maven工程 然后点击进入pom.xml文件&#xff0c;输入安装依赖。 输入数据库配置文件原码&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version>…

Docker 中的 .NET 异常了怎么抓 Dump

一&#xff1a;背景 1. 讲故事 有很多朋友跟我说&#xff0c;在 Windows 上看过你文章知道了怎么抓 Crash, CPU爆高&#xff0c;内存暴涨 等各种Dump&#xff0c;为什么你没有写在 Docker 中如何抓的相关文章呢&#xff1f;瞧不上吗&#xff1f; 哈哈&#xff0c;在DUMP的分…

Flutter 组件(三)按钮类组件

Flutter开发笔记 Flutter 组件&#xff08;三&#xff09;按钮类组件 - 文章信息 - Author: Jack Lee (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChineAddress of this article:https://blog.csdn.net/qq_28550263/article/det…

Prophet 时间序列预测框架入门实践笔记

1. Prophet时间序列预测框架概述 Prophet是Facebook开源的一种时间序列预测框架&#xff0c;旨在使时间序列分析更加容易和快速。Prophet可以处理具有多个季节性和突发事件的时间序列数据&#xff0c;并且在数据缺失或异常情况下仍然能够进行良好的预测。Prophet采用了一种基于…

荣耀电脑怎么用U盘重装系统?荣耀电脑用U盘重装Win10系统教程

荣耀电脑怎么用U盘重装系统&#xff1f;用户想用U盘来给荣耀电脑重装Win10系统&#xff0c;但是不知道怎么操作才能完成Win10系统的重装&#xff0c;这时候用户需要准备一个大于8G的U盘&#xff0c;还有一个能够正常联网的荣耀电脑&#xff0c;最后根据小编分享的荣耀电脑用U盘…

Linux文件系统论述

目录 前言 一.磁盘 1.1定义 1.2结构 1.3磁盘的寻找方式 1.4磁盘的逻辑/线性结构 1.5磁盘访问的基本单位 1.6磁盘的管理 二.Linux文件系统 2.1系统结构 2.2属性解析&#xff1a; 2.3inode相关块的解析&#xff1a; 2.4数据块的解析&#xff1a; 前言 学了一段时间的Linux操…

DIM-00019、Unable to OpenSCManager: err=5、DBT-50000

在windows server 2016上安装部署Oracle 19C&#xff0c;出现较多的问题。 例如在DBCA建库时出现[DBT-50000]无法检查可用内存报错&#xff1a; 根据MOS文档&#xff1a;DBCA fails with errors: [FATAL] [DBT-50000] Unable to check for available memory in “Specify conf…

算法05-排序算法

算法05-排序算法 总结大纲要求【 3 】排序的基本概念各种排序算法 【 3 】冒泡排序&#xff08;Bubble Sort&#xff09;冒泡排序排序规则冒泡排序优化 【 3 】选择排序&#xff08;Selection Sort&#xff09;【 3 】插入排序&#xff08;Insertion Sort&#xff09;题目描述…

怎么高效编写企业内部FAQ文档呢?

企业内部FAQ文档是指包含常见问题和答案的文档&#xff0c;旨在为企业内部员工提供帮助和解答。编写这样的文档可以帮助企业内部员工更好地理解和掌握公司的政策和流程&#xff0c;提高工作效率。 编写企业内部FAQ文档的一些高效方法&#xff1a; 确定文档的范围和目标受众 …

Windows11安装oneAPI和Visual Studio 2022配置Fortran并行环境

Windows11安装oneAPI和Visual Studio 2022配置Fortran并行环境 安装Visual Studio 2022 Community安装oneAPI建立Fortran工程项目测试建立单核运行的Fortran运行算例建立并行运行的Fortran运行算例 结语 安装Visual Studio 2022 Community 访问微软Visual Studio官网&#xff…

SpringBoot 如何使用 Redis 作为缓存?

SpringBoot 如何使用 Redis 作为缓存&#xff1f; 引言 在今天的互联网应用中&#xff0c;缓存是一个非常重要的概念。缓存可以减轻数据库的负担&#xff0c;提高系统的性能。Redis 是一个非常流行的内存数据库&#xff0c;它可以用作缓存&#xff0c;提供快速的读写速度和高…

【C语言初阶(1)】分支语句

文章目录 前言1. if 语句1.1 if 语法结构1.2 悬空 else1.3 “ ” 号引发的错误1.4 if 语句练习题 2. switch 语句2.1 switch 语法结构2.2 在switch语句中的 break2.3 default 子句2.4 switch 语句练习题 前言 C语言是一门结构化的程序设计语言&#xff1b; 它分为&#xff1a;…

【MySQL】不就是多表查询综合练习

前言 嗨咯大家好&#xff01;我们学习完毕了多表查询&#xff0c;今天我们就要对我们所学的成果进行测验&#xff0c;本期主要是对多表查询相关内容的练习课程。可以先试着自己敲&#xff0c;遇到不会可以查看查考代码。 目录 前言 目录 练习题 1.查询员工的姓名、年龄、职位…

生物制药厂洁净区环境监测超限的标准是多少?

对于一些生物制药企业来说&#xff0c;质量管理部门应加深对环境监测的质量认识&#xff0c;掌握环境监测的技术手段&#xff0c;定期评估环境监测程序的有效性和完整性&#xff0c;并且对环境监测数据进行趋势分析以寻找可以更好控制的区域&#xff0c;以保证企业的生产符合GM…

网络安全合规-网络安全工程师(一)

网络安全工程师的工作种类很多&#xff0c;当前这个图片说明了具体的工程师的工作种类有哪些&#xff0c;列举了一下。 互联网时代网络及科技迅速发展&#xff0c;随之而来的首要问题就是网络安全&#xff0c;因为已经出现的网络问题带来了巨大的经济损失&#xff0c;甚至各种…

ModaHub魔搭社区:安装、启动 Milvus 服务(CPU版)教程

目录 安装、启动 Milvus 服务 安装前提 操作系统 硬件 软件 确认 Docker 状态 拉取 Milvus 镜像 下载配置文件 启动 Milvus Docker 容器 常见问题 接下来你可以 安装、启动 Milvus 服务 CPU 版 MilvusGPU 版 Milvus 安装前提 操作系统 操作系统 版本 CentOS 7…