面向对象--静态

目录

一、静态

1.1 static修饰成员变量

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

1.3 static修饰成员方法

1.4 工具类

1.5 static的注意事项

1.6 static应用(代码块)


 

面向对象基本理解 写完会在此处放上链接

一、静态

 

面向对象编程中很常见的一个关键字static.

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

1.1 static修饰成员变量

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

e507698e299046168d7e1a1723f6799e.png

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

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

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

f7feea13605940f58eb0ce01d16ca81d.png

来看一下上面代码的内存原理 2e73ed549a68430d8f1c220fcd60e21e.png

最后总结一下

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

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

写个需求

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

 

  • 第一步:先定义一个User类,在用户类中定义一个static修饰的变量,用来表示在线人数;

public class User{public static int number;//每次创建对象时,number自增一下public User(){User.number++;}
}
  • 第二步:再写一个测试类,再测试类中创建4个User对象,再打印number的值,观察number的值是否再自增。

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);}
}

 运行上面的代码,查看执行结果是

1.3 static修饰成员方法

 

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

07d75019b3cc4ffaba462cedb2bcf8be.png

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

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

  • 先定义一个Student类,在类中定义一个类方法、定义一个实例方法

 

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?"成绩合格":"成绩不合格");}
}
  • 在定义一个测试类,注意类方法、对象方法调用的区别

public class Test2{public static void main(String[] args){//1.调用Student类中的类方法Student.printHelloWorld();//2.调用Student类中的实例方法Student s = new Student();        s.printPass();//使用对象也能调用类方法【不推荐,IDEA连提示都不给你,你就别这么用了】s.printHelloWorld();}
}

static修饰成员方法的内存原理。

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

22b9da9cbb1342b4bde33125dafe042f.png以上就是  static修饰成员变量、和静态修饰成员方法这两种用法。

1.4 工具类

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

  • 写一个生成验证码的工具类  
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;}
}
  • 接着可以在任何位置调用MyUtilscreateCOde()方法产生任意个数的验证码

//比如这是一个登录界面
public class LoginDemo{public static void main(String[] args){System.out.println(MyUtils.createCode());}
}
//比如这是一个注册界面
public class registerDemo{public static void main(String[] args){System.out.println(MyUtils.createCode());}
}

工具类的使用

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

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

 

1.5 static的注意事项

 

记住三点

  1. 类方法中可以直接访问类成员,不可以直接访问实例成员
  2. 实例方法中既可以直接访问类成员,也可以直接访问实例成员
  3. 实例方法中可以出现this关键之,类方法中不可以出现this关键字
public class Student {static String schoolName; // 类变量double score; // 实例变量// 1、类方法中可以直接访问类的成员,不可以直接访问实例成员。public static void printHelloWorld(){// 注意:同一个类中,访问类成员,可以省略类名不写。schoolName = "黑马";printHelloWorld2();System.out.println(score); // 报错的printPass(); // 报错的ystem.out.println(this); // 报错的}// 类方法public static void printHelloWorld2(){}// 实例方法public void printPass2(){}// 实例方法// 2、实例方法中既可以直接访问类成员,也可以直接访问实例成员。// 3、实例方法中可以出现this关键字,类方法中不可以出现this关键字的public void printPass(){schoolName = "黑马2"; //对的printHelloWorld2(); //对的System.out.println(score); //对的printPass2(); //对的System.out.println(this); //对的}
}

 

1.6 static应用(代码块)

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

 

静态代码块:

 

格式: static{}

特点:类加载时自动执行,由于类只会加载一次,所有静态代码块也只会执行一次;

作用:完成类的初始化:列如:对类变量的初始化赋值。

 

public class Student {static int number = 80;static String schoolName = "黑马";// 静态代码块static {System.out.println("静态代码块执行了~~");schoolName = "静态代码块";}
}

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

public class Test {public static void main(String[] args) {System.out.println(Student.number);System.out.println(Student.number);System.out.println(Student.number);}
}

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

静态代码块,随着类的加载而执行,而且只执行一次。

 

实例代码块:“

格式:{}

特点:每次创建对象时,执行实例代码块,并且在构造器前执行。

作用:和构造器一样,都是用来完成对象初始化  列如:对实例变量进行初始化赋值。

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("有参数构造器执行了~~");}
}

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

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);}
}

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一台Mac同时安装vue2和vue3

背景&#xff1a;电脑需要运行vue2和vue3项目&#xff0c;就得同时有vue2和vue3环境&#xff0c;之前以配置好vue2了&#xff0c;现在增加vue3 1. 新建一个安装vue3的目录 进入vue3文件夹安装vue3 // 注意这里没有参数-g&#xff0c;因为-g全局安装的命令 npm install vue/cli…

Jumpserver教程01:部署jumpserver

Jumpserver教程 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com 转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-02-11 csdn 博客名称&#xff1a;五维空间-影子&#xff0c;欢迎关注 简要说明…

【计算机网络】进程通信

进程 process 客户和服务器进程 下载文件表示为客户 &#xff0c;上载文件的对等方表示为服务器进程与计算机网络之间的接口 套接字 socket 应用层与传输层之间的接口是建立网络应用程序的可编程接口 API进程寻址 为了标识接收进程 需要两种信息 主机的地址目的主机中的接收进程…

实景三维数据库管理系统助力实景三维中国建设

四维轻云实景三维平台作为立足基础测绘与实景三维建设工作的产品&#xff0c;致力于通过技术创新与应用&#xff0c;支持构建时空一体、联动更新、按需服务、开放共享的实景三维数据体系&#xff0c;实现对实景三维数据从处理、建库、更新、管理到应用服务的全生命周期管理&…

多视图特征学习 Multi-view Feature Learning既可以被看作是一种学习框架,也可以被看作是一种具体的学习算法!

Multi-view Feature Learning 1.多视图特征学习Multi-view Feature Learning的基本介绍总结 1.多视图特征学习Multi-view Feature Learning的基本介绍 多视图特征学习是一种利用多视图数据集来进行联合学习的机器学习方法。多视图数据指的是对同一事物从多种不同的途径或角度进…

【c++基础】扑克牌组合

说明 小明从一副扑克牌中&#xff08;没有大小王&#xff0c;J认为是数字11&#xff0c;Q是12&#xff0c;K是13&#xff0c;A是1&#xff09;抽出2张牌求和&#xff0c;请问能够组合出多少个不相等的数&#xff0c;按照由小到大输出这些数。 输入数据 第一行是一个整数n代表…

如何在 Windows 上恢复已删除的 Excel 文件

许多公司和个人在 Excel 电子表格中保存有价值的信息。当会议需要某个重要的 Excel 文件时&#xff0c;突然意识到您已删除或丢失该文件可能会造成严重问题。不用担心。我们将向您展示在 Windows 计算机上恢复已删除的 Excel 文件的多种方法。 如何在 Windows 上恢复已删除的 E…

IP代理在网络中解决了哪些问题?代理IP使用时效是什么意思?

随着互联网的普及和发展&#xff0c;IP代理作为一种网络工具&#xff0c;被广泛应用于各种场景。IP代理的使用可以解决很多网络中的问题&#xff0c;提高网络访问的速度和安全性。本文将详细介绍IP代理在网络中解决的问题&#xff0c;以及代理IP使用时效的含义。 一、IP代理在网…

专业140+总分410+华南理工大学811信号与系统考研经验华工电子信息与通信,真题,大纲,参考书。

23考研已经落幕&#xff0c;我也成功的上岸华工&#xff0c;回首这一年多的历程&#xff0c;也是有一些经验想和大家分享一下。 首先说一下个人情况&#xff0c;本科211&#xff0c;初试成绩400分。专业课140。 整体时间安排 对于考研&#xff0c;很重要的一环就是时间安排&…

使用C++从零开始,自己写一个MiniWeb

第一步&#xff1a;新建项目 1、打开VS点击创建新项目 2、选择空项目并点下一步&#xff08;切记不能选错项目类型&#xff09; 3、填写项目名称和路径&#xff0c;点击创建即可 新建好后项目是这样的比较干净 4、右击源文件&#xff0c;点击添加&#xff0c;新建http.cpp文件…

【LeetCode每日一题】二维前缀和基本概念与案例

二维前缀和 根据某个块块 的 左上角坐标&#xff0c;和右下角坐标 求出 块块的累加和。 304. 二维区域和检索 - 矩阵不可变 /*** param {number[][]} matrix*/ var NumMatrix function(matrix) {let row matrix.length;let col matrix[0].length;// 初始化一个二维数组&am…

探索现代Web前端开发框架:选择最适合你的工具

在当今快速发展的Web开发领域&#xff0c;前端开发框架的选择显得尤为关键。这些框架可以帮助我们更高效地构建出交互性强、性能卓越的用户界面。本文将带你了解几个当前最受欢迎的Web前端开发框架&#xff0c;并帮助你根据自己的需求选择最合适的工具。 1. React React由Fac…