目录
一、什么是类、什么是对象
二、为什么要学习类和对象
三、初识面向过程和面向对象编程
四、如何定义类
4.1 语法形式
4.2 定义示例
示例一:定义一个描述学生的类
示例二:定义一个描述冰箱的类
示例二:定义一个描述狗的类
4.3 修改public修饰的主类名称
五、如何实例化一个对象
5.1 语法形式
5.2 实例化的对象在内存中的分析
5.3 如何通过对象的引用访问对象的成员变量和对应类的成员方法
5.4 类和对象的关系
六、this引用
6.1 为什么了解this引用
6.2 什么是this引用
6.3 this引用的特性
七、非静态成员变量初始化方式
方式一:
方式二:
方式三:
方式四:
方式五:
八、构造方法
8.1 概念
8.2 特性
一、什么是类、什么是对象
1. 一切实体皆可称为对象,例如:冰箱、小狗、学生等。
2. 类是用来描述对象的一个引用数据类型,它和C语言中的结构体类似。
二、为什么要学习类和对象
答:是为了更好的面向对象编程。
三、初识面向过程和面向对象编程
四、如何定义类
4.1 语法形式
说明:(class、类名、如何修饰类、在Java文件中定义几个类,main方法、怎么修改主类名,类中写些什么,成员变量有默认值)
1. 定义类要用到class关键字。
2. 类名采用大驼峰的形式。
3. 注意一下,类前面的修饰只会出现两种情况:① public修饰 ② 无修饰。
4. 一个源文件中最多有一个public修饰的类,且这个类的类名要与Java源文件名保持一致,这个被public修饰的类又称为主类。
5. 通常一个Java文件中只会写一个类,使用ideal集成开发环境创建一个Java文件后,编译器会在该Java文件中自动生成一个主类框架。
6. 程序的入口main方法只能放在被public修饰的类中使用,main方法的书写规范:public static void main(String[] args) { //... }。为什么main方法要用static修饰?答:JVM在运行Java应用程序时,首先会调用main方法,调用时并不会自动实例化这个类的对象,而是通过类名直接调用main方法,因此需要用static修饰。
7. 不要轻易修改public修饰的主类名称,如果非要修改,可以通过开发工具修改(具体操作见下面的 <4.3 修改public修饰的主类名称> 中的内容)。
8. 定义类时一般会对对象的两个方面进行描述(也可根据实际需要自行决定是否要将这两个方面描述完整):一个是对象的属性,另一个是对象拥有的行为。通常我们会把属性称为成员变量,行为称为成员方法。
9. 成员变量在没有初始化之前都会有一个默认值(也就是说成员变量可以不初始化就可以直接使用而不报错):基本数据类型除boolean类型的默认值是false外,其余的默认值都是0值,引用数据类型的默认值都是null。
10. 此处我们在定义成员变量、成员方法时为什么均采用public修饰,以及定义成员方法时为什么没有用static修饰,看到后面就会理解了。
4.2 定义示例
示例一:定义一个描述学生的类
class Student {String name;int age;double score;public void set() {System.out.println(name + " " + age + "" + score);}public void eat() {System.out.println(name + "正在吃饭...");}
}
示例二:定义一个描述冰箱的类
class WashMachine {public String brand; // 品牌public String type; // 型号public double weight; // 重量public double length; // 长public double width; // 宽public double height; // 高public String color; // 颜色public void washClothes(){ // 洗衣服System.out.println("洗衣功能");}public void dryClothes(){ // 脱水System.out.println("脱水功能");}public void setTime(){ // 定时System.out.println("定时功能");}
}
示例二:定义一个描述狗的类
class Dog {public String name;//名字public String color;//颜色public void barks() {System.out.println(name + ": 旺旺旺~~~");}public void wag() {System.out.println(name + ": 摇尾巴~~~");}
}
4.3 修改public修饰的主类名称
注意:使用开发工具只能修改只存在一个类的Java文件中主类的名称,因为如果一个Java文件中有多个类,编译器不知道要改哪个类的类名(它并不会主动识别哪个是主类)。
五、如何实例化一个对象
5.1 语法形式
1. 实例化对象要用到new关键字。
2. 在方法中(注意一下,这里并没有限定在哪个方法中哈),写上类名 + 变量名 = new 类名();就可以实例化出一个对象了。
5.2 实例化的对象在内存中的分析
说明:上面代码中,在main方法中分别用new关键字实例化了两个Dog类型的对象,分别是dog1和dog2(它们是引用数据类型的变量,简称引用),它们里面存的是其所指向对象的地址,且dog1和dog2引用由于在方法中,故它们是局部变量,局部变量的内存在栈中开辟空间,注意:成员变量和局部变量的生命周期、作用域是不同的。Java中给对象所开辟的空间在堆区。每个对象都有自己独有的成员变量,但并没有自己独有的成员方法,因为方法是用来调用的,并不需要开辟空间存放。综上有了如下所示的内存分布。
5.3 如何通过对象的引用访问对象的成员变量和对应类的成员方法
对象+(.)+成员变量/成员方法
5.4 类和对象的关系
1. 类只是一个模型,用来对一个实体进行描述,限定。
2. 类是一种自定义的类型,可以用来定义变量。
3. 一个类可以实例化出多个对象,类不占内存空间,实例化出的对象占用实际的内存空间,用于存储对象的成员变量。 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子。设计图只设计出需要什么东西,但是并没有实体的建筑存在。类只是描述了对象会有哪些特征,并没有正真的对象存在,不会占用实际的内存空间。
六、this引用
6.1 为什么了解this引用
问题一:在下图中使用对象的引用调用非静态的成员方法时(红色框起来的部分),非静态成员方法的参数中并没有关于对象的描述,编译器怎么知道非静态成员方法中下图中绿色部分指的是哪个对象的成员变量?
问题二:当非静态成员方法的形参名与成员变量名不小心相同时,为什么这样赋值,使用日期类中的printDate方法打印出来的结果会发现赋值没有成功?
6.2 什么是this引用
1. this引用和当前调用成员方法的引用指向的是同一个对象。
2. 在非静态的成员方法中对所有非静态的成员变量/成员方法的调用,都是通过this引用去访问的。
3. 在所有的非静态成员方法的参数列表中其实都隐藏了形参this,例如上面的代码示例中,setDate方法的完整表示应该为:public void setDate(Date this, int y, int m, int d) { //... };
4. 上面的问题一,编译器怎么知道成员方法绿色部分指的是哪个对象的成员变量?答:是通过编译器自动传递的参数this知道的。
5. 上面的问题二,当成员方法的形参名与成员变量名不小心相同时,编译器采用局部变量优先的原则,类中的setDate方法中所有的year、month、day代表的都是形参year、month、day而不是成员变量中的year、month、day,所以造成了赋值并没有成功。
6. 建议在非静态的成员方法中调用非静态的成员变量/成员方法时,都给非静态的成员变量/成员方法前加一个this,相当于明确说明了这个非静态的成员变量/成员方法是哪个对象的。
6.3 this引用的特性
1. this的类型:哪个引用调用的非静态成员方法this就和哪个引用的类型一致。
2. this只能在非静态的成员方法中使用。
3. 在非静态的成员方法中,this引用只能找到所指向对象的成员变量/方法(但并不推荐去找静态的成员变量/方法,因为静态的成员变量/方法并不依赖于对象),不能找到其他对象的成员变量/方法。
4. this引用是非静态成员方法的第一个隐藏的形式参数,在非静态成员方法执行时,编译器会负责将调用非静态成员方法的引用所指向的对象的地址传递给形参this。
5. 代码层面来简单演示--->注意:下图右侧中的Date类也是可以通过编译的。
七、非静态成员变量初始化方式
方式一:
成员变量用public修饰,在main方法中采用引用+(.)+成员变量的方式初始化。
方式二:
在类中定义成员方法的形式初始化成员变量。
方式三:
在创建类时,就给成员变量初始化,但这种初始化方式没有什么意义,因为不可能所有对象的成员变量的值都是一样的。(这种初始化方式也叫,就地初始化)。
方式四:
利用构造方法,顺便初始化 。(下面会具体介绍构造方法是什么)。
方式五:
在类中利用构造代码块初始化。 (<类和对象(下)>会介绍Java中的代码块)
八、构造方法
8.1 概念
1. 方法的构成:返回类型 + 方法名称 + 参数列表 { //方法体 };
构造方法:方法名称(和所在类的类名一致) + 参数列表 { //方法体 };
2. ① 构造方法的名字与所在类的类名一致,没有返回值类型,设置为void也不行。
② 一般情况下使用public修饰构造方法,特殊场景下会被private修饰(后序讲单例模式时会遇到)。
③ 在实例化对象时由编译器自动调用,并且在对象的生命周期内只调用一次。
④ 构造方法是一种特殊的成员方法,构造方法的作用就是对对象中的非静态成员变量进行初始化,并不负责给对象开辟空间。
8.2 特性
① 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)。
例如上图代码中带参数的构造方法,和不带参数的构造方法就构成了方法的重载。
我们可以使用开发工具生成所有可能构成的构造方法,步骤如下图。
② 如果没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
③ 如果有自己定义的构造方法,编译器不会再提供不带参数的构造方法,如果此时又想使用不带参数的构造方法就得自己去写了。例如,下图中自己已经定义了带参数的构造方法,在示例化对象时,new的后面没有给构造方法传参数,就会报错。
④ 可以通过this(...);在构造方法中调用其他的构造方法来简化代码。
注意1:this(...)必须是构造方法中第一条语句。
注意2:使用this();不能形成环,否则会报错。
本篇文章已完结,谢谢支持哟 ^^ !!!