面向对象高级-static

news/2024/11/1 12:07:21/

文章目录

      • 1.1 static修饰成员变量
      • 1.2 static 修饰成员变量的应用场景
      • 1.3 static 修饰成员方法
      • 1.4 工具类来看 static 的应用
      • 1.5 static 的注意事项
      • 1.6 static 应用(代码块)
      • 1.7 static应用(单例设计模式)

在这里插入图片描述


static 读作静态,可以用来修饰 成员变量,也能修饰成员方法。

1.1 static修饰成员变量

Java 中的成员变量按照有无 static 修饰 分为两种:类变量、实例变量。它们的区别如下图所示:

在这里插入图片描述
在这里插入图片描述

由于 静态变量是属于类 的,只需要通过类名就可以调用:类名.静态变量

实例变量是属于对象 的,需要通过对象才能调用:对象.实例变量

  • 下面是代码演示(注意静态变量,和实例变量是如何调用的)

在这里插入图片描述

看一下上面代码的 内存原理

在这里插入图片描述

| 在这里插入图片描述


1.2 static 修饰成员变量的应用场景

在开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成 类变量 。

我们看一个案例

需求:系统启动后,要求用于类可以记住自己创建了多少个用户对象。

  • 第一步:先定义一个User类,在用户类中定义一个 static 修饰的变量,用来表示在线人数;
java">public class User{public static int number;//每次创建对象时,number自增一下public User(){User.number++;}
}
  • 第二步:再写一个测试类,再测试类中创建4个User对象,再打印 number 的值,观察 number 的值是否再自增。
java">public class Test{public static void main(String[] args){//创建4个对象new User();new User();new User();new User(); //查看系统创建了多少个User对象System.out.println("系统创建的User对象个数:"+User.number);}
}

运行上面的代码,查看执行结果是:系统创建的User对象个数:4

1.3 static 修饰成员方法

成员方法根据有无 static 也分为两类:类方法、实例方法

在这里插入图片描述

有static修饰的方法,是属于类的,称为类方法;调用时直接用类名调用即可。

无static修饰的方法,是属于对象的,称为实例方法;调用时,需要使用对象调用。

我们看一个案例,演示类方法、实例方法的基本使用

  • 先定义一个 Student 类,在类中定义一个类方法、定义一个实例方法
java">public class Student{double score;//类方法:public static void printHelloWorld(){System.out.println("Hello World!");System.out.println("Hello World!");}//实例方法(对象的方法)public void printPass(){//打印成绩是否合格System.out.println(score>=60?"成绩合格":"成绩不合格");}
}
  • 在定义一个测试类,注意类方法、对象方法调用的区别
java">public class Test2{public static void main(String[] args){//1.调用Student类中的类方法Student.printHelloWorld();//2.调用Student类中的实例方法Student s = new Student();        s.printPass();//使用对象也能调用类方法【不推荐,IDEA连提示都不给你,你就别这么用了】s.printHelloWorld();//Student.printHelloWorld(); 报错,实例方法只能使用对象调用}
}

搞清楚 类方法 和 实例方法 如何调用之后,接下来再聊一聊 static 修饰成员方法的内存原理。

java">1.类方法:static修饰的方法,可以被类名调用,是因为它是随着类的加载而加载的;所以类名直接就可以找到static修饰的方法2.实例方法:非static修饰的方法,需要创建对象后才能调用,是因为实例方法中可能会访问实例变量,而实例变量需要创建对象后才存在。所以实例方法,必须创建对象后才能调用。

在这里插入图片描述

| 在这里插入图片描述


1.4 工具类来看 static 的应用

需求: 生成验证码

如果一个类中的方法全都是静态的,那么这个类中的方法就全都可以被类名直接调用,由于调用起来非常方便,就像一个工具一下,所以把这样的类就叫做工具类。

  • 我们写一个生成验证码的工具类
java">public class MyUtils{public static String createCode(int n){//1.定义一个字符串,用来记录产生的验证码String code = "";//2.验证码是由所有的大写字母、小写字母或者数字字符组成//这里先把所有的字符写成一个字符串,一会从字符串中随机找字符String data = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKMNOPQRSTUVWXYZ";//3.循环n次,产生n个索引,再通过索引获取字符Random r = new Random();for(int i=0; i<n; i++){int index = r.nextInt(data.length());char ch = data.charAt(index);//4.把获取到的字符,拼接到code验证码字符串上。code+=ch;}//最后返回code,code的值就是验证码return code;}
}

工具类的使用就是这样子的

在补充一点,工具类里的方法全都是静态的,推荐用类名调用为了防止使用者用对象调用。我们可以把工具类的构造方法私有化。

java">public class MyUtils{//私有化构造方法:这样别人就不能使用构造方法new对象了private MyUtils(){}//类方法public static String createCode(int n){...}
}

1.5 static 的注意事项

静态方法可以直接方法静态成员, 不可以直接访问非静态成员.

非静态方法既可以访问静态成员 也可以访问非静态成员.


1.6 static 应用(代码块)

代码块根据有无static修饰分为两种:静态代码块、实例代码块

静态代码块:

在这里插入图片描述

java">public class Student {static int number = 80;static String schoolName = "清华大学";// 静态代码块static {System.out.println("静态代码块执行了~~");schoolName = "清华大学";}
}

静态代码块不需要创建对象就能够执行

java">public class Test {public static void main(String[] args) {// 目标:认识两种代码块,了解他们的特点和基本作用。System.out.println(Student.number);System.out.println(Student.number);System.out.println(Student.number);System.out.println(Student.schoolName); // 清华大学}
}

执行上面代码时,发现没有创建对象,静态代码块就已经执行了。

在这里插入图片描述

关于静态代码块重点注意:静态代码块,随着类的加载而执行,而且只执行一次。

再来了解一下实例代码块

在这里插入图片描述

实例代码块的作用和构造器的作用是一样的,用来给对象初始化值;而且每次创建对象之前都会先执行实例代码块。

java">public class Student{//实例变量int age;//实例代码块:实例代码块会执行在每一个构造方法之前{System.out.println("实例代码块执行了~~");age = 18;System.out.println("有人创建了对象:" + this);}public Student(){System.out.println("无参数构造器执行了~~");}public Student(String name){System.out.println("有参数构造器执行了~~");}
}

接下来在测试类中进行测试,观察创建对象时,实例代码块是否先执行了。

java">public class Test {public static void main(String[] args) {Student s1 = new Student();Student s2 = new Student("张三");System.out.println(s1.age);System.out.println(s2.age);}
}

对于实例代码块重点注意:实例代码块每次创建对象之前都会执行一次


1.7 static应用(单例设计模式)

关于 static 的应用我们再补充一个使用的技巧,叫做单例设计模式。

单例设计模式

1. 单例设计模式能够解决什么问题?
答: 使一个类只能有一个对象2.单例设计模式开发步骤?
①私有化构造方法
②提供一个私有类变量,这个类变量的数据类型是该类本身,并赋值
③提供一个公共的类方法,返回本类对象

执行原理

在这里插入图片描述



http://www.ppmy.cn/news/1543575.html

相关文章

Django中分组查询(annotate 和 aggregate 使用)

在 Django 中&#xff0c;aggregate() 和 annotate() 是两个常用的聚合函数。它们都可以用来对一组查询结果进行聚合操作&#xff0c;但它们的作用是有所不同的。 aggregate() 是用于聚合整个查询集的结果&#xff0c;通常用于返回一个值&#xff0c;例如计算查询集中所有结果…

四个模型(CV、CA、左转CT、右转CT)的交互式多模型系统,介绍与MATLAB例程

文章目录 引言一、模型概述1.1 连续变量模型(CV)1.2 离散变量模型(CA)1.3 左转控制器(CT)1.4 右转控制器(CT)二、交互式多模型系统2.1 系统架构三、MATLAB实现3.1 MATLAB代码3.2 代码说明四、总结引言 在现代控制系统和信号处理领域,多模型系统是一种有效的设计方法,…

基于SpringBoot+微信小程序+协同过滤算法+二维码订单位置跟踪的农产品销售平台-新

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; “农产品商城”小程序…

如何在Linux环境中的Qt项目中使用ActiveMQ-CPP

文章目录 代码1&#xff1a;消费者代码2&#xff1a;生成者 之前在Linux下的qt程序中使用activeMQ的时候也是用了很多时间去研究&#xff0c;本来想的是好好记录一下&#xff0c;但是当时顾着写代码。很多细节也不想再去走一遍了。大概写一下怎么使用就行了。注意&#xff1a;一…

Terraform Provider 加速方案

引言 Terraform 是一个安全和高效的用来构建、更改和管理基础架构的工具&#xff0c;其实现了基础设施即代码&#xff08;Infrastructure-as-Code&#xff0c;IaC&#xff09;&#xff0c;即通过代码来描述基础设施&#xff0c;可以通过代码来管理例如 AWS、阿里云等公有云资源…

呼吁中兴向全国免费开放专利许可,支持国产创新,你支持吗?

10月21日&#xff0c;联想向英格兰和威尔士高等法院起诉中兴专利侵权&#xff0c;引发网友热议。 10月30日&#xff0c;中兴在网上做出回应&#xff0c;表示虽难以理解但仍表示尊重。 至此&#xff0c;围观群众的目光也被两家大厂彻底吸引。联想、中兴为何对簿公堂&#xff0…

【17】 傅立叶分析

傅立叶分析(Fourier Analysis)是Excel数据分析工具库中的一种方法,用于将时间序列数据分解为不同频率的正弦波(sinusoidal components)。它特别适用于分析周期性数据或信号处理,帮助用户发现数据中的周期性模式、频率成分及其幅度。 傅立叶变换将复杂的时间序列数据转化…

第N5周:Pytorch文本分类入门

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 本周任务&#xff1a; 了解文本分类的基本流程学习常用数据清洗方法学习如何使用jieba实现英文分词学习如何构建文本向量 前期准备 加载数据 import torch…