JAVA基础(8) 面向对象编程3

目录

一、关键字static

1.概念

2.static关键字

(1)使用范围:

(2)被修饰后的成员具备以下特点:

3.静态变量

(1)语法格式

(2)静态变量的特点

(3)举例

4.静态方法

(1)语法格式

(2)静态方法的特点

(3)举例

二、类的成员——代码块

1.代码块的定义

2.静态代码块

(1)语法格式

(2)特点

(3)举例

3.非静态代码块

(1)语法格式

(2)说明

(3)举例

总结


一、关键字static

1.概念

如果想让一个成员变量被类的所有实例所共享,就用static修饰即可,称为类变量(或类属性 )。

2.static关键字

(1)使用范围:

        在Java类中,可用static修饰属性、方法、代码块、内部类

(2)被修饰后的成员具备以下特点:

  • 随着类的加载而加载
  • 优先于对象存在
  • 修饰的成员,被所有对象所共享
  • 访问权限允许时,可不创建对象,直接被类调用

3.静态变量

(1)语法格式

使用static修饰的成员变量就是静态变量(或类变量、类属性)

[修饰符] class 类{
    [其他修饰符] static 数据类型 变量名;
}

(2)静态变量的特点

  • 静态变量的默认值规则和实例变量一样。

  • 静态变量值是所有对象共享。

  • 静态变量在本类中,可以在任意方法、代码块、构造器中直接使用。

  • 如果权限修饰符允许,在其他类中可以通过“类名.静态变量”(推荐)直接访问,也可以通过“对象.静态变量”的方式访问

  • 静态变量的get/set方法也静态的,当局部变量与静态变量重名时,使用“类名.静态变量”进行区分。

(3)举例

public class Student {private static int totalStudents; // 私有静态变量,统计学生总数static String schoolName; // 缺省权限修饰符,方便类外访问private int studentId;private String studentName;public Student() {totalStudents++;studentId = totalStudents; // 使用totalStudents静态变量的值为studentId赋值}public Student(String studentName) {this();this.studentName = studentName;}public void setStudentId(int studentId) {this.studentId = studentId;}public int getStudentId() {return studentId;}public String getStudentName() {return studentName;}public void setStudentName(String studentName) {this.studentName = studentName;}public static int getTotalStudents() {return totalStudents;}public static void setTotalStudents(int totalStudents) {Student.totalStudents = totalStudents;}@Overridepublic String toString() {return "Student{schoolName = " + schoolName + ", studentId = " + studentId + ", studentName = " + studentName + "}";}
}public class TestStaticVariable {public static void main(String[] args) {// 静态变量totalStudents的默认值是0System.out.println("Student.totalStudents = " + Student.getTotalStudents());Student s1 = new Student("张三");Student s2 = new Student("李四");System.out.println(s1); // 静态变量schoolName的默认值是nullSystem.out.println(s2); // 静态变量schoolName的默认值是nullSystem.out.println("Student.totalStudents = " + Student.getTotalStudents()); // 静态变量totalStudents值是2Student.schoolName = "学校";System.out.println(s1); // 静态变量schoolName的值是学校System.out.println(s2); // 静态变量schoolName的值是学校// 通过“对象.静态变量”的形式来访问静态变量s1.schoolName = "新的学校";System.out.println(s1); // 静态变量schoolName的值是新的学校System.out.println(s2); // 静态变量schoolName的值是新的学校}
}

        在这个例子中,我们定义了一个 Student 类来表示学生信息。静态变量 totalStudents 用于统计学生总数,静态变量 schoolName 表示学校名称。每创建一个新的 Student 对象时,totalStudents 变量都会自增,并将其值赋给该学生的 studentId 属性。通过静态方法 getTotalStudentssetTotalStudents 可以访问和修改 totalStudents 的值。

TestStaticVariable 类中展示了如何创建学生对象、访问和修改静态变量,以及输出学生信息。

4.静态方法

(1)语法格式

用static修饰的成员方法就是静态方法。

[修饰符] class 类{
    [其他修饰符] static 返回值类型 方法名(形参列表){
        方法体
    }
}

(2)静态方法的特点

  • 静态方法在本类的任意方法、代码块、构造器中都可以直接被调用。

  • 只要权限修饰符允许,静态方法在其他类中可以通过“类名.静态方法“的方式调用。也可以通过”对象.静态方法“的方式调用(但是更推荐使用类名.静态方法的方式)。

  • 在static方法内部只能访问类的static修饰的属性或方法,不能访问类的非static的结构。

  • 静态方法可以被子类继承,但不能被子类重写。

  • 静态方法的调用都只看编译时类型。

  • 因为不需要实例就可以访问static方法,因此static方法内部不能有this,也不能有super。如果有重名问题,使用“类名.”进行区别。

(3)举例

public class student {public static void study(){System.out.println("我要用Theodore的博客学习JAVA");}
}
public class CSDNer {public static void speak(){System.out.println("欢迎大家来到我的博客学习");}
}
public class Test1 {public static void main(String[] args) {student.study();CSDNer.speak();}
}

二、类的成员——代码块

1.代码块的定义

        如果成员变量想要初始化的值不是一个硬编码的常量值,而是需要通过复杂的计算或读取文件、或读取运行环境信息等方式才能获取的一些值,该怎么办呢?此时,可以考虑代码块(或初始化块)。

代码块(或初始化块)的作用:对Java类或对象进行初始化

代码块(或初始化块)的分类

  • 一个类中代码块若有修饰符,则只能被static修饰,称为静态代码块(static block)
  • 没有使用static修饰的,为非静态代码块。

2.静态代码块

        如果想要为静态变量初始化,可以直接在静态变量的声明后面直接赋值,也可以使用静态代码块。        

(1)语法格式

在代码块的前面加static,就是静态代码块。

【修饰符】 class 类{
    static{
        静态代码块
    }

(2)特点

  • 可以有输出语句。
  • 可以对类的属性、类的声明进行初始化操作。
  • 不可以对非静态的属性初始化。即:不可以调用非静态的属性和方法。
  • 若有多个静态的代码块,那么按照从上到下的顺序依次执行。
  • 静态代码块的执行要先于非静态代码块。
  • 静态代码块随着类的加载而加载,且只执行一次。

(3)举例

public class Chinese {
//    private static String country = "中国";private static String country;private String name;{System.out.println("非静态代码块,country = " + country);}static {country = "中国";System.out.println("静态代码块");}public Chinese(String name) {this.name = name;}
}public class TestStaticBlock {public static void main(String[] args) {Chinese c1 = new Chinese("张三");Chinese c2 = new Chinese("李四");}
}//运行结果
//静态代码块
//非静态代码块,country = 中国
//非静态代码块,country = 中国

3.非静态代码块

(1)语法格式

【修饰符】 class 类{
    {
        非静态代码块
    }
    【修饰符】 构造器名(){
        // 实例初始化代码
    }
    【修饰符】 构造器名(参数列表){
        // 实例初始化代码
    }
}

(2)说明

特点:

  • 可以有输出语句。

  • 可以对类的属性、类的声明进行初始化操作。

  • 除了调用非静态的结构外,还可以调用静态的变量或方法。

  • 若有多个非静态的代码块,那么按照从上到下的顺序依次执行。

  • 每次创建对象的时候,都会执行一次。且先于构造器执行。

作用:

和构造器一样,也是用于实例变量的初始化等操作。

意义:

        如果多个重载的构造器有公共代码,并且这些代码都是先于构造器其他代码执行的,那么可以将这部分代码抽取到非静态代码块中,减少冗余代码。

(3)举例

import java.util.ArrayList;
import java.util.List;public class Person {private String name;private int age;private List<String> hobbies;private String identifier;// 非静态代码块,用于初始化复杂对象和共享初始化代码{hobbies = new ArrayList<>();identifier = generateIdentifier();System.out.println("非静态代码块执行: 初始化hobbies和identifier");}// 构造方法1public Person(String name, int age) {this.name = name;this.age = age;System.out.println("构造方法1执行: name = " + name + ", age = " + age);}// 构造方法2public Person(String name) {this.name = name;this.age = 0; // 默认年龄System.out.println("构造方法2执行: name = " + name);}// 生成标识符的方法private String generateIdentifier() {return "ID-" + (int)(Math.random() * 10000);}public void addHobby(String hobby) {hobbies.add(hobby);}public void displayInfo() {System.out.println("Name: " + name + ", Age: " + age + ", Identifier: " + identifier + ", Hobbies: " + hobbies);}public static void main(String[] args) {Person p1 = new Person("Alice", 30);p1.addHobby("Reading");p1.addHobby("Swimming");p1.displayInfo();Person p2 = new Person("Bob");p2.addHobby("Running");p2.displayInfo();}
}/*
输出结果:非静态代码块执行: 初始化hobbies和identifier
构造方法1执行: name = Alice, age = 30
Name: Alice, Age: 30, Identifier: ID-XXXX, Hobbies: [Reading, Swimming]
非静态代码块执行: 初始化hobbies和identifier
构造方法2执行: name = Bob
Name: Bob, Age: 0, Identifier: ID-XXXX, Hobbies: [Running]*/

总结

        本篇对JAVA基础中的static关键字和代码块进行了总结,便于读者复习与应用,部分内容源自网络,如有侵权,请联系作者删除,谢谢!

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

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

相关文章

k8s-第五节-StatefulSet

StatefulSet StatefulSet 是用来管理有状态的应用&#xff0c;例如数据库。 前面我们部署的应用&#xff0c;都是不需要存储数据&#xff0c;不需要记住状态的&#xff0c;可以随意扩充副本&#xff0c;每个副本都是一样的&#xff0c;可替代的。 而像**数据库、Redis **这类…

CPU是什么?

CPU&#xff0c;全称Central Processing Unit&#xff0c;中文名为中央处理器&#xff0c;是计算机系统的核心部件&#xff0c;负责执行程序指令、处理数据以及控制计算机内部的其他组件。简单来说&#xff0c;CPU就像是计算机的大脑&#xff0c;负责进行所有的思考和计算工作。…

在Linux/Debian/Ubuntu中出现“Could not get lock /var/lib/dpkg/lock-frontend”问题的解决办法

在Linux/Debian/Ubuntu中出现“Could not get lock /var/lib/dpkg/lock-frontend”问题的解决办法 在使用 apt 或 apt-get 进行软件包管理时&#xff0c;有时会遇到以下错误提示&#xff1a; Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporari…

CCM的作用及原理

CCM调试的理论依据_ccm矩阵sat调试-CSDN博客 CCM是在WB之后&#xff0c;就是当AWB将白色校正之后其他颜色也会跟着有明显变化&#xff0c;CCM的作用就是要保持白色不变&#xff0c;把其他色彩校正到非常精准的地步。 校正后的颜色(target值是一个固定的值)CCM矩阵*原始的颜色…

代码随想录Day73(Part09)

badijkstar(堆优化版) 题目&#xff1a;47. 参加科学大会&#xff08;第六期模拟笔试&#xff09; (kamacoder.com) 思路&#xff1a;直接看答案 答案 import java.util.*;class Edge {int to; // 邻接顶点int val; // 边的权重Edge(int to, int val) {this.to to;this.val …

昇腾910B部署Qwen2-7B-Instruct进行流式输出【pytorch框架】NPU推理

目录 前情提要torch_npu框架mindsport框架mindnlp框架 下载模型国外国内 环境设置代码适配&#xff08;非流式&#xff09;MainBranch结果展示 代码适配&#xff08;流式&#xff09; 前情提要 torch_npu框架 官方未适配 mindsport框架 官方未适配 mindnlp框架 官方适配…

力扣139 单词拆分 Java版本

文章目录 题目描述代码 题目描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a…

HTTP与HTTPS的主要区别

HTTP&#xff08;超文本传输协议&#xff09;与HTTPS&#xff08;超文本传输安全协议&#xff09;的主要区别在于安全性、数据传输方式、默认使用的端口以及对网站的影响。 一、安全性&#xff1a; HTTP是一种无加密的协议&#xff0c;数据在传输过程中以明文形式发送&#x…

堆和栈的区别及应用场景

堆和栈的区别及应用场景 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在计算机科学和编程领域&#xff0c;堆&#xff08;Heap&#xff09;和栈&#xff08…

InfluxDB时序数据库基本使用介绍

1、概要介绍 1.1、时序数据库使用场景 所谓时序数据库就是按照一定规则的时间序列进行数据读写操作的数据库。它们常被用于以下业务场景&#xff1a; 物联网IOT场景&#xff1a;可用于IOT设备的指标、状态监控数据存取。IT建设场景&#xff1a;可用于服务器、虚拟机、容器的…

等保测评需要什么SSL证书

在进行信息安全等级保护&#xff08;简称“等保”&#xff09;测评时&#xff0c;选择合适的HTTPS证书对于确保网站的安全性和合规性至关重要。以下是在等保测评中选择HTTPS证书时应考虑的因素&#xff1a; 国产证书&#xff1a; 等保测评倾向于使用国产品牌的SSL证书&#x…

代码随想录Day76(图论Part11)

97.小明逛公园&#xff08;Floyd&#xff09; 题目&#xff1a;97. 小明逛公园 (kamacoder.com) 思路&#xff1a; 答案 import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();…

传统sql查询痛点及衍生的项目设计思路(设计一款可视化查询工具)

背景 最近三年&#xff0c;工作中很大一部分时间是写sql报表。业务很复杂&#xff0c;几十个表。常用的就有十几个。经常表连接达七八个。写得多了&#xff0c;我也很熟练了&#xff0c;但就是足够熟练了&#xff0c;我就越感觉有以下问题困扰我&#xff1a; 无法串联excel表…

上网行为管理系统是什么?有哪些好用的上网行为管理系统?

IT经理&#xff08;ITM&#xff09;: 大家好&#xff0c;今天我们聚在这里&#xff0c;是为了讨论一个对我们公司来说越来越重要的议题&#xff1a;上网行为管理系统&#xff08;WBS&#xff09;。我们知道&#xff0c;员工的网络使用已经不仅仅是个人行为&#xff0c;它直接影…

序列化Serializable

一、传输对象的方式 将对象从内存传输到磁盘进行保存&#xff0c;或者进行网络传输&#xff0c;有两种方式&#xff1a; 实现Serializable接口&#xff0c;直接传输对象转成json字符串后&#xff0c;进行字符串传输 二、直接传输对象 implements Serializable Data Equal…

Java中的设计模式在实际项目中的应用

Java中的设计模式在实际项目中的应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 设计模式是解决软件设计中常见问题的经验总结&#xff0c;它们提供了一种…

resp 无法连接 redis 服务器

问题原因可能是&#xff1a;防火墙 防火墙对这个端口没有开放&#xff0c;所以主机访问不到 解决方法&#xff1a; 步骤1&#xff1a;开发指定端口号 #放通6379/tcp端口 firewall-cmd --zonepublic --permanent --add-port6379/tcp 步骤2&#xff1a;重启防火墙 firewall-c…

.netcore微服务——项目搭建

在.NET Core中&#xff0c;微服务是一种架构风格&#xff0c;它将应用程序构造为一组小型服务的集合&#xff0c;这些服务都通过HTTP-based API进行通信。每个服务都是独立部署的&#xff0c;可以用不同的编程语言编写&#xff0c;并且可以使用不同的数据存储技术。 微服务的主…

什么是网络抓取|常见用例和问题

你可能听说过数据被称为现代信息社会的新石油。由于线上信息量庞大&#xff0c;能够有效地收集和分析网页数据已经成为企业、研究人员和开发人员的关键技能。这就是网页抓取技术的用武之地。网页抓取&#xff0c;也称为网页数据提取&#xff0c;是一种强大的技术&#xff0c;能…

el-dropdown的command方法添加自定义参数

代码 <div v-for"(item, index) in queryParams.changeParams" :key"index"><el-form-item prop"dataConditionSearch"><el-dropdown command"handleCommand" style"margin-right: 3px;"><span class…