目录
一、认识类和对象
1.1 面向对象的概念
Java是一门纯面向对象的语言,简称OOP,在面向对象的世界里,一切皆为对象。面向对象是一种解决问题的思想,主要依靠对象之间的交互来完成想要的结果。
1.2 面向对象与面向过程
面向过程和面向对象并不是一门语言,而是解决问题的方法,没有好坏之分,都有其专门的应用场景。举个例子,面向对象类似于调用方法,我们只需知道有这个方法,并不需要知道这个方法具体是怎么实现的,而这个方法是怎么实现的,实现的过程就是面向过程所需要关心的。
1.3 类与对象
面向对象关注的是对象,而对象是现实生活中的实体。类是在描述对象,计算机本身并不认识对象,而我们需要在类中编写对象的各种特征,因为我们要通过类来告诉计算机对象是什么样子的,让计算机认识对象。
二、类的定义与实例化
2.1 类的定义
在 Java 中定义类时需要用到 class 关键字,格式如下:
class ClassName {field ; // 成员变量method ; // 成员方法}
注:class 为定义类的关键字,ClassName 为类的名字,{} 中为类的主体。
例如:在类中,我们需要定义一个对象的属性和成员方法来将对象具象化,例如,我们想定义一只宠物狗,那我们就需要在类中写出宠物狗的姓名,颜色等属性,以及宠物狗所会具有的行为等。
class Dog {
public String name;//狗的名字
public String color;//狗的颜色
public int age;//狗的年龄
// 狗的叫声
public void barks() {
System.out.println(name + ": 汪汪汪");
}
// 狗的行为
public void wag() {
System.out.println(name + "在摇尾巴");
}
}
不仅如此,我们还需注意的是,一个文件当中一般只定义一个类,以及 main 方法所在的类一般要使用 public 修饰,public 修饰的类必须要和文件名相同,不要轻易修改 public 修饰的类的名称。
2.2 实例化的概念
定义了一个类,就相当于在计算机中定义了一种新的类型,与 int、double 类似,不过 int 和 double 是 Java 中自带的内置类型,而类是用户自定义了一个新的类型,例如上文的 Dog 类。它们都是类,有了这些自定义的类型之后,就可以使用这些类来定义对象。用类类型创建对象的过程,称为类的实例化,在 Java 中采用 new 关键字,配合类名来实例化对象,同一个类可以创建多个实例,例如:
Dog dog1 = new Dog();
Dog dog2 = new Dog();
只要 new 就会产生新的对象,只要有新的对象,就会有新的内存,我们只需要通过对象的引用,去访问对象的成员变量或是成员方法,即可对宠物狗类进行具象化,具体是使用"."来访问对象中的属性和方法,例如:
public static void main(String[] args) {
//实例化对象
Dog dog = new Dog();
dog.name = "毛球";
dog.age = 3;
dog.color = "金色";
System.out.println("姓名:" + dog.name);//姓名:毛球
System.out.println("年龄:" + dog.age);//年龄:3
System.out.println("颜色:" + dog.color);//颜色:金色
dog.barks();//毛球: 汪汪汪
dog.wag();//毛球在摇尾巴
Dog dog = new Dog();
}
三、this引用
3.1 this引用的作用
先来看一个打印日期的例子:
如上图,我们在打印日期的过程中,出现了 year = year 这种形参和成员变量名称一样的情况,由于局部变量优先使用,setDate 方法中进行的是形参赋值给形参,以至于最后输出全是0。此时就需要 this 引用来告诉编译器当前的 year 是对象的 year,代码如下:
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.setDate(1999,9,9);
date.printDate();//年:1999 月:9 日:9
}
这样就可以成功将 setDate 方法中输入的日期赋值给成员变量。
3.2 this引用的特性
【this引用格式】
this.成员变量:访问成员变量
this.func():访问当前的成员方法
this():调用当前类的构造方法
this 引用指向当前对象 (成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。需要注意的是,this引用的是调用成员方法的对象。
1、this 的类型对应类类型引用,即哪个对象调用就是哪个对象的引用类型。
2、this 只能在成员方法中使用。
3、在成员方法中,this 只能引用当前对象,不能再引用其他对象。
4、this 是成员方法第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this 负责来接收。
四、对象的构造及初始化
4.1 默认初始化
众所周知,局部变量不初始化就会报错,但是对象的成员变量不需要初始化,因为对象空间被申请好之后,对象中包含的成员已经设置好了初始值,其中各种数据类型的默认值如下图:
![](https://img-blog.csdnimg.cn/8ec7e5a083074c229395552b4ac30684.png)
注:所有的引用类型,默认值都为null。
4.2 就地初始化
在声明成员变量时,就直接给出了初始值。若对象中成员变量未赋值,则会默认初始值为声明成员变量时的初始值。如下图中 date 对象并未给成员变量赋值,则输出是声明时的初始值。
public int year = 1999;
public int month = 9;
public int day = 9;
public void printDate() {
System.out.println("年:" + this.year + " 月:" + this.month + " 日:" + day);
}
public static void main(String[] args) {
Date date = new Date();
date.printDate();//年:1999 月:9 日:9
}
4.3 构造方法
4.3.1 构造方法的概念
构造方法是一个特殊的成员方法,该方法没有返回值,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次,构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
在我们实例化对象时编译器会自动调用合适的构造方法,构造方法至少有一个,当我们没有写任何构造方法时,编译器会生成一个不带参数的构造方法。所以,我们可以理解为对象的初始化一定会调用构造方法。同时,构造方法是可以重载实现的。(重载:① 其方法名必须相同,② 参数列表必须至少一个不同 (参数的个数不同、参数的类型不同、类型的次序不同),满足以上两个条件,即可构成重载)。
public class Date {
//成员变量
public int year;
public int month;
public int day;
//带有三个参数的构造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
//无参的构造方法
public Date() {
this.year = 1988;
this.month = 8;
this.day = 8;
}
public void printDate() {
System.out.println("年:" + this.year + " 月:" + this.month + " 日:" + this.day);
}
public static void main(String[] args) {
//实例化date时自动选择适合的构造方法
Date date = new Date();//年:1988 月:8 日:8
Date date1 = new Date(1999,9,9);//年:1999 月:9 日:9
date.printDate();
date1.printDate();
}
}
注:一旦这个类提供了任何构造方法,编译器都不会再提供无参的构造方法。例如,上文中若将无参的构造方法注释,编译器就会报错,因为实例化 date 对象时,date 对象是无参的,没有适合 date 对象的构造方法给他调用。
4.3.2 构造方法的快速实现
在编写构造方法时,我们可以使用让编译器帮我们完成构造,使用快捷键 Alt+Insert 或点击鼠标右键,如下图:
4.3.3 构造方法中的this引用
看下方的例子,实例化 date 对象时,date 对象调用的是无参的构造方法,在无参的构造方法中并未对 date 对象中的成员进行初始化,但无参的构造方法中可以利用 this 引用来调用带三个参数的构造方法,从而实现初始化 date 对象中的成员,实现代码的简化。
//无参的构造方法
public Date() {
/*this.year = 1988;
this.month = 8;
this.day = 8;*/
this(1988,8,8);//调用带有三个参数的构造方法
}
//带有三个参数的构造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public static void main(String[] args) {
//实例化date时自动选择适合的构造方法
Date date = new Date();
}
注:在构造方法中调用构造方法,this引用必须在第一行,否则就会报错。
总结
1、同一个类可以创建多个实例。
2、this引用的是调用成员方法的对象。
3、构造方法没有返回值,名字必须与类名相同,并且在整个对象的生命周期内只调用一次。
4、一个类若提供了任何构造方法,编译器不会再提供无参的构造方法。
5、若要在构造方法中调用构造方法,this引用必须在第一行,否则就会报错。