Part01——变量
在Java语言中,所有的变量在使用前必须声明。声明变量的基本格式如下:
type identifier [ = value][, identifier [= value] ...] ;
格式说明:type为Java数据类型。identifier是变量名。可以使用逗号隔开来声明多个同类型变量。
Java语言支持的变量类型有:
-
类变量:独立于方法之外的变量,用 static 修饰。
-
实例变量:独立于方法之外的变量,不过没有 static 修饰。
-
局部变量:类的方法中的变量。
Java 局部变量: -
局部变量声明在方法、构造方法或者语句块中;
-
局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
-
访问修饰符不能用于局部变量;
-
局部变量只在声明它的方法、构造方法或者语句块中可见;
-
局部变量是在栈上分配的。
-
局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
final double PI = 3.14 //这个 PI 是常量,一旦初始化,它(PI)的值就不能被改变;
double a = 3 //这个 a 是变量
Java 实例变量: -
实例变量声明在一个类中,但在方法、构造方法和语句块之外;
-
当一个对象被实例化之后,每个实例变量的值就跟着确定;
-
实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
-
实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
-
实例变量可以声明在使用前或者使用后;
-
访问修饰符可以修饰实例变量;
-
实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
-
实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
-
实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。
类变量(静态变量):
- 类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外。
- 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
- 静态变量除了被声明为常量外很少使用,静态变量是指声明为 public/private,final 和 static 类型的变量。静态变量初始化后不可改变。
- 静态变量储存在静态存储区。经常被声明为常量,很少单独使用 static 声明变量。
- 静态变量在第一次被访问时创建,在程序结束时销毁。
- 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
- 默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
- 静态变量可以通过:ClassName.VariableName的方式访问。
- 类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和 final 类型,其命名方式与实例变量以及局部变量的命名方式一致。
Part02——数据类型
**变量就是申请内存来存储值。**也就是说,当创建变量的时候,需要在内存中申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。也可以认为,“变量就是一块可以操作的内存空间。”
- 基本数据类型: byte、short、int、long、float、double、char、boolean(整型、浮点型、字符型、布尔型)
- 引用数据类型(4字节): 类(class)、接口(interface)、数组。
boolean型一般是4字节,当其用于数组中时占 1字节;
如果需要进行不舍入误差的精确数字计算,需要使用BigDecimal类(用于金融领域)
引用类型:
- 在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
- 对象、数组都是引用数据类型。
- 所有引用类型的默认值都是null。
- 一个引用变量可以用来引用任何与之兼容的类型。
- char类型只能做单个字符处理,如果想要一个字符串,则需要 String 声明,但要注意的是,String 是 Java 内部的一个 类,它不是基本数据类型。
Java 常量: 常量在程序运行时是不能被修改的。
自动类型转换: 整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。 自动类型转换必须满足转换前的数据类型的位数要低于转换后的数据类型。
数据类型转换必须满足如下规则:
- 不能对boolean类型进行类型转换。
- 不能把对象类型转换成不相关类的对象。
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
- 转换过程中可能导致溢出或损失精度
- 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
强制类型转换:
- 条件是转换的数据类型必须是兼容的。
- 格式:(type)value; type是要强制类型转换后的数据类型
Part03——运算符
- 算术运算符:+、-、*、/、%、++、–
- 关系运算符:==、!=、>、<、>=、<=
- 位运算符:&、|、^、~、<<、>>、>>>
- 逻辑运算符:&&、||、!
- 赋值运算符:=、+=、-=、*=、/=、(%)=、<<=、>>=、&=、^=、|=
- 其他运算符:?:、instanceof
自增自减运算符:
- 自增(++)自减(–)运算符是一种特殊的算术运算符,在算术运算符中需要两个操作数来进行运算,而自增自减运算符是一个操作数。
- 前缀自增自减法(++a,–a): 先进行自增或者自减运算,再进行表达式运算。
- 后缀自增自减法(a++,a–): 先进行表达式运算,再进行自增或者自减运算。
位运算符:
- &:如果对应位都是1,则结果为1,否则为0
- |:如果对应位都是0,则结果为0,否则为1
- ^:如果对应位值相同,则结果为0,否则为1
- ~:按位取反运算符翻转操作数的每一位,即0变成1,1变成0
- <<:按位左移。左操作数按位左移右操作数指定的位数
- >>:按位左移。左操作数按位右移右操作数指定的位数
- >>>:按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。
逻辑运算符:
- && :逻辑与。当且仅当两个操作数都为真,条件为真
- || :逻辑或。如果两个操作数任何一个为真,条件为真
- ! :逻辑非。 用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。
短路逻辑运算符:
当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。
赋值运算符:
- =:将右操作数的值赋给左侧操作数
- +=:把左操作数和右操作数相加赋值给左操作数
- -=:把左操作数和右操作数相减赋值给左操作数
- *=:把左操作数和右操作数相乘赋值给左操作数
- /=:把左操作数和右操作数相除赋值给左操作数
- (%)=:把左操作数和右操作数取模后赋值给左操作数
- <<=:左移位赋值运算符
- >>=:右移位赋值运算符
- &=:按位与赋值运算符
- ^=:按位异或赋值操作符
- |=:按位或赋值操作符
条件运算符(?:) :条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
instanceof 运算符:该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。
instanceof运算符使用格式如下:
( Object reference variable ) instanceof (class/interface type)
Java运算符优先级:
- 后缀 () [] . (点操作符) 左到右
- 一元 expr++ expr-- 从左到右
- 一元 ++expr --expr + - ~ ! 从右到左
- 乘性 * /% 左到右
- 加性 + - 左到右
- 移位 >> >>> << 左到右
- 关系 > >= < <= 左到右
- 相等 == != 左到右
- 按位与 & 左到右
- 按位异或 ^ 左到右
- 按位或 | 左到右
- 逻辑与 && 左到右
- 逻辑或 | | 左到右
- 条件 ?: 从右到左
- 赋值 = 、+=、-=、*=、/=、%=、>>=、<<=、&=、^=、|= 从右到左
- 逗号 , 左到右
毕竟咱是初学,没必要每个都记得很清楚,反正我是记不全的,毕竟有些基本都没用上。我这个笔记也可能不全,我也就节选了相对重要的写了。
String
下面我们关注一下上面说到的 String类型,它不是基本数据类型,我们看一下String类的部分源码:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
先不说别的,单就 String 类被 final 修饰,就说明 String 类对象一旦实例化,其值便不能更改。
芜湖,现在问题来了,既然不能更改,那么String类下的 字符串 拼接、截取等等一些方法得到的String对象还是原来的 那个String 对象吗?显然不是,显然这些方法所得到的 String 对象是 新的 String 对象。
至于原来的那个 String 类对象去哪了?我们所得到的新的 String 对象 具体是怎么来的?
由于String.java源码有点长,我目前有待考察。
网上也有很多相关于此的文章,诸位可以去看看,了解一下,当然对像我这样的初学者而言没必要太过深入了解,知道有这么个事儿就可以了。往后如果有机会我把这个源码分析完了会单独发一章(估计没个半年是发不出来了,英语太烂)。
我是Java 小白,以上学习笔记如有问题,恳请各位大佬指正,非常感谢!!!
本文详细介绍了Java中的变量,包括类变量、实例变量和局部变量的声明、作用域和默认值。同时讲解了数据类型,包括基本数据类型和引用数据类型,并提到了自动类型转换规则。最后,文章涵盖了Java的各种运算符,如算术、关系、位和逻辑运算符,并讨论了String类型的特性和拼接原理。
863

被折叠的 条评论
为什么被折叠?



