一、标识符
通俗说:所有可通过自己命名的都统称为标识符。
命名规则:
1)由字母、下划线“_”、$美元符三部分组成,不能以数字开头
2) 不能与关键字重名,例如:class 、if 、else等
二、Java 变量
1)局部变量:在方法内或者语句内定义的变量
特点:只在定义的方法中有用。
2)成员变量:定义在方法外的变量、有可称为全局变量,在整个类中都有用。
三、Java数据类型
1)基本数据类型
分为4类8种,分别是:byte、Boolean、short、int、integer、float、double、char
byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。
short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。
int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
boolean:只有true和false两个取值。
char:16位,存储Unicode码,用单引号赋值。
2)引用类型
Java有5种引用类型分别是:类、接口、数组、枚举、标注
数据类型_详讲类的引用_clone的浅拷贝与深拷贝,下面创建一个例子说明类的引用(划重点)
package javaTest;
public class Student implements Cloneable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
/*@Override
public String toString() {
return "名字:" + name + "年龄" + age;
}
*/
public static void main(String[] arg) throws CloneNotSupportedException {
Student stu = new Student();
Student stu1 = new Student();
stu1 = stu;
System.out.println(stu + "----" + stu1);
// stu与stu1具有相同的引用地址,地址指向内存中同一个存储位置,也即是同一个值
// 输出javaTest.Student@15db9742----javaTest.Student@15db9742
// 使用stu 传值
stu.setName("张三");
stu.setAge(11);
// 使用重写的toString方法打印值,如果不重写默认toString输出的是地址
System.out.println(stu.toString() + "-----" + stu1);
// 打印结果:
/*
* 名字:null年龄0----名字:null年龄0 //这条打印是上面stu和stu1的,之前没有重写头String
* 所以打印的是地址,现在重写toString 后打印的是toString返回值, 直接打印类时会默认调用toString方法
*
* 名字:张三年龄11-----名字:张三年龄11
* //System.out.println(stu.toString()+"-----"+stu1)的输出结果 可以看到stu与stu1输出一样
**/
// 现在使用使用stu1改变name
stu1.setName("小王");
System.out.println(stu.toString() + "-----" + stu1);
/*
* 打印结果如下,可以看见stu\stu1都发生了改变 名字:null年龄0----名字:null年龄0 名字:张三年龄11-----名字:张三年龄11
* 名字:小王年龄11-----名字:小王年龄11
*
*/
// 总结 new 一个对象时,stu 只是引用变量,指向一个地址,内存地址中才是真正存放的值,
// 当stu1改变内存中的值时,stu也发生了改变
// 原因是在第一次new Student时内存中已经创建一个Student对象并分配了内存空间
// 当再次 new stu1时,Java不会在分配另一个内存空间,而只是把它的地址指向第一次创建的对象时分配的内存空间
// 可以使用深拷贝来实现互不干扰
// 需要实现接口cloneable、并重写clone方法,我将在上面代码中直接加入,
//不重写clone()是浅拷贝
//浅拷贝只会拷贝到下一层,也就是说会把地址拷贝过去,但是地址指向的内存空间还是同一个,当改变了地址空间的值,也会影响原来的对象,而深拷贝则是完完全全的拷贝,会重写分配内存空间
//深拷贝
/*@Override
public Student clone() throws CloneNotSupportedException {
return (Student) super.clone();
}*/
//浅拷贝
/*@Override
public Student clone() throws CloneNotSupportedException {
return super.clone();
}*/
Student stuClone = (Student)stu.clone();
stuClone.setName("666");
System.out.println(stu.toString() + "-----" + stu1 + "----" + stuClone);
/*
* 名字:null年龄0----名字:null年龄0
* 名字:张三年龄11-----名字:张三年龄11
* 名字:小王年龄11-----名字:小王年龄11
* 名字:小王年龄11-----名字:小王年龄11----名字:666年龄11
*/
//原因是在克隆时会重新创建一个Student对象,重新分配地址
//注掉重写的toString方法,打印地址看看
System.out.println(stu);
/*打印结果,可看出stuClone地址不一样
* javaTest.Student@15db9742----javaTest.Student@15db9742
javaTest.Student@15db9742-----javaTest.Student@15db9742
javaTest.Student@15db9742-----javaTest.Student@15db9742
javaTest.Student@15db9742-----javaTest.Student@15db9742----javaTest.Student@6d06d69c
javaTest.Student@15db9742*/
}
}