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

2024-06-07 03:20
文章标签 java 基础 18 顺平

本文主要是介绍韩顺平0基础学java——第18天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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;}@Overridepublic 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){//私有化构造器,不让在外面newSystem.out.println("构造器被调用了");this.name= name;}private static GirlFriend gf;public static GirlFriend getInstance(){if(gf==null){gf = new GirlFriend("马大可");return gf;}}@Overridepublic 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方法,该方法虽然不能重写,但是可以被继承

 

这篇关于韩顺平0基础学java——第18天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038033

相关文章

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.