初识Java篇(JavaSE基础语法)(1)

news2024/11/19 1:18:21

 个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-CSDN博客

目录

前言: 

初识Java 

运行Java程序

注释

标识符

关键字

数据类型与变量 

字面常量

数据类型

变量

类型转换 

类型提升 

字符串类型 

运算符

算术运算符 

关系运算符 

逻辑运算符

位运算符

移位运算

条件运算符

运算符的优先级 


前言: 

接下来,Java前期的语法学习会和C语言非常的类似。

Java语言概述:

Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。不仅如此,Java还是一个有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。

Java语言特性:

1. 简单性:Java语法是C++语法的一个“纯净版本”,相当于对C++做了一个减法。这里没有头文件、指针运算(甚至指针语法)、结构、联合、操作符重载、虚基类等等。不仅如此,Java开发环境远远超出大多数其他编程语言的开发环境。 2. 面向对象:什么是面向对象? 在Java的世界里,一切皆对象。比如:人、狗、手机、电脑等都是对象。所谓面相对象,就是依靠对象之间的交互来完成事情,比如:人用手机网上购物,狗吃骨头... Java的面向对象特性与C++旗鼓相当,与C++的主要不同点在于多重继承。在Java中,取而代之的是更简单的接口概念。而且与C++相比,Java提供了更丰富的运行时自省功能。 3. 分布式(微服务): Java有丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议。Java应用程序能够通过URL打开和访问网络 上的对象,其便捷程度就好像访问本地文件一样。 4. 健壮性:Java与C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能性(对于曾经花费几个小时来检查由于指针bug而引起内存冲突的人来说,一定很喜欢Java的这一特性)。不仅如此,Java编译器能够检测许多在其他语言中仅在运行时才能够检测出来的问题。 5. 安全性:Java适用于网络/分布式环境。为了达到这个目标,在安全性方面投入了大量的精力。使用Java可以构建防病毒、防篡改的系统。从一开始,Java就设计成能够防范常见的各种攻击: 运行时堆栈溢出。蠕虫和病毒常用的攻击手段。 破坏自己进程空间之外的内存。 未经授权读写文件 6. 体系结构中立:编译器生成一个体系结构中立的目标文件格式,按照该中规范生成的文件,只要有Java运行时系统,这些编译后的代码就可以在许多处理器上运行。Java编译器通过生成与特定计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易的在任何机器上解释执行,而且还可以动态地翻译成本地机器代码。这就是为什么可以:“Wrice once,Run anywhere”(一次编译,到处运行)。而且其他语言编写的程序,在编译后如果能够严格按照字节码文件的规范生成.class文件,也可以在JVM上运行7. 可移植性:与C/C++不同,Java规范中没有“依赖具体实现的地方”。基本数据类型的大小以及有关运算都做了明确的说明。例如,Java中的int永远是32位的整数,而在C/C++中,int可能是16位整数、32位整数,也可能是编译器提供商指定的其他大小。在Java中,数据类型具有固定的大小,这消除了代码移植时令人头疼的主要问题。 8. 解释性:Java为了实现与平台无关,自己维护了一套基于栈架构的指令集,Java源代码经过编译之后,字节码文件中的指令就是按照自己的指令集来组织的,但是在具体硬件环境中运行时,系统并不能识别,因为Java程序在执行时,Java解释器会逐条的将字节码文件中的指令翻译成CPU的指令集。 9. 高性能:边解释边执行,垃圾会说等导致了Java代码运行效率偏低,近年来JVM也在不断的优化,比如:JIT(即时编译Java在当时很超前。它是第一个支持并发程序设计的主流语言。多线程可以带来更好的交互响应和实时行为。并发程序设计绝非易事,但是Java在这方面表现出色,可以很好的管理这个工作。 11. 动态性:Java与C/C++相比更加具有动态性。它能够适应不断发展的环境。库中可以自由的添加新方法和实例变量,而对客户端没有任何影响。在Java中找出运行时类型信息十分简单(反射的特性,后续会学到) 因此:Java不仅仅是一门编程语言,也是一个由一些列计算机软件和规范组成的技术体系 ),热点代码探测,让Java程序的执行效率大幅提高,在有些场合不亚于C/C++。 10. 多线程:Java在当时很超前。它是第一个支持并发程序设计的主流语言。多线程可以带来更好的交互响应和实时行为。并发程序设计绝非易事,但是Java在这方面表现出色,可以很好的管理这个工作。 11. 动态性:Java与C/C++相比更加具有动态性。它能够适应不断发展的环境。库中可以自由的添加新方法和实例变量,而对客户端没有任何影响。在Java中找出运行时类型信息十分简单(反射的特性,后续会学到) 因此:Java不仅仅是一门编程语言,也是一个由一些列计算机软件和规范组成的技术体系。

初识Java 

C语言打印Hello World:

#include <stdio.h>
int main()
{
	printf("Hello World\n");
	return 0;
}

Java打印Hello World:

public class Test//类 {
    public static void main(String[] args)//方法 {
        System.out.println("Hello World");//语句
    }

Java程序的结构由如下三个部分组成:1.源文件(扩展名为.java):源文件带有类的定义。类用来表示程序的一个组件,小程序或许只会有一个 类。类的内容必须包含在花括号里面。 2.类:类中带有一个或多个方法。方法必须在类的内部声明。 3.方法:在方法的花括号中编写方法应该执行的语句。 总结一下:类存在于源文件里面;方法存在于类中;语句存在于方法中。 

注意:在一个源文件中只能有一个public修饰的类,而且源文件名字必须与public修饰的类名字相同。

运行Java程序

Java是一门半编译型、半解释型语言。先通过javac编译程序把源文件进行编译,编译后生成的.class文件是由字节码组成的,与平台无关、面向JVM的文件。最后启动java虚拟机来运行.class文件,此时JVM会将字节码转换成平台能够理解的形式来运行。

JDK、JRE、JVM之间的关系?

注释

Java中的注释主要分为以下三种:

1. 单行注释:// 注释内容(用的最多)

2. 多行注释:/* 注释内容*/(不推荐)

3. 文档注释: /** 文档注释 */(常见于方法和类之上描述方法和类的作用),可以被javadoc工具解析,生成一套以网页文件形式体现的程序说明文档.

注意: 1. 多行注释不能嵌套使用 2. 不论是单行还是多行注释,都不参与编译,即编译之后生成的.class文件中不包含注释信息。

标识符

在上述程序中,Test称为类名,main称为方法名,也可以将其称为标识符。即:在程序中由用户给类名、方法名或者变量所取的名字。

【硬性规则】 标识符中可以包含:字母、数字以及 下划线和 $ 符号等等。

注意:标识符不能以数字开头,也不能是关键字,且严格区分大小写。

【软性建议】 类名:每个单词的首字母大写(大驼峰) 方法名:首字母小写,后面每个单词的首字母大写(小驼峰) 变量名:与方法名规则相同。

关键字

将这些具有特殊含义的标识符称为关键字。即:关键字是由Java语言提前定义好的,有特殊含义的标识符,或者保留字。 注意:用户不能使用关键字定义标识符。下面是我们常见的关键字。

数据类型与变量 

字面常量

常量即程序运行期间,固定不变的量称为常量。换句话说,就是无论程序何时运行,对应的结果是不变的。

public class Tset {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

上面代码中的Hello World就是属于字面常量。

注意:常量与字面常量是有区别的。

字面常量:字面常量是指直接出现在代码中的固定值。它们可以是整数、浮点数、字符、字符串或布尔值等。例如,整数字面常量可以是10、-5,浮点数字面常量可以是3.14、-0.5,字符字面常量可以是’a’、‘b’,字符串字面常量可以是"Hello World”。字面常量的值在编译时就确定了,不能被修改。

常量:常量是指在程序中定义的具有固定值的标识符。在Java中,常量使用关键字final进行声明,并且一旦被赋值后就不能再改变。常量可以是基本数据类型(如int、double等)或引用数据类型(如String、数组等)。常量的值在运行时才确定。

区别:

字面常量的值在编译时就确定了,而常量的值在运行时确定。
字面常量直接出现在代码中,不需要定义和声明,而常量需要使用关键字final进行声明。
字面常量的值不能被修改,而常量的值也不能被修改,但可以通过重新赋值来改变引用的对象。

数据类型

在Java中数据类型主要分为两类:基本数据类型和引用数据类型。

基本数据类型有四类八种: 1. 四类:整型、浮点型、字符型以及布尔型 2. 八种:

数据类型关键字内存占用范围
字节型byte1个字节-128~127

短整型

short2个字节-32768 ~ 32767
整型int4个字节-2^31 ~ 2^31-1
长整型long8个字节-2^63 ~ 2^63-1
单精度浮点型float4个字节有范围,一般不关注
双精度浮点型double8个字节有范围,一般不关注
字符型char2个字节0 ~ 65535
布尔型boolean没有明确规定两个取值:true,false

注意: 不论是在16位系统还是32位系统,int都占用4个字节,long都占8个字节 整形和浮点型都是带有符号的 整型默认为int型,浮点型默认为double,字符串属于引用类型,该中类型后序介绍。 

变量

语法格式:数据类型 变量名 = 初始值;

例如:

int i = 0;//注意整型变量在使用之前,必须赋予初始值,否则编译器会报错

char ch = 0;

float f = 3.14f;//注意如果不加f/F,编译器会默认为double类型,而且编译器会报错

double d = 3.14;

short s = 20;

boolean flag = true;//只能取true或者flag

//为了区分int和long类型,一般建议:long类型变量的初始值之后加L或者l
long l = 30L;//一般更加以加大写L,因为小写l与1不好区分

如果我们想要知道这些数据的范围,也可以直接在编译器中求。

public class Tset {
    public static void main(String[] args) {
        System.out.println("整型数据的取值范围:"+Integer.MIN_VALUE+" ~ "+Integer.MAX_VALUE );
        System.out.println("短整型数据的取值范围:"+Short.MIN_VALUE+" ~ "+Short.MIN_VALUE);
        System.out.println("字节型数据的取值范围:"+Byte.MIN_VALUE+" ~ "+Byte.MAX_VALUE);
    }
}

代码内容后面介绍。 

注意事项:在 Java 中, int 除以 int 的值仍然是 int(会直接舍弃小数部分)。

double 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差,因此浮点数是个近似值,并不是精确值。 

Java 中使用 单引号 + 单个字母 的形式表示字符字面值。计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符.。因此 一个字符占用两个字节, 表示的字符种类更多, 包括中文。

public class Tset {
    public static void main(String[] args) {
        char a = '我', b = '要', c = '学', d = '编' , e = '程';
        System.out.print(a);
        System.out.print(b);
        System.out.print(c);
        System.out.print(d);
        System.out.print(e);
    }
}

Java 的 boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法。 

类型转换 

Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验。在Java中,当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式) 和 强制类型转换(显式)。

自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。特点:数据范围小的转为数据范围大的时会自动进行。

强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。特点:数据范围大的到数据范围小的。

我们就可以这样理解:当大碗装小碗里的水时,大碗能够全部装下;而小碗装大碗时,大碗里的水会溢出,导致水量减少。

类型提升 

不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。

byte 和 byte 都是相同类型, 但是出现编译报。 原因是, 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b 都提升成 int, 再进行计算, 得到的结果也是 int, 这是赋给 c, 就会出现上述错误. 由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据。 为了硬件上实现方便, 诸如 byte 和 short 这种低于 4 个字节的类型, 会先提升成 int, 再参与计算 。

字符串类型 

在Java中使用String类定义字符串类型。

在有些情况下,需要将字符串和整形数字之间进行转换:

int 转成 String

String 转成 int :

运算符

Java中运算符可分为以下:算术运算符(+ - * /)、关系运算符(< > ==)、逻辑运算符、位运算符、移位运算符以及条件运算符等。

算术运算符 

运算法则和C语言是一样的。 

public class Tset {
    public static void main(String[] args) {
        int a = 20;
        int b = 10;
        System.out.println(a + b); // 30
        System.out.println(a - b); // 10
        System.out.println(a * b); // 200
        System.out.println(a / b); // 2
        System.out.println(a % b); // 0 
    }
}
public class Tset {
    public static void main(String[] args) {
       int a = 3;
       int b = 2;
       //在数学中应该是1.5 但是在Java中输出结果为1。会向下取整,即小数点之后全部舍弃掉了
       System.out.println(a / b);
       //如果要得到数学中的结果,可以使用如下方式
       double d = a*1.0 / b;
       System.out.println(d);

    }
}

% 不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模的。 

当%两边的操作数是负数时,结果的正负号是由第一个运算符的正负决定的。

public class Tset {
    public static void main(String[] args) {
       System.out.println(10 % 3);
       System.out.println(10 % (-3));
       System.out.println((-10) % 3);
       System.out.println((-10) % (-3));
    }
}

关系运算符 

关系运算符主要有六个: ==   !=   <=   >=  >   <,其计算结果是 true 或者 false 。

public class Tset {
    public static void main(String[] args) {
       int a = 10;
       int b = 20;
       System.out.println(a == b); // false
       System.out.println(a != b); // true
       System.out.println(a < b); // true
       System.out.println(a > b); // false
       System.out.println(a <= b); // true
       System.out.println(a >= b); // false
    }
}

逻辑运算符

逻辑运算符主要有三个: &&   ||    ! ,运算结果都是 boolean类型。

语法规则:表达式1 && 表达式2,左右表达式必须是boolean类型的结果。 两个表达式都为真,结果才是真,只要有一个是假,结果就是假。与我们之前学习的C语言是一样的,并且也有短路求值。当表达式1为假时,表达式2就无需运算了。因为一旦表达式1的结果为假,整个表达式就是为假,表达式2的结果是真还是假已经没有意义了。

public class Tset {
    public static void main(String[] args) {
       int a = 1;
       int b = 2;
       System.out.println(a == 1 && b == 2);//左为真 且 右为真 则结果为真
       System.out.println(a == 1 && b > 100);//左为真 但 右为假 则结果为假
       System.out.println(a > 100 && b == 2);//左为假 但 右为真(无需判断) 则结果为假
       System.out.println(a > 100 && b > 100);//左为假 且 右为假(无需判断) 则结果为假
    }
}

逻辑 ||

语法规则:表达式1 || 表达式2,左右表达式必须是boolean类型的结果。注意:左右表达式至少有一个位真,则结果为真。 同样也有短路求值。当表达式1的结果为正,表达式2的结果无论真假,整个表达式的结果都为正。

public class Tset {
    public static void main(String[] args) {
       int a = 1;
       int b = 2;
       System.out.println(a == 1 || b == 2);//左为真 且 右为真(无需计算) 则结果为真
       System.out.println(a == 1 || b > 100);//左为真 但 右为假(无需计算) 则结果也为真
       System.out.println(a > 100 || b == 2);//左为假 但 右为真 则结果也为真
       System.out.println(a > 100 || b > 100);//左为假 且 右为假 则结果为假
    }
}

逻辑非 ! 

语法规则:! 表达式   真变假,假变真。 

public class Tset {
    public static void main(String[] args) {
       int a = 1;
       System.out.println(!(a == 1));//a == 1 为true,取个非就是false
       System.out.println(!(a != 1));//a != 1 为false,取个非就是true
    }
}

& 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 &&  || 相比, 它们不支持短路求值。

位运算符

按位与(&): 如果两个二进制位都是 1, 则结果为 1, 否则结果为 0。

按位或(|): 如果两个二进制位都是 0, 则结果为 0, 否则结果为 1。

按位取反(~): 如果该位为 0 则转为 1, 如果该位为 1 则转为 0。

按位异或(^): 如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1。

移位运算

左移(<<): 最左侧位不要了, 最右侧补 0。

右移(>>): 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)。

无符号右移 (>>>): 最右侧位不要了, 最左侧补 0。

1. 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方. 2. 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方. 3. 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替. 4. 移动负数位或者移位位数过大都没有意义。

条件运算符

条件运算符只有一个: 表达式1 ? 表达式2 : 表达式3 当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值; 当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值. 也是 Java 中唯一的一个三目运算符, 是条件判断语句的简化写。

1. 表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换。

如果我们把c的类型改为浮点型就可以了。

2. 表达式不能单独存在,其产生的结果必须要被使用。 

运算符的优先级 

与C语言是一样的,可以去看看下面这篇文章。操作符详解(下)-CSDN博客

通过上面的学习,我们会发现其实Java中的语法其实和C语言差不多。好啦!本期Java的学习就到此结束了,我们下一期再一起学习吧!

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

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

相关文章

基于springboot在线博客系统源码和论文

社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要…

Git Bash命令初始化本地仓库,提交到远程仓库

git init&#xff1a;初始化空仓库 // 初始化一个空仓库或者重新初始化一个存在的仓库 git init git remote // 为当前本地仓库添加一个远程仓库地址 git remote add origin https://gitee.com/xxx/demo.git git pull // 从设置好链接的远程仓库拉去已经存在的数据&#xff0c;…

疯狂送树莓派Pico!与CODESYS和上海晶珩一起,探索慕尼黑上海电子展!

3月20日-3月22日 上海新国际博览中心 E2馆 2200展 上海晶珩 X CODESYS 与您相约慕尼黑上海电子展 上海晶珩&#xff08;EDATEC&#xff09;荣幸宣布&#xff0c;将与全球自动化软件领导者CODESYS公司共同参展2024慕尼黑上海电子生产设备展&#xff01; 届时&#xff0c;我…

【数据结构】二叉树的相关操作以及OJ题目

文章目录 1. 二叉树2.二叉树的遍历2.1前序遍历2.2中序遍历2.3后序遍历2.4层序遍历 3.树的节点个数4.树的高度5.叶子节点的个数6.第k层节点的个数7.查找x所在的节点8.树的销毁9.相关题目9.1相同的树9.2单值二叉树9.3对称二叉树9.4二叉树的构建9.5翻转二叉树9.6另一颗树的子树 10…

Learn OpenGL 17 立方体贴图

立方体贴图 我们已经使用2D纹理很长时间了&#xff0c;但除此之外仍有更多的纹理类型等着我们探索。在本节中&#xff0c;我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型&#xff1a;立方体贴图(Cube Map)。 简单来说&#xff0c;立方体贴图就是一个包含了…

Java基础夯实——八股文【2024面试题案例代码】

1、Java当中的基本数据类型 Java中常见的数据类型及其对应的字节长度和取值范围如下&#xff1a; byte&#xff1a;1字节&#xff0c;取值范围为-128到127。short&#xff1a;2字节&#xff0c;取值范围为-32,768到32,767。int&#xff1a;4字节&#xff0c;取值范围为-2,147…

【Greenhills】GHS-MULTI IDE-Ubuntu纯命令系统部署license文件

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 记录在Ubuntu纯命令系统中部署license文件的步骤。 2、 问题场景 客户服务器为Linux纯命令行的环境&#xff0c;客户也无其他服务器可以部署&#xff0c;需在纯命令行上尝试安装。 3、软硬件环境 1&#xff09…

【Linux系统编程】进程程序替换

介绍&#xff1a; 进程程序替换是指将一个进程中正在运行的程序替换为另一个全新的程序的过程&#xff0c;但替换不是创建新进程&#xff0c;只是将对应程序的代码和数据进行替换。具体来说&#xff0c;这个替换过程涉及将磁盘中的新程序加载到内存结构中&#xff0c;并重新建立…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:FlowItem)

瀑布流组件的子组件&#xff0c;用来展示瀑布流具体item。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。仅支持作为Waterflow组件的子组件使用。 子组件 支持单个子组件。 接口 FlowItem() 使…

【RK android6.0 实现假关机真开机效果】

RK android6.0 实现假关机真开机效果 需求描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip CPU:rk3368 OS:Android 7.1.2 Kernel: 3.10 需求描述 由于硬件设计&#xff0c;使用错误…

Qt实现简单的五子棋程序

Qt五子棋小程序 Qt五子棋演示及源码链接登陆界面单机模式联机模式联网模式参考 Qt五子棋 参考大佬中国象棋程序&#xff0c;使用Qt实现了一个简单的五子棋小程序&#xff0c;包含了单机、联机以及联网三种模式&#xff1b;单机模式下实现了简易的AI&#xff1b;联机模式为PtoP…

Verilog case/casez/casex的区别

casez/casex语句虽然EDA工具也可以综合出来&#xff0c;但是注意&#xff0c;casez/casex综合出来的电路和case语句综合出来的电路可能是不同的&#xff0c;一定要慎用。而且综合工具也会告诉你casez/casex中的“?”"x""z"的comparison is always false&a…

提速增效!Figma插件推荐,助你事半功倍!

随着设计工具的更换&#xff0c;设计师不再局限于传统软件的重复操作&#xff0c;而是越来越追求能够提高设计效率的插件。从Photoshop到Sketch&#xff0c;再到最受欢迎的Figma&#xff0c;插件层出不穷。Figma是一种基于浏览器和团队合作的设计工具&#xff0c;可以在任何平台…

HackTheBox Blackfield

[1] 靶机信息状态退役难度HardIP/地址https://app.hackthebox.com/machines/Blackfield价格需要订阅 14$ /20 $ /月 端口扫描 └──╼ #nmap -p- --min-rate1000 -T4 10.129.229.17 Starting Nmap 7.93 ( https://nmap.org ) at 2024-03-14 14:14 GMT Nmap scan report for…

【iOS】ARC学习

文章目录 前言一、autorelease实现二、苹果的实现三、内存管理的思考方式__strong修饰符取得非自己生成并持有的对象__strong 修饰符的变量之间可以相互赋值类的成员变量也可以使用strong修饰 __weak修饰符循环引用 __unsafe_unretained修饰符什么时候使用__unsafe_unretained …

JVM中对象创建过程

在JVM中对象的创建&#xff0c;我们从一个new指令开始&#xff1a; 这个过程大概图示如下&#xff1a; 虚拟机收到new指令触发。 类加载检查&#xff1a;如果类没有被类加载器加载&#xff0c;则执行类加载流程&#xff08;将class信息加载到JVM的运行时数据区的过程&#xff…

【SRE系列之docker容器】--dockerfile镜像优化

dockerfile镜像优化 1.1 镜像优化方法 系统镜像采用ubuntu或者alpine&#xff0c;会比centos少1G左右编写业务镜像时从官网拉取镜像&#xff0c;其余配置根据业务需求再配置编写dockerfile时把不用的安装包卸载或者删除尽量减少run命令的使用&#xff08;一个run命令&#xf…

《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)

1.简介 在做web自动化时&#xff0c;有些情况selenium的api无法完成&#xff0c;需要通过第三方手段比如js来完成实现&#xff0c;比如去改变某些元素对象的属性或者进行一些特殊的操作&#xff0c;本文将来讲解怎样来调用JavaScript完成特殊操作。 2.用法 创建一个执行 JS 的…

公众号关闭自定义菜单

1、登录公众号 https://mp.weixin.qq.com/ 2、找到侧边导航-》新的功能 3、已开通-》自定义菜单 4、点击停用