马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
<hr> 前言
<hr> 一、数据范例
java数据范例分为两大类:基本数据范例和引用数据范例
- 基本数据范例:整数、浮点数、字符(char)、布尔范例
- 引用数据范例:封装在类对象里面的数据范例,字符串(不可变)、数组(可变)、集合(可变)、字典(可变)
0 与Python的一些区别
我们主要的目标就是为了搞清楚这些和Python里面有什么异同。
首先,Python传参传的全是传引用。
给出java里面传参规则:
- 基本数据范例是传值:即传递的是这个变量的值的副本;
- 引用数据雷同是传引用:一样寻常情况下传引用会修改一个就会影响另一个;但如果在类里面规定不可修改,其实也可以实现不影响另一个的;
典范例子就是java里面的字符串是引用数据范例,但是不可变;对原字符串修改其实是新创建一个字符对象在赋值已往,并不是在原来的内存地址上面修改。
基本数据范例需解释一下这里和Python的区别,用整数来说吧。
Python里面整数是不可修改的,传的是引用,
- 修改是新创建一个整数对象在赋值已往;
- 且在函数中传参于全局变量与局部变量的关系和Python不可变数据范例的特殊修改方式,导致在函数内部修改不会影响外部的全局变量,因为内部只是一个局部变量;下面代码中的两个 a 现实上是两个不一样的东西,一个放在全局空间,一个放在局部空间。
但在java中,基本数据范例传的是值的副本。什么叫副本就是一个完全不相关的东西,修改一个不会影响另一个的那种。
- 先说一下修改吧,java中基本数据范例是存在一个栈中,单独没有独立的内存地址(你当他有也行),我们就当它有吧,进行修改操纵就直接是在原内存上修改值就可以了。意思理解成假设java中整数有地址,a = a + 1这种操纵是在原地址上操纵。
- 然后就是函数传参,由于传参传的是值的副本,那函数内怎么修改肯定不会影响外面的了。
- a = 10
- def f(a):
- a = a+1
- f(a)
复制代码- public class Main {
-
- public static void main(String[] args) {
-
- int a = 10;
- modifyValue(a); // 11 内部自动新创建了一个a的值的副本变量传了进去
- System.out.println("Outside method: " + a); // 10
- }
- public static void modifyValue(int x) {
-
- x = x + 1;
- System.out.println("Inside method: " + x);
- }
- }
复制代码 在这个例子中,a 是一个整数变量,初始值为10。当我们将 a 传递给 modifyValue 方法时,传递的是 a 的值的副本(即10)。在 modifyValue 方法内部,对参数 x 的修改不会影响外部的 a。这就是Java中基本范例按值传递的体现。
python里面用全局变量与局部变量解释,java里面更简单直接用传的是值的副本就可以解释了。
信托还有一个疑问,在Python中的不可变和java中的不可变什么意思;
整数在Python和java中都是不可变的,不可变指的是一个数据范例创建了,它的内存地址就不能改变。Python中直接就硬到底,整数对象生成了就赖在谁人地方了;java宽松一点,地址不能变,但里面值照旧可以变的。
数组这种固然最外层的地址不可以变,但内部的其他地址随时都可以变,那就可变了呗。
【注】:java里面基本数据范例都看做不可变数据范例 ,不可变指的是地址不可变。对象建立了,无论内部地址照旧外部地址都不能变的那种。如此看来,固然Python和java内部规则有不同,但终极结果却是一样的,我们直接可以无缝衔接上。
以是看很多博客将Python的不可变数据函数传参解释成 ‘传值’ 也是有道理的,毕竟和真的传值最后结果是一样的,不过我们照旧要牢牢记住照旧传引用的。固然最后结果一样,但档次不一样嘛,拿出去吹牛皮也好啊!
在函数内部Python和java照旧有一个奇奇怪怪的区别:
- a = 10
- def add(a):
- a = 5 # 在Python中,函数内部这种 a 是创建了一个新的局部变量,并不是传进来的那个 a,
- # 可以看到,上面括号里面的a还是灰色的,说明压根没用上海
- add(a)
- print(a) # 10
- lst = [1, 2, 3, 4, 5]
- def add2(lst):
- lst = [1]
-
- add2(lst)
- print(lst) # [1, 2, 3, 4, 5]
复制代码- public class Main {
-
- public static void main(String[] args) {
-
- int a = 10;
- modifyValue(a); // 20
- System.out.println("Outside method: " + a); // 10
- }
- public static void modifyValue(int x) {
-
- x = 20; // java这里并没有创建局部变量(很显然没有声明变量的语法),说明用的就是传进来的 x ,和Python不一样
- System.out.println("Inside method: " + x);
- }
- }
复制代码 奇奇怪怪的吧!这些如果不注意不一定能发现!奇奇怪怪的知识又增加了。
1 基本数据范例
(1)整型
范例 存储需求 取值范围 int 4字节 -2 147 483 648 ~ 2 147 483 647(略高于20亿) short 2字节 -32 768 ~ 32 767 long 8字节 -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 byte 1字节 -128 ~ 127 【注】:通常情况下 int 最常用,long也常用;short和byte范例主要在特定场所下用。
【特别注意】:使用long时必要再数据后面加一个大写或小写 L ,雷同 long a = 999999999L。其他的正常,就long有点神经病
(2)浮点数范例
范例 存储需求 取值范围 float 4字节 约莫 ± 3.40282347 × 1 0 38 \pm 3.402 823 47\times 10^{38} ±3.40282347×1038(6~7位有效数字) double 8字节 约莫 ± 1.79769313486231570 × 1 0 308 \pm 1.79769313486231570\times 10^{308} ±1.79769313486231570×10308(15位有效数字) 【注】:double的精度是float的两倍,故也称为双精度;通常float范例的精度并不能满足要求,因此用的少,现实中照旧要用double
【特别注意】:由于默认是double,以是使用float是数据后面要加一个大写或小写的F,雷同 float a = 0.99F
另外,有三个特殊的浮点数表现溢出和堕落情况:
- 正无穷大 :Double.POSITIVE_INFINITY
- 负无穷大 : Double.NEGATIVE_INFINITY
- NaN(不是一个数,大概称为一个无法表现的浮点数),例如 0/0 就出现 NaN : Double.NaN
【注】不能用 == 判定一个特定结果是否是Double.NaN ,但是可以用 Double.isNaN(x)
- if (x==Double.NaN) // 会报错
- if (Double.isNaN(x)) // 这样才行
复制代码 【注】这里关于数据范例的取值巨细关系:double>float>long>int>short>byte
(3)字符(char)范例
范例 符号 取值范围 字符 char 0-65535(这里是指编码表里对应的数,一样寻常是Unicode编码) (4)布尔范例(true、false)
范例 符号 取值范围 布尔 boolean true、false (5)代码示例
- public class HelloWord{
-
- public static void main(String[] args) {
-
- // int
- int i = 9999999;
- System.out.println(i);
- // short
- short s = 9999;
- System.out.println(s);
- // byte
- byte b = 100;
- System.out.println(b);
- // long
- long l = 999999999999999999L; // long类型后面要加一个大写或小写L
- System.out.println(l);
- // double
- double d = 0.98;
- System.out.println(d);
- // float
- float f = 0.98F; // float类型后面要加一个大写或小写F
- System.out.println(f);
- // char
- char c = 'a'; // 字符必须用单引号
- System.out.println(c);
- // boolean
- boolean t = true;
- System.out.println(t);
- }
- }
复制代码 2 引用数据范例
- 引用数据范例:封装在类对象里面的数据范例,字符串(不可变)、数组(可变)、集合(可变)、字典(可变)
【注】:这里只对字符串做一个简单的解释,具体的必要学到具体的在说
范例 符号 注意 字符串(不可变) String java中字符串必须使用双引号 - public class HelloWord{
-
- public static void main(String[] args) {
-
- String a = "hello world!"; // java中字符串必须使用双引号
- System.out.println(a);
- }
- }
复制代码 二、变量与常量
1 变量
使用语法
- 声明变量: 数据范例:变量名; 数据范例:变量名; 数据范例:变量名;
- 初始化变量: 数据范例:变量名 = 数据值; 数据范例:变量名=数据值; 数据范例:变量名=数据值;
- public class HelloWord{
-
- public static void main(String[] args){
-
- int a; // 声明变量
- a = 10;
- System.out.println(a); // 10
- double b = 2.0; // 声明变量+初始化
- b = b + 10;
- System.out.println(b); // 12.0
- int i,j = 0, 1;
- System.out.println(i,j);
- }
- }
复制代码 【注】:声明变量范例只必要声明一次即可,声明事后后面再用直接用变量名即可;声明变量和变量初始化可以同时进行;
另外,声明变量名时声明变量名不能相同。
与Python相比的小细节
- java支持同时声明多个变量,但多重赋值语法和Python有区别
- java的打印函数不支持Python一样同时打印多个变量
- public class HelloWord{
-
- public static void main(String[] args){
-
- int i,j;
- i = 0;
- j = 1;
- System.out.println(i); // 0
- System.out.println(j); // 1
- int a = 4 , b =5; // java的多重赋值语法
- System.out.println(a); // 4
- System.out.println(b); // 5
-
- System.out.println
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |