目录
一、类与对象的概念
1.1 什么是面向对象
在我们学习java过程中,第一次接触类与对象语法的时候,可能会想什么是类?什么是对象?它们在java语言编程中有什么作用?为什么会使用类与对象?接下来我将带领大家来详细讲解类与对象。
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),就跟C++是一门面向过程的编程语言类似。在Java编写程序的时候,我们只需要关注对象,无需过多关注其中的过程
举例说明:我们在用洗衣机洗衣服的时候,需要把衣服放进洗衣机,倒入洗衣液,启动洗衣机,等洗衣机结束工作后,我们的衣服就洗好了。
在这一系列过程中,人、衣服、洗衣液和洗衣机就可以理解为面向对象来执行,而洗衣机是如何去洗衣服以及如何甩干这一系列过程可以理解为面向过程来执行。Java语言只需要关注对象之间是如何处理的,不用过多关注其中处理过程。
1.2 什么是对象
对象通俗点来说就好比我们现实生活中的每一个实体,人、动物、汽车或者物品等等
1.3 什么是类
每个对象都有自己各自的属性,就拿洗衣机来说,一个洗衣机的属性包括产品名称、产品型号、产品尺寸和重量等,又或者说人作为对象,其属性包括姓名,性别,身高,体重等。
类是用来定义对象的属性描述,描述对象具有那些属性(外观尺寸)、哪些功能(用来干啥的),这样便于计算机来识别对象。
二、类与对象的定义
2.1 类的创建
类在java语言编程创建格式为:
//创建类
class Person {
//对象的属性、成员变量
public String name; //名字
public String sex; //性别
public double height; //身高
public double weight; //体重
//对象的行为、成员方法
public void run() {
System.out.println("他等会去跑步");
}
public void eat() {
System.out.println("他正在吃饭!!!");
}
说明:1、class为定义类的关键字,
2、Person为类的名字,类名的创建采用大驼峰形式
3、{}为类定义对象的属性和行为,即类的主体
4、此处在定义属性时统一使用public修饰和写的方法中不带static关键字,下节类与对象(下)会详细解释
5、在定义类的时候,若使用public修饰类,则必须保证类名字和文件名相同
public class Person { //此处使用public修饰类必须要和文件名相同
//属性
//行为
}
2.2 对象的创建
在Java中,对象的创建是使用 类 通过 new 关键字来实例化对象。用类类型创建对象的过程,称为类的实例化
代码格式如下:
public class Test {
public static void main(String[] args) {
Person person = new Person(); //Person为类名,person为对象名
person.name="小明"; //使用对象名.来访问类中的属性和方法
person.eat();
}
}
一个类可以实例化多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量(类的属性和方法)
public class Test {
public static void main(String[] args) {
Person person = new Person(); //一个类可以实例化多个对象
person.name="小明";
person.eat();
Person person1 = new Person();
person1.name="小军";
person1.eat();
Person person2 = new Person();
person2.name="小红";
person2.eat();
}
}
2.3 练习创建两个dog对象,定义其属性并运行输出结果
代码如下:
class PetDog {
public String name;//名字
public String color;//颜色
// 狗的属性
public void barks() {
System.out.println(name + ": 旺旺旺~~~"+" 颜色:"+ color);
}
// 狗的行为
public void wag() {
System.out.println(name + ": 摇尾巴~~~"+" 颜色:"+ color);
}
}
public class Main {
public static void main(String[] args) {
PetDog dog1 = new PetDog(); //通过new实例化对象
dog1.name = "阿黄";
dog1.color = "黑黄";
dog1.barks();
dog1.wag();
PetDog dog2 = new PetDog();
dog2.name = "小白";
dog2.color = "灰白";
dog2.barks();
dog2.wag();
}
}
输出结果:
阿黄: 旺旺旺~~~ 颜色:黑黄
阿黄: 摇尾巴~~~ 颜色:黑黄
小白: 旺旺旺~~~ 颜色:灰白
小白: 摇尾巴~~~ 颜色:灰白
三、 对象引用的特点
3.1 当一个引用为null时,引用不指向任何对象
如果类实例化对象为null,当访问对象中的属性及方法时,运行编译会报错,因为此时引用不再指向任何对象,无法访问对象中的属性
public class Class1 {
public static void main(String[] args) {
Person person = null; //引用为null,表示引用不指向任何对象
person.name=" 小红"; //此时访问对象中的属性时,运行编译会报错
person.sex=" 男 ";
}
}
3.2 类与对象中没有引用指向引用
举例如下
public class Class1 {
public static void main(String[] args) {
Person person1 = new Person;
Person person2 = new Person;
person1 = person2;
}
}
此时分析当person1=person2时,栈和堆的变化过程
(1)
Person person1 = new Person;
Person person2 = new Person;
此时创建2个对象person1和person2,在栈和堆中存放相应内容
(2)
person1=person2
当person1=person2时,person2把存放在栈中的地址赋给了person1,此时person1和person2在栈中存放的地址为同一地址,都指向存放在堆中的同一对象,所以没有引用指向引用这种说法。
我们可以总结为当对象person1=person2时,代表的是person1的引用指向了person2引用所指向的对象
3.3 一个引用只能同时指向一个对象
public class Class1 {
public static void main(String[] args) {
Person person1 = new Person; // 1
person1 = new Person; // 2
person1 = new Person; // 3
person1 = new Person; // 4
person1 = new Person; // 5
}
}
当出现上述引用同时指向多个对象时,在Java语言中此时这个引用最后指向了最后一个对象,即一个引用只能同时指向一个对象
四、对象初始化
4.1 当我们创建好一个对象时,如果需要给对象设立初始值,这时可以调用类下的方法去设置到对象里面。
代码如下:
public class Texe {
public int year;
public int month;
public int day;
public void setDay(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) {
Texe d = new Texe();
d.setDay(2022,11,12); //调用类下的setDay方法设置对象初始值
d.printDate();
}
}
此时我们看到设置对象初始值通过调用类下的方法会有点麻烦,因此我们可以通过另外一种方法来给对象设置初始值,这种方式就是在类的下面给对象创建一个构造方法,这样就可以给对象中的成员进行初始化,但构造方法并不负责给对象开辟空间。
4.2 构造方法格式
代码如下:
public class Texe {
public int year;
public int month;
public int day;
public Texe (int year,int month,int day) { //创建对象的构造方法
this.year = year;
this.month = month;
this.day = day;
System.out.println("此方法调用");
}
public void priDay() {
System.out.println(this.year+"-"+this.month+"-"+this.day);
}
public static void main(String[] args) {
Texe d = new Texe(2022,11,12); //设初始值
d.priDay();
}
}
注意点:
(1)构造方法中一般用public 修饰
(2)构造方法中方法名字必须与类名保持一致
(3)构造方法没有返回类型,void也不被允许
(4)创建对象时,若没有创建构造方法,则默认由编译器自动调用无参数构造方法,一旦自己创建对象的构造方法,编译器则不再提供。
(5)构造方法在对象的生命周期内仅只调用一次(相当于人的出生,每个人只能出生一次)