零基础Java第十二期:类和对象(三)

news2024/12/23 23:21:44

目录

一、static成员(补)

1.1. static修饰成员方法

1.2. static成员变量初始化

二、代码块 

2.1. 静态代码块和实例代码块

​三、对象的打印

一、static成员(补)

1.1. static修饰成员方法

public class Linear {
    public static int count = 100;
    public int func(){
        Linear lin1 = new Linear();
        Linear lin2 = new Linear();
        Linear lin3 = new Linear();

        lin1.count++;
        lin2.count++;
        lin3.count++;
        Linear.count++;

        return count;
    }
}
public class Main {
    public static void main(String[] args) {
        Linear num = new Linear();
        System.out.println(num.func());
    }
}

     老铁们猜一下打印的count是多少?这段代码具有迷惑性,老铁们可能猜会是101,而实际结果确实104。count因为被static修饰,就不属于对象了,所以count都是以同一个变量进行运算。class前的public是包访问权限,这个对象只能在同一个包中进行实例化访问。

       而下面,博主将带大家进行更加直观的感受(接下来的代码可能会震碎你的三观):按常理推断我们给num赋值了一个null,按理说应该会抛出异常。可是我们一运行,照样会打印。这就是因为ret被static修饰,从而不属于任何对象。

public class demo {
    public static String ret = "bite";
}
public class Main {
    public static void main(String[] args) {
        demo num = null;
        System.out.println(num.ret);
    }
}

 

1.2. static成员变量初始化

第一种是就地初始化,在定义时直接给出初始值。

public class Student{
    private String name;
    private String gender;
    private int  age;
    private double score;
    private static String classRoom = "107";  
 }

 另一种是静态代码块初始化,接下来会讲到。

二、代码块 

2.1. 静态代码块和实例代码块

以下是静态代码块与实例代码块的语法规则: 

//静态代码块
    static{
    System.out.println("静态代码块被执行了");
}
//实例代码块
{
    System.out.println("实例代码块被执行了");
}
package demo;

class Student{
    private String name;
    private int age;

    private static String ClassRoom;
//实例代码块
{
    System.out.println("实例代码块被执行了");
}
//静态代码块
    static{
    System.out.println("静态代码块被执行了");
}

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("构造Student(String name, int age)方法被执行了。。。");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public class StarWars {
    public static void main(String[] args) {
        Student stu = new Student("Sandman",16);
    }
}

以下为执行的结果:

       从这里可以看到,执行的顺序是先执行静态代码块,再执行实例代码块,最后是构造方法。如果我们在new一个stu2的对象,再次执行,结果如下:静态代码块只被执行了一次。

 

如果我们在静态代码块里面,如果我们调用一个成员变量,则会产生报错。

三、对象的打印

Student stu1 = new Student("Sandman",16);
Student stu2 = new Student("Truck",18);

System.out.println(stu1);
System.out.println(stu2);

       打印的结果我们可以理解为地址,@的左边demo包底下的Student类,右边是地址。当我们stu1和stu2这两个引用变量接受参数时,它是怎么调用的呢?我们看下println的源码。 

public void println(Object x) {
   String s = String.valueOf(x);
   if (getClass() == PrintStream.class) {
         // need to apply String.valueOf again since first invocation
         // might return null
         writeln(String.valueOf(s));
      } else {
      synchronized (this) {
      print(s);
      newLine();
    }
  }
}

     当我们调用构造方法时,object类里的x会接收参数,接着传给valueOf里面;

//valueOf的源码

public static String valueOf(Object obj) {
     return (obj == null) ? "null" : obj.toString();
}

      如果obj不是一个null,则会执行后面的toString;

//toString的源码

public String toString() {
   return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

      最终返回并打印出的结果。

      如果我们把toString的源码拿到我们的程序里面,把返回值改成我们想要打印的:

public String toString() {
    return "Your name";
}

 

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

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

相关文章

钉钉平台开发小程序

一、下载小程序开发者工具 官网地址:小程序开发工具 - 钉钉开放平台 客户端类型 下载链接 MacOS x64 https://ur.alipay.com/volans-demo_MiniProgramStudio-x64.dmg MacOS arm64 https://ur.alipay.com/volans-demo_MiniProgramStudio-arm64.dmg Windows ht…

本地部署bert-base-chinese模型交互式问答,gradio

首先下载bert-base-chinese,可以在 Huggingface, modelscope, github下载 pip install gradio torch transformers import gradio as gr import torch from transformers import BertTokenizer, BertForQuestionAnswering# 加载bert-base-chinese模型和分词器 mod…

正式开源:从 Greenplum 到 Cloudberry 迁移工具 cbcopy 发布

Cloudberry Database 作为 Greenplum 衍生版本和首选开源替代,由 Greenplum 原始团队成员创建,与 Greenplum 保持原生兼容,并能实现无缝迁移,且具备更新的 PostgreSQL 内核和更丰富的功能。GitHub: https://github.com/cloudberry…

计算机网络:网络层 —— 路由信息协议 RIP

文章目录 路由选择协议动态路由协议路由信息协议 RIPRIP 的重要特点RIP的基本工作过程RIP的距离向量算法RIP存在的问题RIP版本和相关报文的封装 路由选择协议 因特网是全球最大的互联网,它所采取的路由选择协议具有以下三个主要特点: 自适应&#xff1a…

构建主干交换网络实验

转载请注明出处 该实验为交换网络综合实验,仅供参考。 根据下表配置计算机IP地址和划分VLAN。划分方式见课本48页,不再赘述 计算机名 IP地址 所属VLAN PC0 192.168.10.1 VLAN10 PC1 192.168.20.1 VLAN20 PC2 192.168.10.2 VLAN10 PC3 192.…

MySQL超大分页怎么优化处理?limit 1000000,10 和 limit 10区别?覆盖索引、面试题

1. limit 100000,10 和 limit 10区别 LIMIT 100000, 10: 这个语句的意思是,从查询结果中跳过前100000条记录,然后返回接下来的10条记录。这通常用于分页查询中,当你需要跳过大量的记录以获取后续的记录时。例如,如果你…

电科金仓(人大金仓)更新授权文件(致命错误: XX000: License file expired.)

问题:电科金仓(人大金仓)数据库链接异常,重启失败,查看日志如下: 致命错误: XX000: License file expired. 位置: PostmasterMain, postmaster.c:725 解决方法: 一、下载授权文件 根据安装版本在官网下载授权文件(电科金仓-成为世界卓越的数据库产品与服务提供商)…

DMFLDR数据载入使用实践

1、DMFLDR概述 1.1DMFLDR功能介绍 dmfldr(DM Fast Loader)是 DM 提供的快速数据装载命令行工具。用户通过使用 dmfldr 工具能够把按照一定格式 排序的文本数据以简单、快速、高效的方式载入到 DM 数据库中,或把 DM 数据库中的数据按照一定格…

计算机网络(Ⅵ)应用层原理

一些网络应用的例子: E-mail Internaet电话 Web 电子支付 文本信息 搜索 P2P文件共享 流媒体 即时通讯 实时电视会议 .... .... 创建一个网络应用: 1.编程 2.在不同的端系统上运行。 网络应用的体系架构 可能的应用架构 1.客户-服…

《使用Gin框架构建分布式应用》阅读笔记:p393-p437

《用Gin框架构建分布式应用》学习第17天,p393-p437总结,总45页。 一、技术总结 1.Prometheus Prometheus放在代码里面使用,还是第一次见。在本人实际的工作中未看到这种用法。 2.Grafana Grafana用于被监控数据的可视化。 3.Telegraf …

【动手学强化学习】part7-Actor-Critic算法

阐述、总结【动手学强化学习】章节内容的学习情况,复现并理解代码。 文章目录 一、算法背景1.1 算法目标1.2 存在问题1.3 解决方法 二、Actor-Critic算法2.1 必要说明 优势函数 2.2 伪代码 算法流程简述 2.3 算法代码2.4 运行结果 结果分析 2.5 算法流程说明 初始化…

MySQL【二】

查询列 SELECT [ALL | DISTINCT ] * | 列名1[,……列名n] FROM 表名; 查询所有选课学生的学号,结果去除重复值 select distinct sno from sc; 选择行 查询满足条件的数据集 SELECT 字段列表 FROM 表名 WHERE 查询条件 查询不属于数学系或外国语系的学生全部信息 …

ElasticSearch - Bucket Selector使用指南

文章目录 官方文档Bucket Selector1. 定义2. 工作原理3. 使用场景与示例使用场景官方案例示例2 4. 注意事项5. 总结 官方文档 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html Bucket Selector https://www.elastic.co/guide/en/…

“死鱼眼”,不存在的,一个提词小技巧,拯救的眼神——将内容说给用户,而非读给用户!

视频录制时,死鱼眼问题常见 即便内容再好,眼神死板也会减分 痛点真痛:拍视频时容易紧张 面对镜头,许多人难免紧张 神情僵硬,眼神无光,甚至忘词 这不仅影响表现,还让人难以专注 忘我场景&#x…

PyQt5实战——多脚本集合包,UI以及工程布局(二)

个人博客:苏三有春的博客 系列往期: PyQt5实战——多脚本集合包,前言与环境配置(一) 布局 2.1 UI页面布局 整体框架分为分为三个部分,垂直分布。 第一个部分为功能选择按钮(如UTF-8转换&#…

《Python网络安全项目实战》项目2 Python基础练习_总复习(1)

《Python网络安全项目实战》项目2 Python基础练习 总复习(1) 班级: 姓名: 实训成绩: 任务单成绩 : 输入用户名密码并将其输出打印。 userName _____________________ passWord ______________________ #输…

数组排序简介-基数排序(Radix Sort)

基本思想 将整数按位数切割成不同的数字,然后从低位开始,依次到高位,逐位进行排序,从而达到排序的目的。 算法步骤 基数排序算法可以采用「最低位优先法(Least Significant Digit First)」或者「最高位优先…

LangChain学习之路

何谓 LangChain?释放大语言模型潜能的利器 作为一种专为开发基于语言模型的应用而设计的框架,通过LangChain,我们不仅可以通过API调用如 ChatGPT、GPT-4、Llama 2 等大型语言模型,还可以实现更高级的功能。 我们相信&#xff0c…

二:Linux学习笔记(第一阶段)-- Linux命令

目录 Linux注意事项: Linux目录 Linux系统基础命令 1. 文件和目录操作 2. 文件查看和编辑 3. 文件权限和所有权 4. 系统信息 5. 网络命令 6. 文件查找 7. 压缩和解压缩 8. 系统管理 Linux注意事项: 严格区分大小写一切皆文件windows下的程序不…

嵌入式硬件重点(四)常用信号处理、放大电路、运算放大器(运放)基础篇

引言:在嵌入式硬件设计中,信号处理和放大电路是至关重要的组成部分。它们不仅影响系统的性能,还直接关系到数据的准确性和可靠性。随着嵌入式系统的广泛应用,对各种传感器和外部设备的信号进行有效处理显得尤为重要。 运算放大器&…