Hello小伙伴们,C语言的更新暂时告一段落,从今天开始,小编会给大家分享自己的Java的学习过程,快来和小编一起学习吧!
大家一定有所耳闻,在Java中一切皆对象,那么今天小编就和大家介绍何为类和对象?
1. 面向对象的初步认知
1.1 什么是面向对象
Java 是一门纯面向对象的语言 (Object Oriented Program ,简称 OOP) ,在面向对象的世界里,一切皆为对象。 面 向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情 。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
1.2 面向对象与面向过程
假设:
下图中男孩(boy)、女孩(girl)为类(class),而具体的每个人为该类的对象(object):
下图中汽车为类(class),而具体的每辆车为该汽车类的对象(object),对象包含了汽车的颜色、品牌、名称等。
Java中的对象
现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。
拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。
对比现实对象和软件对象,它们之间十分相似。
软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。
在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。
Java 中的类
类可以看成是创建 Java 对象的模板。
通过上图创建一个简单的类来理解下 Java 中类的定义:
public class Dog { String breed; int size; String colour; int age; void eat() { } void run() { } void sleep(){ } void name(){ } }
一个类可以包含以下类型变量:
- 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
- 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
- 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。
一个类可以拥有多个方法,在上面的例子中:eat()、run()、sleep() 和 name() 都是 Dog 类的方法,接下来我们学习如何定义类和使用。
2.类定义和使用
2.1 简单认识类
类是用来对一个实体 ( 对象 ) 来进行描述的 ,主要描述该实体 ( 对象 ) 具有哪些属性 ( 外观尺寸等 ) ,哪些功能 ( 用来干啥) ,描述完成后计算机就可以识别了:
比如:洗衣机,它是一个品牌,在 Java 中可以将其看成是一个类别。属性:产品品牌,型号,产品重量,外观尺寸,颜色 ...功能:洗衣,烘干、定时 ....
2.2 类的定义格式
那么我们该如何定义一个类呢,往下看
在Java中定义类时需要用到class关键字,具体语法如下
// 创建类 class ClassName{ field; // 字段(属性) 或者 成员变量 method; // 行为 或者 成员方法 }
class 为 定义类的关键字, ClassName 为类的名字, {} 中为类的主体。
类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,称为类的成员方法: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("定时功能"); } }
3.类的实例化
3.1 什么是实例化
定义了一个类,就相当于在计算机中定义了一种新的类型 ,与 int , double 类似,只不过 int 和 double 是 java 语言自 带的内置类型,而类是用户自定义了一个新的类型,比如上述的:PetDog 类和 Student 类。它们都是类 ( 一种新定 义的类型) 有了这些自定义的类型之后,就可以使用这些类来定义实例 ( 或者称为对象 ) 。用类类型创建对象的过程,称为类的实例化 ,在 java 中采用 new 关键字,配合类名来实例化对象,举个例子:class Dog { public String name; public String color; public void fun1() { System.out.println("汪汪汪!"); } public void fun2() { System.out.println("摇尾巴!"); } } public class Test_4 { public static void main(String[] args) { Dog dog = new Dog(); dog.name = "旺财"; dog.color = "黄色"; System.out.println(dog.name); System.out.println(dog.color); dog.fun1(); dog.fun2(); } }
输出结果:
注意事项
- new 关键字用于创建一个对象的实例.
- 使用 . 来访问对象中的属性和方法.
- 同一个类可以创建多个实例.
3.2类和对象的说明
1. 类只是 一个 模型 一样的东西,用来对一个实体进行描述,限定了类有哪些成员 .2. 类是一种自定义的类型 ,可以用来定义变量 .3. 一个类可以实例化出多个对象, 实例化出的对象 占用实际的物理空间,存储类成员变量4. 做个比方。 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图 ,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
4.this引用
4.1 为什么要用this引用
我们先来举个例子:
class DateUtil { public int year; public int month; public int day; public void setDate(int y, int m, int d) { year = y; month = m; day = d; } public void show() { System.out.println("年:" + year + "月:" + month + "日:" + day); } } public class Test_2 { public static void main(String[] args) { DateUtil dateUtil = new DateUtil(); dateUtil.setDate(2022, 11, 4); dateUtil.show(); } }
这段代码我们可以看到一个DateUtil类下有多个成员变量和方法,通过一个新的对象去调用这些成员和方法,但是如果这里我们将SetDate中改写成如下代码:
public void setDate(int y, int m, int d) { year = year; month = month; day = day; }
结果:
我们可以看到,这样并不能给类里的成员变量实例化,是因为这里形参名和成员变量名相同,相当于形参给形参赋值,并没有达到预期的效果,那么在这里this的作用就出来了,我们只需要在这些成员变量前面加个this就好了,这样就能赋值并输出了,那么问题来了,什么事this引用呢???
4.2 什么是this引用
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该 引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成
public void setDate(int year, int month, int day) { this.year = year; this.month = month; this.day = day; }
这里的this表示给当前的对象赋值;
4.3 this引用的特性
1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
5. 对象的构造及初始化
5.1 如何初始化对象
通过前面知识点的学习知道,在 Java 方法内部定义一个局部变量时,必须要初始化,否则会编译失败:public static void main(String[] args) { int a; System.out.println(a); } // Error:(26, 28) java: 可能尚未初始化变量a
public static void main(String[] args) { Date d = new Date(); d.printDate(); d.setDate(2021,6,9); d.printDate(); } // 代码可以正常通过编译
需要调用之前写的 SetDate 方法才可以将具体的日期设置到对象中。 通过上述例子发现两个问题:1. 每次对象创建好后调用 SetDate 方法设置具体日期,比较麻烦,那对象该如何初始化?2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?
5.2 构造方法
5.2.1 概念
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次,举个例子:public Date(int year, int month, int day){ this.year = year; this.month = month; this.day = day; System.out.println("Date(int,int,int)方法被调用了"); }
注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
5.2.2 特性
- 1. 名字必须与类名相同
- 2. 没有返回值类型,设置为void也不行
- 3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
- 4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
举个例子:
class DateUtil { public int year; public int month; public int day; public DateUtil() { System.out.println("调用了该方法"); } public DateUtil(int year, int month, int day) { this.year = year; this.month = month; this.day = day; System.out.println("调用了3个参数的构造方法!"); } /*public void setDate(int year, int month, int day) { this.year = year; this.month = month; this.day = day; }*/ public void show() { System.out.println("年:" + year + "月:" + month + "日:" + day); } } public class Test_2 { public static void main(String[] args) { DateUtil dateUtil = new DateUtil(2022, 11, 11); dateUtil.show(); } }
这里我们通过构造方法直接给成员变量初始化,而并没有调用setDate这个方法,这就是构造方法!
我们也可以通过this引用去调用构造方法:
class DateUtil { public int year; public int month; public int day; public DateUtil() { this(2022,11,11); System.out.println("调用了该方法"); } public DateUtil(int year, int month, int day) { this.year = year; this.month = month; this.day = day; System.out.println("调用了3个参数的构造方法!"); } /*public void setDate(int year, int month, int day) { this.year = year; this.month = month; this.day = day; }*/ public void show() { System.out.println("年:" + year + "月:" + month + "日:" + day); } } public class Test_2 { public static void main(String[] args) { DateUtil dateUtil = new DateUtil(); dateUtil.show(); } }
这里可以发现,我们在主函数中的DateUtil()方法中并没有传参,而是通过构造方法,用this给成员变量初始化,这样输出也能达到预期的结果!
注:当通过this去调用构造方法时,this要放在第一行,否则代码编译不通过
5.3 默认初始化
如果在类里的成员变量没有赋值,编译器默认会赋一个初始值:
class DateUtil { public int year; public boolean month; public float day; public DateUtil() { System.out.println("调用了该方法"); } public DateUtil(int year, boolean month, float day) { this.year = year; this.month = month; this.day = day; System.out.println("调用了3个参数的构造方法!"); } /*public void setDate(int year, int month, int day) { this.year = year; this.month = month; this.day = day; }*/ public void show() { System.out.println("年:" + year + "月:" + month + "日:" + day); } } public class Test_2 { public static void main(String[] args) { DateUtil dateUtil = new DateUtil(); //dateUtil.show(); System.out.println(dateUtil.year); System.out.println(dateUtil.month); System.out.println(dateUtil.day); }
运行如下:
这里有张表供大家参考:
6.总结
到这儿今天的主题就和大家介绍完了,小编也是刚刚学习java的小白,后续还会给大家分享Java的相关知识,一起学习,一起进步,如对上文有意见或者有错误,还请大佬们斧正,觉得有帮助的童鞋们,创作不易,蟹蟹三连!