基本数据类型的封装
自动装箱与拆箱
8种基本数据类型对应的包装器
Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte,Short,Integer,Long,Character,Boolean;前面 4 种包装类默认创建了数值[-128,127] 的相应类型的缓存数据,Character创建了数值在[0,127]范围的缓存数据,Boolean 直接返回True Or False。如果超出对应范围仍然会去创建新的对象。
两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。
Integer i1 = 33;
Integer i2 = 33;
System.out.println(i1 == i2);// 输出 true
Integer i11 = 333;
Integer i22 = 333;
System.out.println(i11 == i22);// 输出 false
Double i3 = 1.2;
Double i4 = 1.2;
System.out.println(i3 == i4);// 输出 false
Integer i1=40;Java 在编译的时候会直接将代码封装成 Integer i1=Integer.valueOf(40);,从而使用常量池中的对象。
Integer i1 = new Integer(40);这种情况下会创建新的对象。
Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1 == i2);//输出 false
Integer 比较更丰富的一个例子:
Integer i1 = 40;
Integer i2 = 40;
Integer i3 = 0;
Integer i4 = new Integer(40);
Integer i5 = new Integer(40);
Integer i6 = new Integer(0);
System.out.println("i1=i2 " + (i1 == i2));
System.out.println("i1=i2+i3 " + (i1 == i2 + i3));
System.out.println("i1=i4 " + (i1 == i4));
System.out.println("i4=i5 " + (i4 == i5));
System.out.println("i4=i5+i6 " + (i4 == i5 + i6));
System.out.println("40=i5+i6 " + (40 == i5 + i6));
结果:
i1=i2 true
i1=i2+i3 true
i1=i4 false
i4=i5 false
i4=i5+i6 true
40=i5+i6 true
解释:
语句 i4 == i5 + i6,因为+这个操作符不适用于 Integer 对象,首先 i5 和 i6 进行自动拆箱操作,进行数值相加,即 i4 == 40。然后 Integer 对象无法与数值进行直接比较,所以 i4 自动拆箱转为 int 值 40,最终这条语句转为 40 == 40 进行数值比较。
方法
参数传递问题
java中只有按值传递
关于方法中参数传递的详细介绍可以参考下面这篇文章
https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/basis/Java%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md#1-java-%E5%9F%BA%E6%9C%AC%E5%8A%9F
重载与重写
重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理
重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法
重载(overload)
重载就是同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理
重载的特点:
- 方法名必须相同
- 参数类型、个数、顺序不同
- 返回值类型和访问修饰符可以不同(不以这两个标记重载)
举个例子,String类提供了多个重载方法indexOf(),可以查找子串:
int indexOf(int ch):根据字符的Unicode码查找;
int indexOf(String str):根据字符串查找;
int indexOf(int ch, int fromIndex):根据字符查找,但指定起始位置;
int indexOf(String str, int fromIndex)根据字符串查找,但指定起始位置。
重写(override)
重写就是子类对父类方法的重新改造,外部样子不能改变,内部逻辑可以改变
重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。
重写的特点:
- 两同:方法名和参数列表必须相同
- 两小:子类方法返回值类型必须<=父类,子类方法抛出的异常类<=父类
- 一大:子类方法的访问权限>=父类方法
声明为 final 的方法不能被重写。
声明为 static 的方法不能被重写,但是能够被再次声明。
深拷贝和浅拷贝
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
字符、字符串
字符
在Java中,字符和字符串是两个不同的类型
- 字符类型char,占两个字节,一个中/英字符都用一个char表示,一个char保存一个Unicode字符
char c1 = 'A';
char c2 = '中';
字符串
字符串类型String是引用类型
注意常用的转义字符
String s = “abc"xyz”; // 包含7个字符: a, b, c, ", x, y, z
字符串连接——用+号
String s = “first line \n”
+ “second line \n”
+ “end”;
从Java13开始,可以使用"""…"""表示多行字符串了
public class Main {
public static void main(String[] args) {
String s = """
SELECT * FROM
users
WHERE id > 100
ORDER BY name DESC
""";
System.out.println(s);
}
}
字符串不可变:
指的是字符串内容不可变,字符串变量s的指向可以通过赋值=来改变
数组
- 定义及初始化
数据类型 [] 数组名 = new 数据类型 [数组长度];
如:int[] arr = new int[3]{6,5,6};
默认值:整型为0,浮点型为0.0,布尔型为false。 - 可以用数组变量.length获取数组大小
- 二维数组
其中n可以不填,后面再动态给出
初始值可以用{}方式给出 - 数组的遍历
1、for循环遍历
2、for each遍历直接遍历数组中的每个元素
for(int n:ns) - 打印数组内容
1、for循环
2、Java标准库中的toString方法
Arrays.toString(ns) - 数组排序
1、冒泡排序
2、JDK提供的
Arrays.sort(ns)