一、类的定义
1.1语法结构:
【修饰符列表】 class 类名{
属性;
方法;}
*属性:描述对象的状态信息,通常采用一个变量的显示来完成定义。成员变量没有赋值,系统赋默认值,一切向0看齐。
例:int age;
*方法:描述的是对象的动作信息
*对象又被称为实例,实例变量又被称为对象变量。
二、对象的创建
关键字:new,一种运算符,用于创建对象并在jvm的堆内存中为该对象开辟新的内存空间。
语法结构:类名 对象名=new 类名(可选的参数);
——对象所占用的内存是在堆内存中分配的,通过该语句,一个类可以实例化n个对象。
三、引用类型变量使用
引用数据类型和基本数据类型身份是相当的,不用进行特殊化的处理,统一看作”数据类型“处理。
所以引用数据类型变量的定义是可以在类体中充当实例变量的,这种定义的方式可以有效地交代各实体之间的复杂关系。相对的关系之间也更加的直观,更加的容易理解。
四、常见错误
空指针的异常:
Exception in thread "main" java.lang.NullPointerException
at test04.main(test04.java:7)
进程已结束,退出代码为 1
总的来说,当空的引用访问实例相关的数据时,一定会产生空指针异常,其中实例相关的数据,指的就是如果要访问该信息时,一定要通过对象进行访问,才可以正常的访问到正确的信息。在引用时,注意这种嵌套关系,认真一些。
五、自定义构造方法
创建实例的时候,经常需要同时初始化这个实例的字段,这时就需要构造方法。
class Person {
private String name;
private int age;
public Person(String name, int age) { // 定义构造方法
this.name = name;
thsiage = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
}
Person p = new Person("Xiao Kang", 18);
System.out.println(p.getName());
System.out.println(p.getAge())
创建实例的时候,实际上是通过构造方法来初始化实例的,定义一个构造方法能在创建Person实例的时候,一次性传入name和age完成初始化。
由于构造方法是如此特殊,所以构造方法的名称就是类名。构造方法的参数没有限制,在方法内部可以编写任意语句。但是,和普通方法相比,构造方法没有返回值也没有void,调用构造方法,必须用new操作符。
六、默认构造方法
任何class都是有构造方法的,如果一个类没有定义构造方法,编译器会自动生成一个默认构造方法,它没有参数也没有执行语句,类似于如下:
class Person {
public Person() {
}
}
需要特别注意,如果我们自定义了一个构造方法,那么,编译器就不再自动创建默认构造方法。
如果既要能使用带参数的构造方法,又想保留不带参数的构造方法,那么只能把两个构造方法都定义出来,如下:
class Person {
... ...
public Person() { // 不带参数构造方法
}
public Person(String name, int age) { // 带参数构造方法
this.name = name;
thsiage = age;
}
... ...
}
没有在构造方法中初始化字段时,引用类型的字段默认值是null,数值int类型默认值为0,布尔类型默认值是false。
七、多构造方法
可以定义多个构造方法,在通过new操作符调用的时候,编译器通过构造方法的参数数量、位置和类型自动区分。
class Person {
private String name;
private int age;
public Person(String name, int age){ // 数构造方法 2个参数
this.name = name;
this.age = age;
}
public Person(String name){ // 数构造方法 1个参数
this.name = name;
this.age = 12;
}
public Person(){ // 构造方法 无参数
}
}
创建实例调用"new Person("Xiao Kang", 20);",会自动匹配到构造方法"public Person(String name, int age)";创建实例调用"new Person("Xiao Kang");",会自动匹配到构造方法"public Person(String name)";创建实例调用"new Person( );",会自动匹配到构造方法"public Person( )"。
八、总结
实例在创建时通过new操作符会调用其对应的构造方法,构造方法用于初始化实例。
没有定义构造方法时,编译器会自动创建一个默认的无参数构造方法。
可以定义多个构造方法,编译器根据参数自动判断。
可以在一个构造方法内部调用另一个构造方法,便于代码复用。
九、参数传递
Java中的参数传递:分为值传递和引用传递
但本质上,Java中只有值传递。引用传递,其实可以理解为传的是类似指针的东西。
值传递就是把基本变量的值拷贝一份,传递这个拷贝。引用传递则是传递的引用的地址,也就是该变量在内存空间的地址。
十、值传递
只有基本数据类型采用值传递,特点是传递的是值的拷贝,传递完后两者就没有关系了。也就是说方法内和方法外的值互不相干
注:8种基本数据类型以外的数据类型都为引用类型。
十一、引用传递
指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
传递的是一个拷贝,即副本。也就是说,对于一个参数传递,存在两个地址指向同一个内存空间。这里我们可以用内存分配示意图来体现
十二、String类型传递
先说结论,String类型传递与基本数据类型的传递效果相似。
说明:
String类对象一旦创建,其内容不可更改:
String类的所有方法都不会改变String类对象内容,要改变String类对象的值就必须创建一个新的String对象。
也就是说,当进行参数传递时,如果方法内对String类对象的值进行了修改,那么实际上是创建了一个新的String类对象,然后让原来的变量指向它而已。但是这个“原来的变量”是一份拷贝副本,只是一开始创建的时候与主方法中的传递的值相同而已,现在改变之后,两者就毫无关系了。