韩顺平0基础学java——第18天

news2024/11/26 4:28:27

p374-395

类变量和类方法

类变量(静态变量)

例:

class Child{

        public static Int count;//这个count可以被所有Child实例共享

        /..../

}

内存中,static在堆中是独立存放的,并不在某个对象的空间中。

1d32c6a6a54d47f0ab815460205a86aa.png

由于count是静态变量,于是在类加载的时候,信息放在方法区中,有些人认为count不在堆中,而是在方法区的静态域中。那到底在哪呢?

记住一点:static变量是对象共享的,不管它在哪,共识1static变量是同一个类所有对象共享,2static变量在类加载的时候就生成了。

8ed5a1a7e78c48afa5aa71f63336db5a.png

如何访问静态变量?

efd4692ed84f4d5ca6c52d6187e2336f.png

同时,由于有访问修饰符,静态变量依然要遵守相关的访问权限。

如 public static int age = 10;

类变量细节讨论

1.什么时候需要使用类变量

        当我们需要让某个类的所有对象都共享一个变量时,就可以考虑使用变量。

2.类变量和实例变量(普通属性)的区别

        类变量是该类所有对象所共享的,而实例变量是没个对象独享的。

3.加上static就称为类变量(静态变量),否则就叫实例变量/普通变量/非静态变量。

4.类变量可以通过 类名.类变量名 或者 对象名.类变量名来访问,但jiava设计者推荐使用类名.类变量名 来访问,前提是满足访问修饰符的访问权限和范围。

5.实例不能通过类名.变量名来访问

f7aa2bae69934d179e508d0d1fe49169.png

6.类变量是在类加载的时候就初始化了, 所以我们没有创建对象实例,就能通过类名.类变量名来访问! 

7.类变量的生命周期是随类的加载开始,随着类消亡而销毁。

类方法(静态方法)

访问修饰符 static 数据返回类型 方法名(){} //推荐

static 访问修饰符 数据返回类型 方法名(){}

静态方法就可以调用静态属性!静态方法可以通过类名或对象名来调用。

类方法经典的使用场景:当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。比如工具类的一些排序、打印特定信息等等。

类方法细节

1.类方法和普通方法都是随着类的加载而加载,将结构信息储存在方法区,类方法中无this的参数,普通方法中隐含着this的参数

2.类方法可以通过类名调用,也可以通过对象名调用。

3.普通方法和对象有关,需要通过对象名调用,比如对象名.方法名(参数),不能通过类名调用。

4.类方法中不允许使用和对象有关的关键字,比如this和super,普通方法(成员方法)可以。

5.类方法(静态方法)中,只能访问静态方法或静态变量。

6.普通成员方法,既可以访问普通变量(方法),也可以访问静态变量(方法)

小结:静态方法只能访问静态成员,非静态方法可以访问静态和非静态成员,都要遵守访问权限!

课堂练习

第一题:

7c00fd9818914dc19e34d5035e7f931b.png

count=9

count=10

11

第二题:

b6ac340f3940405687979442ed1a5e5f.png

有错,静态的getTotalPerson方法访问了非静态的id字段

第三题:

672b7c54af444f4e92cdb28aa70d4cfb.png

把this.total改成Person.total就可以了。total是静态属性!用类名调用。

main方法

main的形式:

public static void main(String[ ] args){}

1.main方法是java虚拟机在调用,所以该方法的访问权限必须是public

2、java虚拟机在执行main方法时,不必创建对象,所以该方法必须是static

3.该方法接受String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数。

4.java执行的程序 参数1 参数2 参数3

0382_韩顺平Java_main语法说明_哔哩哔哩_bilibili

理解main方法

1.在main()方法中,我们可以直接调用main方法所在类的静态方法或静态属性

2.但是不能直接访问该类中的非静态成员,必须先创建本类的对象,再调用。

命令行传参数:d5bad793169e49d7ac67b03a014c03dd.png

 idea里传参数:

3c4f909c76c94f3d92abdb3233d7f324.png2c5c04467cd449a4ad429168425b7dd0.png

代码块

代码块又称为初始化块,是类的一部分,类似于方法,将逻辑语句封装在方法体中,通过{}包围起来,但是和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不能通过对象或类显式调用,而是加载类时,或创建对象时隐式调用。

基本语法

[修饰符]{

代码

};

注意:

1.修饰符可选,要写的话只能写static

2.代码块分类两类,使用static修饰的叫静态代码块,没有static修饰的叫动态代码块。

3.逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断等)

4.;可以写也可以省略

代码块的好处:

1.相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化的操作。

        例:构造器构成重载后,若每个构造器都有相同的语句,所以可以把这些语句放在代码块中。当我们不管调用哪个构造器来创建对象,都会先调用代码块的内容。

2.提高代码的重用性

代码块使用细节(很烦人)

1.

static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次,只执行一次!如果是普通代码块,每创建一个对象,就执行一次。

2.

类什么时候被加载

        1.创建对象实例时 (new)

        2,创建子类对象实例,父类也会被加载

        3使用类的静态成员时(静态属性,静态方法)

背下来

3

普通的代码块,在创建对象实例时,会被隐式调用,被创建一次,就会被调用一次,如果只是使用类的静态成员时,普通代码块并不会被执行。ae6fd203f0274a48b440ea7e265959b0.png

5dbec2d703d849199888fdbc3ff8bf00.png

啊,加油,今天肝到400集!好困啊

小结:static代码块是类加载的时候执行,只一次,普通代码块是创建对象的时候调用,每个对象都会调用它!

4.

创建一个对象时,在一个类调用的顺序是

        1.调用静态代码块和静态属性初始化(注意,静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按照它们定义的顺序调用)

        2.调用普通代码块和普通属性的初始化(优先级相同没如果有多个,那么按照他们定义的顺序初始化)

        3构造器(几天不见这么拉了?)

那么,有继承的时候,是什么顺序呢?(面试爱问)

5.

构造器的最前面其实隐含了super()和 调用普通代码块,

4049b9cb30944b31bfb085a91ee75fac.png

也就是说,调用super就会去父类,按照顺序走一轮,然后回到自己的内部,调用普通代码块,然后调用
 

6&7.

be2992958a6c4e0bbbd8602a3e4e8fa1.png

 亲测:new 子类 

b712f61fda9649799e0e48f9f2adde7b.png

new孙类

91379bc6b9a24f7a9a22bab13d90d5ed.png

按这个套路...

4f506485459840e480b9360f439ebc13.png

0389_韩顺平Java_代码块使用细节4_哔哩哔哩_bilibili

练习

第一题

1b3f1022bceb4331a1b23de0c5e786f1.png

in static block//调用Person类的时候会进行静态字段和静态代码块的加载,但是只在调类的时候输出这一次!

total =100

total =100

第二题:

cf837878f3c245ca9a31e388f77b14a2.png

静态成员sam初始化

static块被执行

sam1成员初始化//不要忘了普通代码块在构造器前面!!!

Test默认构造函数被调用

单例设计模式

静态方法和属性的经典应用

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱...

b92b8086fc5b42b09b4f967781371f8b.png

饿汉式

1.构造器私有化→防止用户new

2.类的内部创建对象

3.向外暴露一个静态的公共方法,如getinstance

4.代码实现

例:

package com.day18;

public class MyTool {
    public static void main(String[] args) {
        GirlFriend mdk = GirlFriend.getInstance();
        GirlFriend xixi = GirlFriend.getInstance();
        System.out.println(mdk.toString());
        System.out.println(xixi.toString());
        System.out.println(mdk == xixi);
    }
    }

class GirlFriend{
    //为了能够在静态方法中返回gf对象,需要将其修饰为static,而这里static了,它只会创建一次。
    private static GirlFriend gf=new GirlFriend("马大可");
    private String name;
    private GirlFriend(String name){
        this.name= name;
    }
    //这个方法必须是静态的,否则就得去外面new一个!
    public static GirlFriend getInstance(){
        return gf;
    }

    @Override
    public String toString() {
        return "GirlFriend{" +
                "name='" + name + '\'' +
                '}';
    }
}

这里只要加载类,就会被创建,你不一定会用它。饿汉式:你可以不用对象,但不能没有对象!

饿汉式你可能造成创建了对象,但是不使用,因此资源被浪费了。

懒汉式

1.构造器私有化,防止直接new

2.类的内部创建对象

3向外暴露一个静态的公共方法

4.代码实现

简单地说,就是你需要使用了,才创建。

package com.day18;

public class MyTool {
    public static void main(String[] args) {

    }
    }

class GirlFriend{
    private String name;
    private GirlFriend(String name){//私有化构造器,不让在外面new
        System.out.println("构造器被调用了");
        this.name= name;
    }
    private static GirlFriend gf;
    public static GirlFriend getInstance(){
        if(gf==null){
            gf = new GirlFriend("马大可");
            return gf;
        }
    }
    @Override
    public String toString() {
        return "GirlFriend{" +
                "name='" + name + '\'' +
                '}';
    }
}

小结:

饿汉式问题:在类加载的时候就创建,可能存在资源浪费问题

懒汉式问题:线程安全问题

final关键字

final可以修饰类,属性,方法,局部变量

可能会用到final的情况:

1.当不希望类被继承时,可以用final修饰(结扎类?)

2.不希望被重写的方法:public final void speak(){}

3.当不希望类的某个属性被修改,public final double rare = 0.8;交80%的利息!

4.不希望局部变量被修改

final的使用细节

457a393793884365a264118a79b15cce.png

0394_韩顺平Java_final使用细节1_哔哩哔哩_bilibili

如果是静态的final

c4fb17d8e7ca4984a49b5d4fa646838a.png

如果不是final类,但是含有final方法,该方法虽然不能重写,但是可以被继承

 

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

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

相关文章

行业分析---造车新势力之理想汽车

1 前言 在之前的博客中,笔者撰写了多篇行业类分析的文章(科技新能源): 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 此类文章的受…

前端传参数后端变量类型能够接受到List却无法接收到值

问题描述 今天写了个接口,下图所示 ReqVO里是这样的: 然后前端去请求,从请求结果中看发现这里值是在的(有经验的可能就看出来了otherInfo.id: 这样以参数后端是接收不到的,但是当时没发现) 传进来后端…

zynq-7015启动分析及裸机BootLoader编写(未完待续)

使用lwip-tcp远程对QSPI进行更新、QSPI FLASH启动 W25Q128资料: W25Q128JV datasheet(1/78 Pages) WINBOND | 3V 128M-bit serial flash memory with dual/quad spi (alldatasheet.com) UG585资料: Zynq 7000 SoC Technical Reference Manual-UG585 翻译…

python3 -m http.server 检查打包前端的项目

python3 -m http.server这是 Python 提供的一个内置的简单 HTTP 服务器。当你在终端中运行 python3 -m http.server 命令时(在对应的打包目录比如dist目录),Python 会启动一个 HTTP 服务器,它会将当前工作目录下的文件作为静态文件提供给浏览器。这个服务…

张大哥笔记:高考,万人过独木桥,你怕不怕摔倒?

今天刷到一个新闻:宁夏煤业计划招600名挖煤的井下操作工,要求大学学历!结果却吸引了7900人来报名!我都惊呆了,什么时候挖煤都要求这么高的学历了,那读书到底起啥作用! 如果一个人读书读到大学后…

web刷题记录(4)

[GKCTF 2020]cve版签到 进来应该是给了个提示了,就是要以.ctfhub.com结尾 还有一个超链接,这题的ssrf还是挺明显的,抓包看看 发现回显里面有提示 说是和本地有关,那么也就是说,要访问127.0.0.1,大概意思就…

基于FPGA的任意点滑动平均(滑动窗长度和数据位宽参数化,例化时参数可设置)

目录 1.前言2.原理3.举例说明4.Matlab实现5.FPGA实现滑动平均 微信公众号获取更多FPGA相关源码: 1.前言 对于一维信号,我们可以使用类似移动平均滤波(Moving Average Filtering)实现denoising。Moving Average Filtering 是一种…

超速解读多模态InternVL-Chat1.5 ,如何做到开源SOTA——非官方首发核心技巧版(待修订)

解读InternVL-chat1.5系列 最近并行是事情太杂乱了,静下心来看一看优秀的开源项目,但是AI技术迭代这么快,现在基本是同时看五、六个方向的技术架构和代码,哪个我都不想放,都想知道原理和代码细节,还要自己训练起来&am…

性能飙升50%,react-virtualized-list如何优化大数据集滚动渲染

在处理大规模数据集渲染时,前端性能常常面临巨大的挑战。本文将探讨 react-virtualized-list 库如何通过虚拟化技术和 Intersection Observer API,实现前端渲染性能飙升 50% 的突破!除此之外,我们一同探究下该库还支持哪些新的特性…

【嵌入式DIY实例】-OLED显示天气数据

OLED显示天气数据 文章目录 OLED显示天气数据1、硬件准备与接线2、天气数据获取准备3、代码实现在这个物联网项目中,本文将展示如何使用 ESP8266 NodeMCU (ESP-12E) Wi-Fi 开发板和 SSD1306 OLED 显示屏(12864 像素)制作一个简单的互联网气象站。 NodeMCU 从天气网站 openwe…

JavaWeb3 Ajax+Axios+Element+Nginx部署

Ajax 异步JS和XML 1.数据交换&#xff1a;给服务器发送请求&#xff0c;并获取服务器相应的数据 2.异步交互&#xff1a;在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页 同步与异步 原生Ajax <!DOCTYPE html> <html> <body><…

kafka-消费者-消费异常处理(SpringBoot整合Kafka)

文章目录 1、消费异常处理1.1、application.yml配置1.2、注册异常处理器1.3、消费者使用异常处理器1.4、创建生产者发送消息1.5、创建SpringBoot启动类1.6、屏蔽 kafka debug 日志 logback.xml1.7、引入spring-kafka依赖1.8、消费者控制台&#xff1a;1.8.1、第一次启动SpringK…

【WP】猿人学_17_天杀的Http2.0

https://match.yuanrenxue.cn/match/17 抓包分析 居然对Fiddler有检测&#xff0c;不允许使用 那就使用浏览器抓包&#xff0c;好像没发现什么加密参数&#xff0c;然后重放也可以成功&#xff0c;时间长了也无需刷新页面&#xff0c;尝试Python复现。 Python复现 import …

在线标注流程

文章目录 在线标注流程标注方法 在线标注流程 登录地址&#xff1a;http://7a27c5e078f644a2a9b734603913c65e.login.bce.baidu.com 出现页面&#xff1a; 登录名&#xff1a; 三个中任意一个 密码&#xff1a;ZNSJ123a 登录之后叉掉。再打开这个网站&#xff1a;https://…

CAD 文件(DXF / DWG)转换为(DXF / PDF / PNG / SVG)

方法一Github 这个是ezdxf出品的&#xff0c;可以使用命令行的方式进行转换 ezdxf draw -o file.<png|svg|pdf> <file.dxf>也可以自己改动代码 examples/addons/drawing/pdf_export.py 但是直接运行会有误&#xff0c;以下是我改动后的代码&#xff1a; from ez…

ArrayList——简单洗牌算法

特殊语法介绍&#xff1a; List<List<E>> 该语法情况比较特殊&#xff0c;相当于一个“二维数组”存着一个个线性表的结构&#xff0c;如图&#xff1a; 该语法的灵活性强&#xff0c;可适用于多种类型和多种情况。接下来就使用该语法来实现一个简单的洗牌操作。…

【Linux取经路】网络套接字编程——初识篇

文章目录 一、端口号1.1 认识端口号1.2 端口号 VS 进程 PID 二、认识 TCP 协议三、认识 UDP四、网络字节序列五、socket 编程接口5.1 常用 API5.2 sockaddr 结构 六、结语 一、端口号 网络通信的本质是应用层软件进行数据的发送和接受&#xff0c;软件在启动之后&#xff0c;本…

快速自定义表单开发的优势介绍

进行高效率的办公是很多职场人的梦想。借助什么样的软件平台可以提质增效&#xff1f;低代码技术平台是当前较为流行的办公软件平台产品&#xff0c;具有灵活性、易操作、好维护等多个优势特点&#xff0c;操作人员只需要像搭积木似地操作&#xff0c;就可以搭建属于客户的个性…

[element-ui]el-form自定义校验-图片上传验证(手动触发部分验证方法)

背景&#xff1a; 在做导入文件功能的时候&#xff0c;需要校验表单&#xff0c;如图所示 店铺字段绑定在表单数据对象上&#xff0c;在点击确定的时候正常按照表单验证规则去校验&#xff0c;就不再赘述。 文件上传是个异步过程&#xff0c;属性值改变后不会去触发验证规则…

一.网络基础——OSI七层模型

一.OSI七层模型 OSI&#xff08;Open System Interconnection&#xff0c;开放系统互连&#xff09;七层网络模型被称为开放式系统互联参考模型&#xff0c;它是一个逻辑上的定义和规范; 它把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备&#xff0c;比如路由器&…