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

    @Override
    public String toString() {
        return "Student{schoolName = " + schoolName + ", studentId = " + studentId + ", studentName = " + studentName + "}";
    }
}

public class TestStaticVariable {
    public static void main(String[] args) {
        // 静态变量totalStudents的默认值是0
        System.out.println("Student.totalStudents = " + Student.getTotalStudents());

        Student s1 = new Student("张三");
        Student s2 = new Student("李四");
        System.out.println(s1); // 静态变量schoolName的默认值是null
        System.out.println(s2); // 静态变量schoolName的默认值是null
        System.out.println("Student.totalStudents = " + Student.getTotalStudents()); // 静态变量totalStudents值是2

        Student.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");
    }

    // 构造方法1
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("构造方法1执行: name = " + name + ", age = " + age);
    }

    // 构造方法2
    public 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.mfbz.cn/a/772164.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图像信号处理器(ISP)基础算法及处理流程

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

FreeRTOS之队列上锁和解锁(详解)

这篇文章将记录我学习实时操作系统FreeRTOS的队列上锁和解锁的知识&#xff0c;在此分享给大家&#xff0c;希望我的分享能给你带来不一样的收获&#xff01; 目录 一、简介 二、队列上锁函数prvLockQueue&#xff08;&#xff09; 1、函数初探 2、应用示例 三、队列解锁函…

转让北京文化传媒公司带营业性演出经纪许可证

影视文化传播倡导将健康的影视文化有效传播给观众&#xff0c;从而构建观众与电影制作者的良 性沟通与互动&#xff0c;是沟通电影制作者与电影受众的重要桥梁。影视文化泛指以电影&#xff0c;电视方式所进行的全部文化创造&#xff0c;即体现为电影&#xff0c;电视全部的存在…

找不到msvcp120.dll无法继续执行的原因分析及解决方法

在计算机使用中&#xff0c;经常会遇到msvcp120.dll文件丢失的情况&#xff0c;很多人对这个文件不是很熟悉&#xff0c;今天就来给大家讲解一下msvcp120.dll文件的丢失以及这个文件的重要性&#xff0c;让大家更好地了解计算机&#xff0c;同时也可以帮助我们更好地掌握这个文…

航模插头篇

一、常见的电池插头&#xff08;电调端 是公头 电池端 是母头&#xff09; 电池总是被插的 1.XT60头 过流大 安全系数高 难插拔 2.T插 插拔轻松 过流比较小 容易发烫 电调端 是公头 电池端 是母头 3.香蕉头插孔 过流够 插拔轻松 但 容易插反 爆炸 4.TX90(和XT60差…

2024 年 亚太赛 APMCM (A题)中文赛道国际大学生数学建模挑战赛 | 飞行器外形的优化 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; 完整内容可以在文章末尾领取&#xff01; 第一个问…

C++内存管理(候捷)第一讲 笔记

内存分配的每一层面 applications可以调用STL&#xff0c;里面会有allocator进行内存分配&#xff1b;也可以使用C 基本工具primitives&#xff0c;比如new, new[], new(), ::operator new()&#xff1b;还可以使用更底层的malloc和free分配和释放内存。最底层的是系统调用&…

明星代言6个提升企业形象的杀手锏-华媒舍

在当今竞争激烈的商业世界中&#xff0c;企业形象的塑造对于品牌的发展至关重要。而明星代言作为一种常见的营销手段&#xff0c;被广泛使用来提升企业形象和产品销售。本文将介绍明星代言的六个杀手锏&#xff0c;帮助您了解如何通过明星代言来提升企业形象。 1. 拥有广泛的影…

十二、【源码】Spring整合AOP

源码地址&#xff1a;https://github.com/spring-projects/spring-framework 仓库地址&#xff1a;https://gitcode.net/qq_42665745/spring/-/tree/12-spring-aop Spring整合AOP 核心类&#xff1a; DefaultAdvisorAutoProxyCreator&#xff1a;用于在Spring框架中自动为符…

若依多数据源原理分析

首先&#xff0c;想明白不同的接口想要使用不同的数据源。 那么自然想到了AOP&#xff0c;自定义注解。 通过自定义注解标注当前方法到底使用的是哪个数据源。 上面是前置条件。 看下若依是怎么处理的&#xff1a; 1.定义自定义注解&#xff0c;以及对应的多数据源的枚举类…

天润融通分析AI技术助力客户服务,实现满意度三倍增长

如今&#xff0c;客户体验越来越成为影响客户决策的核心要素。 对于企业来讲&#xff0c;客户在不同触点的每一次互动体验&#xff0c;都成为塑造品牌声誉的“Aha时刻”。但同时&#xff0c;随着社会的发展的加速&#xff0c;客户的需求也在日新月异&#xff0c;给企业带来挑战…

Codeforces Round 955 (Div. 2, with prizes from NEAR!)(A~C题解)

这场比赛怎么说呢&#xff0c;一开始打的还算好&#xff0c;能进前1000&#xff0c;但是后面就被卡住了&#xff0c;这个确实没办法水平还是不够&#xff0c;学过的还是没想起来&#xff0c;后面继续练 A. Soccer 题解&#xff1a;水题一个&#xff0c;想要在过程中出现平局的…

web零碎知识

&nbsp 在html文件中 连续的空格会被认为是一个空格 所以我们需要使用&nbsp来代表空格 &#x3000 把这个当成tab键来使用 我们可以引入js文件&#xff0c;就可以减少html文件的长度。 首先创建一个js文件夹&#xff0c;然后在js文件夹中创建一个&#xff0c;后缀…

【第17章】MyBatis-Plus自动维护DDL

文章目录 前言一、功能概述二、注意事项三、代码示例四、实战1. 准备2. ddl配置类3. 程序启动4. 效果(数据库) 总结 前言 在MyBatis-Plus的3.5.3版本中&#xff0c;引入了一项强大的功能&#xff1a;数据库DDL&#xff08;数据定义语言&#xff09;表结构的自动维护。这一功能…

【电路笔记】-B类放大器

B类放大器 文章目录 B类放大器1、概述2、B类放大器介绍3、推挽式配置4、限制交叉失真5、B类放大器效率6、总结1、概述 我们在之前的文章中已经知道,A 类放大器的特点是导通角为 360,理论最大效率为 50%。 在本文中,我们将详细介绍另一类放大器,称为B类放大器,它是为解决A…

康姿百德磁性床垫好不好,效果怎么样靠谱吗

康姿百德典雅款床垫&#xff0c;打造舒适睡眠新体验 康姿百德床垫是打造舒适睡眠新体验的首选&#xff0c;其设计能够保护脊椎健康&#xff0c;舒展脊椎&#xff0c;让您享受一夜好眠。康姿百德床垫的面料选择也非常重要&#xff0c;其细腻亲肤的针织面料给您带来柔软舒适的触…

A*——AcWing 179. 八数码

A* 定义 A* 算法是一种在图形或地图中寻找最短路径的启发式搜索算法。它通过综合考虑起始节点到当前节点的实际代价和当前节点到目标节点的预估代价&#xff0c;来决定下一步的搜索方向。 运用情况 路径规划&#xff1a;如在地图导航中为车辆、行人规划最优路线。游戏开发&…

旅游系统(附管理端+前台)PHP源码

一. 前言 今天小编给大家带来了一款可学习&#xff0c;可商用的&#xff0c;旅游系统 源码&#xff0c;支持二开&#xff0c;无加密。支持景点管理&#xff0c;登录&#xff0c;景点预定&#xff0c;意见反馈&#xff0c;统计等功能。详细界面和功能见下面视频演示。 二. 视频…

深入挖掘海外快手kwai ads推广巴西slots手游广告独家优势

深入挖掘海外快手kwai ads推广巴西slots手游广告独家优势 在数字化时代&#xff0c;广告投放已成为各行各业不可或缺的一部分&#xff0c;特别是在游戏行业&#xff0c;如何有效地推广游戏产品&#xff0c;吸引玩家的眼球&#xff0c;成为了每一个游戏开发商和广告主所关注的焦…

DllImport进阶:参数配置与高级主题探究

深入讨论DllImport属性的作用和配置方法 在基础篇中&#xff0c;我们已经简单介绍了DllImport的一些属性。现在我们将深入探讨这些属性的实际应用。 1. EntryPoint EntryPoint属性用于指定要调用的非托管函数的名称。如果托管代码中的函数名与非托管代码中的函数名不同&#…