目录
1. 回顾
- 1. 一个Java源文件中,可以有若干各类,但是只能有一个public类,并且public修饰的类名必须和文件名相同
- 2. 方法必须在类的内部,每一个类中,可以有多个方法,但只能有一个main方法。每一个类中都可以有一个main方法
2. 定义一个类
类的作用:通过类 去描述一个具体的对象
2.1 如何定义一个类
使用关键字class+类名去定义一个类,类名是大驼峰
{}中是类的成员,一个类必须包含两部分:属性(成员变量)和行为(成员方法),且变量和方法都是小驼峰
成员(成员变量和成员方法)前写法统一为public,且此处的成员方法不带 static 关键字
2.2 注意事项:
1. 一般一个文件当中只定义一个类
2. 每一个类都可以有一个自己的main方法,但只能有一个,main方法的格式为:
public static void main(String[] args){}
3. public修饰的类必须要和文件名相同
4. 类中的成员方法可以直接访问或使用成员变量,即成员变量是可以在成员方法中使用的。
3. 类的实例化(产生对象)
3.1 为什么要进行类的实例化?
定义了一个类,就相当于在计算机中定义了一种新的类型。如定义一个狗类,它并不是具体的狗,
它只是一种引用类型,需要对其进行实例化。把图纸变成真正的建筑实体。
3.2 什么是类的实例化?
用引用类型创建对象的过程,称为类的实例化
3.3 如何进行类的实例化?
在Java中采用new关键字,配合类名来创建对象。对象:new 类型() 对象是new出来的
3.4 实例化对象后,如何访问成员变量和成员方法?
通过点号(.)来访问,引用.变量、引用.方法 点号:调用的意思
通过一个类可以实例化无数个对象
3.5 通过一个例子来详细了解类的实例化:
//定义一个Dog类
public class Dog {
//成员变量
public String name;
public String color;
//成员方法
public void barks(){
System.out.println(name + "汪汪叫!");
}
public void wag(){
System.out.println(name + "摇尾巴");
}
//main方法
public static void main(String[] args) {
//实例化一个Dog对象
Dog dog = new Dog();
//点号(.)-》调用的意思
//1.可以通过 引用.属性来访问属性
dog.name = "小灰";
dog.color = "灰色";
System.out.println(dog.name);
System.out.println(dog.color);
//2.可以通过 引用.方法来访问方法
dog.barks();
dog.wag();
//实例化一个dog2对象
Dog dog2 = new Dog();
dog2.name = "大黄";
dog2.color = "黄色";
System.out.println(dog2.name);
System.out.println(dog2.color);
dog2.barks();
dog2.wag();
}
}
3.6 零碎知识点
在类内方法外的变量是成员变量,在方法内的变量是局部变量。
局部变量没初始化程序直接报错。
成员变量没初始化,程序可以运行,默认值是对应的初始值。
(引用变量 -> null,byte/short/int/long->0,float->0.0f,double->0.0,char->'/u0000',
boolean->false)
4. this的引用
4.1 先看一下最终的比较好的代码
public class Date {
public int year;
public int month;
public int day;
public void setDate(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(this.year+" "+this.month+" "+this.day);
}
public static void main(String[] args) {
Date date = new Date();
Date date2 = new Date();
date.setDate(2022,8,4);
date2.setDate(2022,8,5);
date.printDate();
date2.printDate();
}
}
4.2 为什么要有this引用
1. 形参名不小心与成员变量名相同
可能会出现形参自己给自己赋值的现象,根本没赋值到成员变量中
2.若我多实例化几个对象,在main方法中,我可以通过不同的引用知道是setDate和printDate的哪个对象,但站在成员方法的角度上,这两个函数中没有任何有关对象的说明,setDate和 printDate函数如何知道打印的是那个对象的数据呢?
这就有了this。
4.3 什么是this引用以及this引用的特性
this:当前对象的引用,即谁调用这个方法,谁就是this
如:
这时,date就是this
特性:
1. this只能在"成员方法"中使用,且不包括静态方法。
2. this是“成员方法”的第一个隐藏的参数,不加也会默认有一个this,(红色和蓝色部分都默认会有)但是为了防止形参名不小心与成员变量名相同,最好还是加上(蓝色部分的)this。
3. this有三种使用:this.成员变量 、 this.成员方法 、 this();访问构造方法
5. 对象的初始化和构造方法
5.1 默认初始化和就地初始化
实例化对象这一条语句(如:Student stu = new Student();)在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下(具体在后面JVM中会详细介绍)
1. 检测对象对应的类是否加载了,如果没有加载则加载
2. 为对象分配内存空间
3. 给对象中包含的成员设置初始值
【所以其实对象空间被申请好之后,对象已经设置好了初始值】
4. 调用构造方法,给对象中各个成员赋值
默认初始化:没给成员变量赋值,此对象的成员变量被默认初始化成初始值 就地初始化:在声明成员变量时,就直接给了值,这就是就地初始化。就地初始化的变量,若后面没有进行修改,那么它默认的输出值就是这个值
5.2 构造方法:对对象中的成员进行赋值
1. 构造方法没有返回值,方法名和类名必须是一样的
2. 实例化对象,一定会调用构造方法。当构造方法调用完成之后,对象才实际上产生了。
构造方法的作用就是对对象中的成员进行赋值,赋值为默认值也是赋值。
若是无参构造方法,会将对象中的成员全部赋值为默认值;
若是有参构造方法,会将对象中给了值的成员赋值成给的值,没给值的成员就是原来的初始值
有参构造方法,给了值的成员赋值成给的值,没给值的成员就是原来的初始值。
成员name给值了:hello,成员age没给值。
3. this(...);调用本类当中其它的构造方法,但必须放在构造方法里面,并且必须是第一行,且不能形成环(即不能我调用你,你里面再调用我)
4.若我们没有提供任何的构造方法,编译器会帮我们生成一份默认的无参的构造方法
一旦我们提供了任何一个有参构造方法,编译器则不再生成无参构造方法,若用到,需要我们自己提供
5. 在创建对象时,构造方法由编译器自动调用,并且在整个对象的生命周期内只调用一次。
6. 构造方法的作用就是对对象中的成员进行赋值,且在调用构造方法之前,对象中的成员已经有了初始值。
7. 构造方法可以重载