Java 类和对象
爱吃香菜¹ 2024-06-22 14:35:03 阅读 57
目录
1、面向对象的初步认知
2、类定义和使用
2、1 简单认识类
2、2类的定义
3、类的实例化
3、1什么是实例化
3、2类和对象的说明使用
编辑
4、this引用
4、1什么是this引用
4、2 this引用的特性
5、对象的构造及初始化
5、1构造方法
5、2默认初始化
5、3就地初始值
本篇博客学习Java类与对象。会涉及到许多新的概念,小伙伴们认真看完并及时巩固消化知识点哦
1、面向对象的初步认知
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
面向对象与面向过程的区别:
面向对象:注重的是对象(结果)(1.找对象 2.创建对象 3.使用对象),如像洗衣服注重的只有洗衣机,衣服和洗衣粉几个对象是如何交互完成工作的,而不注意是怎么洗的
面向过程:注重的是过程,如洗衣服时洗衣服的过程必须每个环节都在,少一个环节都不行,按照这种方式写代码,将来扩展或维护起来会很麻烦
以洗衣服为例,感受面向过程与面向对象编程语言的区别。
面向过程编程语言就像传统洗衣方式一样。
传统的方式:注重的是洗衣服的过程,少了一个环节可能都不行。
而且不同衣服洗的方式,时间长度,拧干方式都不同,处理起来就比较麻烦。如果将来要洗鞋子,那就是另一种放方式。按照该种方式来写代码,将来扩展或者维护起来会比较麻烦。
而面向过程编程语言就像现代洗衣方式一样。
注:面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景 。
2、类定义和使用
面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机。
上图左侧就是对洗衣机简单的描述,该过程称为对洗衣机对象(实体)进行抽象(对一个复杂事物的重新认知),但是这些简化的抽象结果计算机也不能识别,开发人员可以采用某种面相对象的编程语言来进行描述,比如:Java语言。
2、1 简单认识类
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了。
在Java语言中,如何对上述的洗衣机类来进行定义呢?
2、2类的定义
在java中定义类中,class为定义类的关键字。WashMachin为类名(建议采用大驼峰式命名)。{}中为类的主体。类中包含的内容称为类的成员。属性主要是描述类的,称之为类的成员属性或类的成员变量。而方法主要说明类有哪些功能,称之为类的成员方法。因此,类的主体由成员变量和成员方法构成,合称为类的成员。
//创建洗衣机类
public 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("定时功能");
}
}
注意事项:
1. 一般一个文件当中只定义一个类
2. main方法所在的类一般要使用public修饰
3. public修饰的类必须要和文件名相同
4. 不要轻易去修改public修饰的类的名称。
采用Java语言将洗衣机在计算机中定义完成,经过Javac文件之后形成 .class文件。在JVM上=的基础上计算机就可以识别了。
3、类的实例化
3、1什么是实例化
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的:WashMachine类。是(一种新定义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
//创建狗类public class PetDog { //狗的属性(成员变量) public String name; public String color; //狗的行为(成员方法) public void bark(){ System.out.println("汪汪汪~~~"); } public void eat(){ System.out.println("吃狗粮..."); }}public class Test { public static void main(String[] args) { PetDog dog1 = new PetDog(); //通过new实例化对象 dog1.name = "大黄";//用"对象名."来访问对象的成员(变量/方法) dog1.color = "黑黄色"; dog1.bark(); dog1.eat(); }}
注意事项:
1.new 关键字用于创建一个对象的实例.
2.使用 . 来访问对象中的属性和方法.
3.同一个类可以创建对个实例.
3、2类和对象的说明使用
1. 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员.
2. 类是一种自定义的类型,可以用来定义变量.
3. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
4. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同y样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
4、this引用
4、1什么是this引用
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。
public class PetDog {
public String name;
public int age;
public String color;
public void SetPetDog(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}
public void say(){
System.out.println(this.name+"说我"+this.age+"岁了是"+this.color);
}
}
public class Test {
public static void main(String[] args) {
PetDog dog1 = new PetDog();
dog1.SetPetDog("大黄",3,"黑黄色");
dog1.say();
}
}
4、2 this引用的特性
1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"中使用。不能在静态方法中使用。
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
总结this用法
1、通过this访问当前对象的成员变量。
2、通过this访问当前对象的成员方法
3、通过this访问当前对象的其他构造方法(必须放在该方法的第一行!)
5、对象的构造及初始化
先看上述this引用来赋值初始化示范代码
public void SetPetDog(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}
需要调用之前写的SetPetDog方法才可以将具体的日期设置到对象中。通过上述例子发现问题并引发思考:
1. 每次对象创建好后调用SetDate方法设置具体日期,比较麻烦。
2、局部变量必须要初始化才能使用,那么成员变量声明后,没有赋值直接使用会报错吗
这就得引出构造方法了
5、1构造方法
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且
在整个对象的生命周期内只调用一次。
注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
构造方法必须满足的条件;
1、方法名与类名相同
2、方法名的前面无返回值
3、构造方法中不能使用return语句返回一个值,但是可以单独写return语句作为方法的结束。
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; System.out.println("Date(int,int,int)构造方法被调用了"); } public void printDate() { System.out.println(year + "-" + month + "-" + day); }}public class Test { public static void main(String[] args) { Date date = new Date(2024,6,2); date.printDate(); }}
注意:在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次 。
构造方法的重载;
构造方法重载的条件
1、方法名相同
2、参数不同(个数不同/依次类型不同)
// 无参构造方法public Date(){ }// 带有三个参数的构造方法public Date(int year, int month, int day) { this.year = year; this.month = month; this.day = day;}
注意:
如果用户没有定义构造方法,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
一旦用户定义构造方法,编译器则不再生成构造方法。
可以在无参构造方法中通过this调用带有三个参数的构造方法但是this(参数);必须是构造方法中第一条语句,并且不能形成环。
5、2默认初始化
首先,必须对局部变量和全局变量的区别有清晰认知。
局部变量:定义在方法中的变量。
全局变量:定义在类中方法外的变量,成员变量就是全局变量。
在上文中提出的第二个问题:为什么在使用时局部变量必须要初始化,而成员变量可以不用呢?
Date date = new Date(2024,6,2);
要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:
在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:
1. 检测对象对应的类是否加载了,如果没有加载则加载
2. 为对象分配内存空间
3. 处理并发安全问题
比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
4. 初始化所分配的空间 被申请好以后,对象中包含的成员就已经设置好了初始值.
5、3就地初始值
在声明成员变量时,就直接给出初始值。
public class Date { public int year = 1900; public int month = 1; public int day = 1; public Date() { } public Date(int year, int month, int day) { }}
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中
本篇类和对象就学习到这里啦,是不是收获满满呢,如果觉得文章写的不错,留下小红心再走吧。后面学习面向对象编程语言的三大特征,关注我,不要错过哦!~
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。