【java学习—八】关键字static(4)

news2024/11/15 7:02:42

文章目录

  • 1. 前言
  • 2. 关键字static
  • 3. 代码理解
    • 3.1. 类变量
    • 3.2. 类方法
    • 3.3. 工具类
    • 3.4. 总结
  • 4. 注意事项


1. 前言

    当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过 new 关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。

在这里插入图片描述

2. 关键字static

举个例子来说明关键字 static的作用
创建一个Circle类

class Circle{
	private double radius;
	public Circle(double radius){this.radius=radius;}
	public double findArea(){return Math.PI*radius*radius;}}

创建两个 Circle 对象

	Circle c1=new Circle(2.0);//c1.radius=2.0
	Circle c2=new Circle(3.0);//c2.radius=3.0

    (1)Circle 类中的变量 radius 是一个实例变量 (instance variable) ,它属于类的每一个对象,不能被同一个类的不同对象所共享
    (2)上例中 c1 的 radius 独立于 c2 的 radius ,存储在不同的空间。 c1 中的 radius变化不会影响 c2 的 radius ,反之亦然。

如果想让一个类的所有实例共享数据,就用类变量!

3. 代码理解

3.1. 类变量

添加一个Chinese类,有country、name、age属性,如下:

package day08;

public class Chinese {
	String country;//类变量:不用实例化,直接"类名.属性名"就可以使用,是类的一部分,被所有这个类的实例化对象所共享,也叫做"静态变量"。
	String name;//实例变量:只有实例化后才能使用,属于实例化对象的一部分,不能共用
	int age;    //实例变量

}

在Test.java中使用new 关键字产生对象:

package day08;

public class Test {
	public static void main(String[] args) {

		Chinese c =new Chinese();
		c.country = "中国";//写了一次国籍
		c.name = "xx";
		c.age = 11;
		
		Chinese c1 =new Chinese();
		c.country = "中国";//又写了一次国籍
		c.name = "xx";
		c.age = 11;
		
		Chinese c2 =new Chinese();
		c.country = "中国";//又写了一次国籍
		c.name = "xx";
		c.age = 11;
		
		//问题:既然这些人都是中国国籍,调用Chinese类,有没有办法能只写一次国籍,让所有对象都使用一个相同的国籍
		//答案:使用static

	}
	
}

使用static后,代码如下:

Chinese类:

package day08;

public class Chinese {
	static String country;
	String name;
	int age;

}

Test.java:

package day08;

public class Test {
	public static void main(String[] args) {
 		
 		Chinese.country = "中国";
		Chinese c =new Chinese();
		//c.country = "中国";//写了一次国籍
		c.name = "xx";
		c.age = 11;
		
		Chinese c1 =new Chinese();
		//c.country = "中国";//又写了一次国籍
		c.name = "xx";
		c.age = 11;
		
		Chinese c2 =new Chinese();
		//c.country = "中国";//又写了一次国籍
		c.name = "xx";
		c.age = 11;

		//打印三个人的国籍
		System.out.println(c.country);
		System.out.println(c1.country);
		System.out.println(c2.country);
		//或者使用类变量打印国籍
		//System.out.println(Chinese.country);//输出:中国
		//因为已知不管什么人只要来自Chinese类就一定是中国人,那我们只要打印一次就知道所有人的国籍了,故使用类变量来打印。

	}
}

运行结果:
在这里插入图片描述

3.2. 类方法

    static除了可以修饰变量,还可以修饰方法(静态方法),还是上面的例子,我给Chinese加一个test()方法,并用static修饰:
Chinese类:

package day08;

public class Chinese {
	static String country;
	String name;
	int age;
	
	public static void test() {
		System.out.println("这是一个静态方法");
	}

}

Test.java:

package day08;

public class Test {
	public static void main(String[] args) {
 		
 		Chinese.country = "中国";
		Chinese c =new Chinese();
		//c.country = "中国";//写了一次国籍
		c.name = "xx";
		c.age = 11;
		
		Chinese c1 =new Chinese();
		//c.country = "中国";//又写了一次国籍
		c.name = "xx";
		c.age = 11;
		
		Chinese c2 =new Chinese();
		//c.country = "中国";//又写了一次国籍
		c.name = "xx";
		c.age = 11;

		//打印三个人的国籍
		//System.out.println(c.country);
		//System.out.println(c1.country);
		//System.out.println(c2.country);
		//或者使用类变量打印国籍
		System.out.println(Chinese.country);//输出:中国
		//因为已知不管什么人只要来自Chinese类就一定是中国人,那我们只要打印一次就知道所有人的国籍了,故使用类变量来打印。
		Chinese.test();//调用static方法

	}
}

运行结果:
在这里插入图片描述

总结:类属性、类方法的设计思想
(1)类属性作为该类各个对象之间共享的变量。在设计类时 , 分析哪些类属性不因对象的不同而改变,将这些属性设置为类属性相应的方法设置为类方法
(2)如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。

类方法通常在设计工具类被使用

3.3. 工具类

举个例子:
判断一个字符串是否为空字符串,普通写法如下:

package day08;

public class Test {
	public static void main(String[] args) {
 		String s = "11";
		if(s != null && s.equals("")) {//判断s不为空字符串
			//在未来的开发中,可能会多次使用这一判断,那么在大量次数的基础上来看,就会发现代码的重复就很多了
			//所以我们把这样的代码给抽取到"工具类"做成一个方法
		}
	}
}

抽取到"工具类"做成一个方法(Utils.java):

package day08;

public class Utils {
	//判断字符串是不是一个空字符串
	public static boolean isEmpty(String s) {
		boolean flag = false;
		if(s != null && !s.equals("")) {//判断s不为空字符串
			flag = true;
		}
		return flag;
	}
}

Test.java进行调用:

package day08;

public class Test {
	public static void main(String[] args) {
 		String s = "11";
		System.out.println(Utils.isEmpty(s));//输出:true
	}
}

运行结果:
在这里插入图片描述

3.4. 总结

关键字
使用范围:
    在Java类中,可用static修饰属性方法、代码块、内部类

被修饰后成员具备以下特点:
    (1)随着类的加载而加载(类加载后,静态的方法或者属性就能用了,“类名.属性(或方法)”)
    (2)优先于对象存在    (不用new就能用)
    (3)修饰的成员,被所有对象所共享
    (4)访问权限允许时,可不创建对象,直接被类调用

注意:
    类变量,这种可以被所有的实例化对象共享的属性,使用起来要慎重,因为只要改动,所有的类对象都能得到变化。

如何证明static修饰的成员被所有对象共享?
创建一个构造方法,在构造方法中使用static修饰的count,每执行一次构造器就对count进行’+1’操作:

问题:为什么要在构造方法中对count进行+1操作
答:因为new对象会自动执行构造方法。

Chinese类:

package day08;

public class Chinese {
	public Chinese() {//构造方法
		Chinese.count += 1;
	}
	
	static String country;
	public static int count;//静态变量count
	String name;
	int age;
	
	public static void test() {
		System.out.println("这是一个静态方法");
	}

	public static void showCount() {//调用的方法
		System.out.println("总共new了" + Chinese.count + "个对象");
	}
}

Test.java:

package day08;

public class Test {
	public static void main(String[] args) {
		//需求:想知道new了多少个Chinese对象
		Chinese c =new Chinese();
		System.out.println(Chinese.count);
		Chinese c1 =new Chinese();
		System.out.println(Chinese.count);
		Chinese c2 =new Chinese();
		System.out.println(Chinese.count);
		Chinese c3 =new Chinese();
		System.out.println(Chinese.count);
		Chinese c4 =new Chinese();
		System.out.println(Chinese.count);
		Chinese c5 =new Chinese();
		System.out.println(Chinese.count);
		
		Chinese.showCount();//输出:总共new了6个对象

		//由此可以看出Chinese.count这个类属性被所有的实例化对象共享了(如果不被共享,count的值就不会改变)
	}
}

运行结果:

在这里插入图片描述

4. 注意事项

①没有对象的实例时,可以用类名.方法名()的形式访问由 static 标记的类方法。
在 static 方法内部只能访问类的 static 属性,不能访问类的非 static 属性。

Class Person{
	private int id;
	private static int total = 0;
	
	public static int getToalPerson(){
	id++; // 非法
	return total;
	}
	
	public Person() {
	total++;
	id = total;
	}
}
	
public class TestPerson {
	public static void main(String[] args) {
	System.out.println("Number of total is " +Person.getTotalPerson());//0
	// 没有创建对象也可以访问静态方法
	Person p1 = new Person();
	System.out.println( "Number of total is "+ Person.getTotalPerson());//1
	}
}

③因为不需要实例就可以访问 static 方法,因此 static 方法内部不能有 this ( 也不能有super)。
④重载的方法需要同时为 static 的或者非 static 的。

class Person {
	private int id;
	private static int total = 0;
	public static void setTotalPerson(int total){
	this.total=total; // 非法,在 static 方法中不能有 this ,也不能有 super
}
	public Person() {
	total++;
	id = total;
	}
}

public class TestPerson {
	public static void main(String[] args) {
	Person.setTotalPerson(3);
	} 
}

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

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

相关文章

10-16/10-17 JavaWeb入门/servlet

JavaWeb 现实生活中的互联网项目都是javaWeb项目, 包含网络, 多线程, 展示: HTML等其他的前端技术, 界面窗体展示(Swing包,AWT包 窗体), C#, JAVAWeb架构:(面试重点:要求记忆) B/S: 浏览器/服务器 优点: 以浏览器作为客户端, 使用这个软件, 用户不需要下载客户端,…

Spring Cloud之服务熔断与降级(Hystrix)

目录 Hystrix 概念 作用 服务降级 简介 使用场景 接口降级 服务端服务降级 1.添加依赖 2.定义接口 3.实现接口 4.Controller类使用 5.启动类添加注释 6.浏览器访问 客户端服务降级 1.添加依赖 2.application.yml 中添加配置 3.定义接口 4.Controller类使用 …

Chat Towards Data Science|如何用个人数据知识库构建 RAG 聊天机器人?

生成式人工智能时代,开发者可以借助大语言模型(LLM)开发更智能的应用程序。然而,由于有限的知识,LLM 非常容易出现幻觉。检索增强生成(RAG)https://zilliz.com/use-cases/llm-retrieval-augment…

TS 入门指南

TS 类型基本用法 TS简介 TypeScript,简称 TS, 是一种由微软开发的编程语言,它是对 JavaScript 的一个增强让我们更加方便地进行类型检查和代码重构,提高代码的可靠性和可维护性同时,TypeScript 还支持 ECMAScript 的…

对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中的所有值为x的数据元素

对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中的所有值为x的数据元素 算法思路: 用count标记遇到x的次数,每次遇到x,count 遇到非x的元素,把它前移…

探索企业基本信息查询API:数据访问的便捷方式

前言 当涉及到获取企业的基本信息时,传统的方法往往需要大量的时间和人力资源,以收集、整理和验证数据。然而,现在有一种便捷的方式可以解决这个问题,那就是通过企业基本信息查询API。本文将探讨这种API是如何成为数据访问的便捷…

【Hive SQL】字符串操作函数你真的会用吗?

文章目录 ININSTRSUBSTRLOCATELIKE 前言: 今天在做一个需求的时候,需要判断字符串中是否包含一个子串,然后我发现了我平常没注意到的一个点,通过这篇博文来记录一下。 IN IN 函数用于判断一个元素是否存在于所给的元素组中&…

【基础架构设计】仿12306系统公共组件设计深度解析

仿12306系统学习 学习路线 12306 铁路购票系统学习总体分为三块:组件库开发、业务梳理以及业务系统开发。 组件库开发 组件库的产出源于对公共功能的封装,避免了在不同项目之间相互复制代码的情况。当然,如果这种复制代码的方式出现问题&a…

红酒种类及更多的红酒基本知识

从法国不拘一格的绿色牧场到北加州的金山,各种不同类型的红葡萄酒从淡色到豪放,从各种不同的种植地区走向世界各地的餐桌。来自云仓酒庄品牌雷盛红酒分享红葡萄酒在味道、酒体、颜色、香味以及它们提供的整体体验方面可以有很大的不同。 为合适的场合选…

amr文件苹果手机怎么打开?四个方法教会你!

Amr格式文件因其资源占用率低、传输方便,通常用作各大手机厂商广泛使用的一种保存录音文件的格式,非常适合制作来电铃声。但是amr音频格式的适用范围有限,很多时候就需要把amr转换成兼容性更好的mp3格式。如何将AMR文件转换为mp3然后在苹果手…

Linux 内核文件系统dentry_path_raw函数

文章目录 一、简介1.1 __dentry_path1.2 prepend_name1.3 d_path 二、dmeo参考资料 一、简介 // linux-5.4.18/fs/d_path.cchar *dentry_path_raw(struct dentry *dentry, char *buf, int buflen) {return __dentry_path(dentry, buf, buflen); } EXPORT_SYMBOL(dentry_path_r…

语雀停服8小时,P0级事故,故障原因和补偿来了。

昨天互联网圈子里发生了一件大事,那就是语雀的 P0 级事故,前后足足停服了 7 个多小时,放眼整个互联网的发展史,都是相当炸裂的表现。 语雀是技术大牛玉伯在蚂蚁金服内部孵化出来的一个云端知识库,整体的界面非常清爽&…

[SQL开发笔记]IN操作符: 在WHERE子句中规定多个值

上一实例我们在where子句使用(year2022 or year2020),如果我们需要在WHERE子句中规定多个值呢?这时我们将学习IN操作符 一、功能描述: 在WHERE子句中规定多个值。 二、IN操作符语法详解: IN操作符语法: SELECT col…

【Linux】MAC帧协议 + ARP协议

文章目录 📖 前言1. 数据链路层2. MAC帧格式3. 再谈局域网4. ARP协议4.1 路由器的转发过程:4.2 ARP协议格式: 5. 如何获得目的MAC地址 📖 前言 在学完网络层IP协议之后,本章我们将继续向下沉一层,进入到数…

STM32-通用定时器

通用定时器 通用定时器由一个可编程预分频器驱动的16位自动重新加载计数器组成。应用:测量输入的脉冲长度信号(输入捕获)、产生输出波形(输出比较和PWM)。 脉冲长度和波形周期可以从几微秒调制到几毫秒,使用…

记录隐藏挖矿木马rcu_tasked的查杀

记录一次项目中挖矿病毒的经历 这是黑客使用的批量蔓延病毒的工具,通过如下脚本 [rootServer .cfg]# cat /home/pischi/.bash_history cd /root/ nvidia-smi;ls -a;cd .cfg;ls -a;wc -l ip ./key 20 -f ip pass 22 "nproc;nvidia-smi;rm -rf .cfg;mkdir .cfg…

怎么做好网络软文推广?媒介盒子为你揭秘

不管是初创公司还是成熟公司,都需要打响品牌知名度,而有些公司在网络推广中的预算不是很高,这个时候就可以利用软文进行推广,今天媒介盒子就来告诉大家,如何写好网络推广软文。 一、 明确推广目标 确定推广目标有助于…

【备考网络工程师】如何备考2023年网络工程师之常见考点篇(1)

文章目录 写在前面涉及知识点1、NSLOOKUP命令设置的几个类型(DNS服务器资源记录类型)2、结构化综合布线系统的组成3、xDSL及相关概念4、私有地址及A-E类地址4.1 、私有地址4.2 、A-E类地址 总结 写在前面 其实做模拟或真题时候,总是会在关键…

建联合作1000+达人,如何高效管理?

随着社交媒体的发展,达人营销已成为品牌营销重要的方式之一,甚至可以说是必选项。 对于很多品牌商家来说,一次合作几百个不同类型、不同社媒平台的达人,已屡见不鲜。在电商大促前、主推单品爆品时,同时合作上千个达人&…

通过js来实现用身份证号来判断性别和出生年月

html: <input type"text" id"shenfenzhenghao" oninput"hao()" placeholder"证件号"><input type"text" id"xingbie" disabled"disabled" placeholder"性别"><input type&qu…