[javase学习笔记]-8.3 static关键字使用的注意细节

【0基础学java】教学日志:javaSE-面向对象3-this关键字、static关键字、代码块、package、import、封装、访问修饰符 【0基础学java】教学日志:javaSE-面向对象3本章概述一、this关键字二、static关键字三、代码块四、package五、import六、封装七、面向对象的三大特征八、使用访问控制符,实现封装(下次课讲)九、总结(下次课讲)十、作业(下次课讲)1、上机练习1——设计Dog和Penguin类2、上机练习2——打印Dog信息2-13、上机练习3——Dog类的带参构造方法4、上机练习4——操作企鹅性别属性 本章概述 本章属于面向对象第二章的内容,主要讲解this关键字、static关键字、代码块、p 阅读详情

这一节我们看静态在使用过程中应注意的几个细节。


上一节我们在学习成员变量与静态变量的区别时,对于两种变量的调用方式不同时出现了“无法从静态上下文中访问非静态变量”的错误,这个问题我们在以后会经常遇到。那么这是什么问题呢?我们从例子说起,我们把上一节中的Person类中方法printInfo进行静态修饰:

class Person
{
	String name;//姓名,这是一个成员变量
	static String country = "中国";//国籍,这是一个静态变量

	public static void printInfo()
	{
		System.out.println(name+":"+country);
	}
}

class StaticTest 
{
	public static void main(String[] args) 
	{
		Person p = new Person();
		p.name = "小强";
		p.printInfo();
	}
}

结果:


我们看到了一个和上一节完全相同的错误,而当我们把方法进行修改:

	public static void printInfo()
	{
		System.out.println(":"+country);
	}

结果:


我们看到当把printInfo方法中的非静态变量name去掉之后,程序正常运行,因此我们可以总结出static关键字使用中的一个常见问题,即:

第一个细节:静态方法中不能调用非静态成员,只能调用静态成员.这是由于我们知道静态成员是随着类的加载而存在,是先于对象存在的,而非静态的成员变量是随着对象的创建而存在,所以当我们在静态方法中调用非静态成员时,还没有创建对象,当然就不存在非静态变量.比如我们上面的例子,静态方法printInfo和静态变量country都会随着Person类的加载而加载,而成员变量name只有随着Person对象的创建才会存在,当我们在静态方法中直接调用name时,此时根本就不存在,当然会出错.

当然对于这个细节,也可以说是静态方法的一个局限性.非静态方法既可以访问静态成员,也可以访问非静态成员.

我们再看下一个比较常见的问题.

第二个细节:静态方法中不可以使用this或者super关键字.原因当然可以用静态的特点解释,super我们还没有学习,这里暂不说明,就拿this关键字来说,我们说this代表对象,那么当我们在静态方法中使用this时,this代表的就是当前类的实例,而静态方法和类是一起存在的,而该类的对象并不存在,所以会出错.我们看一个例子:

class Person
{
	String name;
	static String country = "中国";

	public static void printInfo()
	{
		System.out.println(this.name+":"+country);
	}
}

结果:


我们很清楚的就看到这是不合法的.

第三个细节:主函数是静态的.这个我们大家肯定都不陌生,我们从开始学习就在搞main函数,它的正确格式是:

public static void main(String[] args) 
那么我们再来看一个例子:

class StaticTest 
{
	int num = 4;
	public static void main(String[] args) 
	{
		printNum();
	}
	public void printNum()
	{
		System.out.println(num);
	}
}
结果:

我们会发现我们没有用好第一个细节,所以我们进一步修改:

class StaticTest 
{
	int num = 4;
	public static void main(String[] args) 
	{
		printNum();
	}
	public static void printNum()
	{
		System.out.println(num);
	}
}
结果:

哦,还有一个非静态成员变量,再一次修改:

这个过程真麻烦哦,那么我们是不是要在主函数中调用的成员都是静态的呢?如果真是这样,那么要对象干什么呢?我们知道主函数是程序的入口,对于面向对象语言,那么主函数也就对象访问的入口,是指挥对象工作的,如果没有对象不知道有多么可怕啊.

我们之前学习了两种调用方式,一种是通过类名调用,而另一种方式就是通过对象调用,那么我们为了规避静态的局限性,我们把上面的方法进行非静态化,并且通过对象去调用:

class StaticTest 
{
	int num = 4;
	public static void main(String[] args) 
	{
		new StaticTest().printNum();
	}
	public void printNum()
	{
		System.out.println(num);
	}
}
并且程序正常运行了.

第四个细节:在本类中,非静态成员前面省略的是this,而在静态成员前面省略的却是类名.比如上面的代码,实际上在Person类中,成员变量name前面省略的this,即this.name,而在静态变量country前面省略的类名Person,即Person.country,这一点我们在以后的使用多注意就可以了.

宝骏kiwi 630 730 560 E100 E200 E300 310 510 610 330 530维修手册电路图资料线路图接线图更新 2020-2022年宝骏RS-3维修手册和电路图。2020-2022年宝骏RS-3维修手册和电路图。2019-2021年宝骏RC-6维修手册和电路图。2019-2021年宝骏RC-6维修手册和电路图。2019-2020年宝骏RS-5维修手册和电路图。2019-2020年宝骏RS-5维修手册和电路图。2019-2020年宝骏RM-5维修手册和电路图。2019-2020年宝骏RM-5维修手册和电路图。2019-2021年宝骏510维修手册和电路图。2019-2021年宝骏510维修手册和电路图。 阅读详情

相关推荐

SGLang:结构化生成语言推理框架深度解读

SGLang是由斯坦福大学和加州大学伯克利分校联合提出的高性能大语言模型推理框架,针对复杂多轮对话、结构化输出等场景优化。其核心创新包括: RadixAttention机制:通过基数树数据结构实现跨请求的KV Cache自动复用,避免重复计算共享前缀 跳跃前瞻解码:对格式化输出中的固定模板部分直接填充,仅采样变量槽位,提升3-5倍生成速度 约束解码引擎:通过正则表达式和JSON Schema保证输出严格符合预定义格式 声明式DSL:提供类Python的编程接口简化复杂推理流程开发 相比传统框架,SGLang

Ricky Yang的专栏 331

java: 无法从静态上下文中引用非静态 方法

Error:(11, 9) java: 无法从静态上下文中引用非静态 方法 printArraylist(java.util.ArrayList<java.lang.String>) 解决办法有2个: ①:把调用的printArrayList的方法改为静态,在public后加static ②:创建一个实例,对原printArraylist进行调用,如下 即解决了问题 ...

weixin_38023259的博客 1万+

C# 原生数字孪生的尝试

本文介绍了使用C#实现数字孪生的基本思路。首先从爱普生官网下载机器人3D模型,然后通过Blender创建并导出带动画的FBX模型。在WPF项目中,使用HelixToolkit.SharpDX等插件加载模型,通过Viewport3DX进行3D渲染。关键点是通过动画控制器接收真实设备信号来驱动模型动画,实现物理实体与虚拟模型的同步。文中提供了完整的代码实现,包括模型导入、动画播放控制等核心功能。该方法为构建数字孪生系统提供了一种可行的技术方案。

qq_33529095的博客 1333

JavaSE之static关键字

这个案例主要讲的是,每一个学生都要对老师讲一遍早上好,我们分析一下这个简单案例,这个早上好是不是只是个动作,而且我们是不是需要全体同学都做这个动作,所以这个时候很容易想对我们的工具类,因为使用一个工具类可以代替这一复杂的操作,就不用n个同学调用n次方法了(其实使用实例方法,写个数组循环,从代码角度上简洁了,但是还是调用n次方法,但是上面的案例就不会,都是在用同一静态方法)。所以这就是静态方法的用处,当然我的例子简单,只是为了说明一些问题,如果遇到的复杂的动作,实际上抽象出来的静态方法更能体现价值!

weixin_56036523的博客 1141

bcftools实战指南:从VCF文件处理到变异分析全流程解析

在基因组数据分析中,VCF(Variant Call Format)文件是存储基因序列变异信息的标准格式,广泛应用于群体遗传学和生物信息学研究。其核心原理是通过结构化文本记录SNP、INDEL等变异位点的基因型、质量值和注释信息。掌握高效处理VCF文件的技术,对于提升变异检测、数据清洗和下游分析的工作流效率具有重要价值。在生物信息学工具生态中,bcftools作为处理VCF/BCF文件的瑞士军刀,通过模块化设计实现了数据查询、过滤、统计和格式转换等核心功能。其流式处理架构支持管道化操作,能有效应对海量基因组

weixin_29081703的博客 323

4 轴穿越机 Mark5 机架全解析:从历史演进到电机桨叶选型指南

本文围绕 4 轴穿越机 Mark5 机架展开,先介绍其发展历程(2018 年初代到 2023 年五代,迭代优化轻量化、刚性与兼容性),再明确其核心参数(轴距 220mm、兼容 4-6 寸桨等)对电机桨叶的约束。 详解电机(KV 值、尺寸、推力等)与桨叶(尺寸、螺距、材质等)选型要点及匹配原则(高 KV 配小桨、低 KV 配大桨),给出推重比、功率等理论计算公式,结合新手练习、花飞、竞速、航拍等场景提供具体选型案例,最后提及安全、成本、法规等注意事项,为爱好者提供全面选型参考。

bother3000的博客 1901

JavaSE之封装及Static关键字

摘要 本文介绍了面向对象编程中封装和static关键字的核心概念。在封装部分,重点讲解了private修饰符的使用,通过getter和setter方法提供安全的数据访问接口,以及this关键字用于区分成员变量和局部变量。同时详细说明了构造方法(无参和有参)的作用及使用场景,并介绍了标准JavaBean的编写规范。在static部分,阐述了静态成员的特点:属于类而非对象,可通过类名直接访问,并介绍了静态方法的使用限制。最后通过代码示例展示了如何在实际开发中应用这些概念。

2301_79327445的博客 879

STK轨道仿真环境搭建实战:从地月系到多天体场景

本文详细介绍了STK轨道仿真环境搭建的实战指南,从基础的地月系统到复杂的多天体场景。通过逐步操作说明和实用技巧,帮助用户快速掌握STK软件的使用方法,提升轨道仿真效率,适用于航天任务设计和教学演示。

weixin_30312563的博客 399

JavaSE——static关键字

本文介绍了Java中static关键字的使用方法和特点。static用于声明类成员(变量、方法、代码块),它们在类加载时初始化并被所有对象共享。静态成员可通过类名直接访问,无需实例化对象。文章详细说明了静态变量和方法的定义、初始化方式及访问权限,并对比了静态代码块和实例代码块的执行时机和顺序。通过具体代码示例,展示了静态成员在实际应用中的使用方式,包括静态变量的修改方法和代码块的执行顺序。最后指出static关键字在内部类中的应用将在后续章节讲解。

2301_80141533的博客 467

MIMO技术入门

MIMO:多天线技术,发射端和接收端有多个天线(注意:并不是指多个天线板,而是多套振子,每一套是一个独立的天线。) 4G:2、8天线 5G:4、64天线(64T64R) 手机也是多天线 MIMO实现效果的分类: 1)空间分集 。2)空间复用。3)波束赋形。 空间分集(space diversity) 作用:提升接收质量 利用多个天线发射或者接收一个数据流,避免单个信道衰落对整个链路的影响。(比如你的耳机坏了一只并不影响另一只) 空间复用(space multiplexing) 作用:提升速率 利

About1129的博客 2876

图神经网络学习笔记-点云数据处理(专题七)

本教程解释了如何利用图神经网络(Graph Neural Networks,GNNs)来处理和训练点云数据。尽管点云默认情况下不具有图结构,但我们可以利用 PyG 的转换工具,将其转化为适合 PyG 所提供的全套 GNN 模型的形式。关键思想是从点云数据中创建一个,通过 GNN 的消息传递机制,从中学习有意义的局部几何结构。这些点的表示可以被用于例如点云分类或分割等任务。

351

【JavaSe】面向对象篇(四) static关键字

JavaSe·面向对象篇(四) static关键字 1. 概述 关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了 2. 定义和使用格式 2.1 类变量 当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值,...

不想当架构师的程序员不是好程序员 884

H3C交换机命令大全,分模块好记忆!

在深入命令之前,我们先来了解H3C交换机的命令行基础。<H3C>[H3C]常用基础命令如下:这些基础命令是操作H3C交换机的敲门砖,熟练掌握后,我们将按模块深入探讨更具体的配置命令。H3C交换机的命令可以按功能模块分类,包括系统管理、接口配置、VLAN操作、链路聚合、路由配置、安全管理等。

网络技术联盟站 783

JavaSE:static关键字详解

static关键字,是java的关键字之一,表示“静态”可以用来修饰变量,方法(比如main方法),代码块不能修饰类static可以和四大访问修饰符组合使用有对象(创建对象将类实例化)则一定有类(类加载),但是有类(类加载)不一定有对象(创建对象将类实例化)

敢问路在何方,路在脚下 2055

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

JavaSE-构造方法,static关键字,创建对象

JavaSE-构造方法,static关键字,创建对象 构造方法 作用:创建对象,给对象中的成员进行初始化 特点: (1)方法名与类名相同 (2)没有返回值类型,没有void (3)没有具体的返回值 面向对象 举例 class Demo { static int i=1, j=2; static { display(i); **//**在类加载进内存时就会执行 } public static voi...

weixin_45137957的博客 552

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

JavaSE——面向对象9:static、final关键字、代码块、单例模式

JavaSE——面向对象9:static、final关键字、代码块、单例模式

雷神乐乐的博客 1276

【JAVASE】static关键字

首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

Robin的博客 215

JAVASE的学习笔记(二))(封装,static,this,new关键字)

JAVASE的学习笔记(二) static和this关键字的浅薄认知 this和对象有关,static只和类有关 static:当类在被JVM加载的时候,首先会加载类中由static修饰的所有属性,方法, 代码块。static修饰的内容,在整个程序运行期间,只有一份,而且所有对象共享。 它的生命周期从程序的开始到结束。static变量置于方法区中。 this:this代表当前对象的一个引用。 使用this来调用其他构造方法的时候其必须 是第一条语句 类只要被创建就会加载static修饰的内容,class

qq_47267252的博客 428

JavaSE--static关键字

重学JavaSe后的补充 JavaSE–内存与数组 JavaSE–内存与对象 Java面向对象总结 Java基础总结 文章目录1.static1)static修饰变量(静态变量)①何时使用static定义属性?2)static修饰方法(静态方法)①注意事项:I.静态不能直接访问非静态II.静态方法当中不能用this。②何时使用?③总结static定义属性、方法3)static内存图分析:4)静态代...

Zzh1110的博客 1627

JavaSE 13 static 关键字

第十八章 static 关键字 18.1 静态static关键字概述 一旦用了static关键字,那么这样的内容不再属于对象自己,而是属于类的,所以凡是本类的对象,都功效同一份。 18.2 静态static关键字修饰成员变量 如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类,多个对象共享一份数据。 //创建一个类 public class Student {...

Niiuu的博客 503

javaSE之static关键字

static也是javaSE重要的关键字之一。它的作用主要体现在以下两方面: static类属性

L_R 267

JAVASE进阶day01(static,extends,权限修饰符,final关键字)

1.在Java中,子类不一定非要显式地调用父类的构造函数,但是它必须确保父类的构造函数被调用。如果子类不显式调用父类的构造函数,编译器会自动插入一个默认的对父类无参数构造函数的调用。当创建一个子类的对象时,首先需要完成父类对象的构造过程。被static修饰的变量在方法区中只占一份节省内存,被static修饰的变量不可被更改。所有类对象共享一个。2.这是因为在Java中,每个类都是另一个类的子类(直接或间接地继承自。1.子类中所有构造方法的访问默认都会先访问父类的无参构造方法。2.缺点:降低了子类的独立性。

qq_65095414的博客 1137

【JAVA进阶】static关键字详解

开发中经常遇到一些问题,一个问题通常有n种解法的,但其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。由于工具里面都是静态方法,直接用类名即可访问,因此,工具类无需创建对象,建议将工具类的构造器进行私有。特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行。代码块是类的5大成分之一(成员变量、构造器,方法,代码块,内部类),定义在类中方法外。之前我们定义的方法有的有static修饰,有的是没有的,有什么不同?2.static修饰的成员变量是什么?

Javascript_tsj的博客 6337

JavaSE笔记之Static关键字

1.概述 关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。 2.定义和使用格式 当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改 该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。 类变量:使用 static关键字修饰的成员变量 2.1类变量 static 数据类型 变量名; 代码举例...

随风的专栏 316

JAVASE 小白学习笔记 static关键字的解析

在Java学习中,我们经常会见到static关键字。static关键字在java中指的的是静态的意思,可以修饰成员变量与成员方法。 下面对于static关键字进行总结。 1.static 关键字修饰成员变量 当staic关键字修饰成员变量时,此变量被共享变量,被这个类中的所有对象所共享。 ...

qq_41537102的博客 280

【JavaSE基础】Static关键字

Static关键字 1、修饰成员变量 -> 静态成员变量 静态变量与实例变量的区别: 1.1内存存储的位置不同 Java栈: 构造方法函数调用; Java堆: New对象(实例变量); 字符串常量池(jdk1.6之后); 方法区: 静态变量; 字符串常量池(jdk1.6之前 -> contant pool); 1.2 是否与对象有关 实例变量 -> 与对象有关 ...

Sampson_S的博客 204

JavaSE:this、super、final、static、abstract关键字

几种关键字 this关键字 Java提供一个关键字this来指代当前对象,用于在方法中访问对象的其他成员。 通过this关键字调用成员变量,解决与局部变量名称冲突问题: class Person{ String name; public Person (String name) { this.name=name; //将局部变量name赋值给成员变量name. } } ...

SpiderManFang的博客 293
上一篇: [javase学习笔记]-8.2 成员变量与静态变量的区别
下一篇: [javase学习笔记]-8.4 main函数的解析与细节
fbl_csdn
博客等级 码龄12年 24粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值