✨✨个人主页:沫洺的主页
📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏
📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏
📖Docker专栏📖Reids专栏📖MQ专栏📖SpringCloud专栏
💖💖如果文章对你有所帮助请留下三连✨✨
🌳什么是面向对象
- 首先面向对象是一种编程思想,把事物看作一个整体,从事物的特征(属性)和行为(方法)两个方面进行描述。
- 面向对象的过程就是找对象、建立对象、使用对象、维护对象的关系的过程。
- 万物皆可对象,对象就是一类事物的具体体现,对象是类的一个实例,必然具备该类事物的属性和行为。
🍁为什么要面向对象
- 面向对象能让复杂的问题简单化,程序员不需要了解具体的实现过程,只需要指挥对象去实现功能(也就是通过对象调用方法的过程)。
- 面向对象的编程思想更有利于人们开拓思维,在具体的开发过程中便于程序的划分,方便程序员分工合作,提高开发效率。
🍂面向对象的优点
- 可重用性:代码重复使用,减少代码量,提高开发效率。面向对象的三大核心特性(封装、继承和多态)都围绕这个核心。
- 可扩展性:指新的功能可以很容易地加入到系统中来,便于软件的修改。
- 可管理性:能够将功能与数据结合,方便管理。
🌿对象和类的关系
前面说了面向对象就是让复杂的问题简单化,我们可以直接指挥对象去实现功能,而对象又是一类事物的具体体现,也就是这类事物的一个实例,所以对象必然具备该类事物的特征(属性)和行为(方法)。
🌾那么什么是属性和方法呢
首先举个例子,这里有一类手机,这类手机有以下特征(属性):品牌、型号、价格;这类手机都有打电话、发短信的功能(行为、方法),但是我们在使用手机时不是通过这类手机去实现打电话或发短信的功能的,因为这是抽象的没有实体,而是通过具体的一个手机对象,才能去实现功能。总结来说这类手机是抽象的,我们没办法去直接使用,所以我们只能去通过具体的手机对象去实现功能。
类:手机类
属性:品牌、型号、价格、颜色
方法:通电话、发短信、手机支付
属性:属性就是该事物的状态信息
方法:行为就是该事物能够做什么
根据上面的例子可以看出来,类是用来描述现实事物的,由属性和方法组成,这里的属性和方法是指编程中类的成员变量(成员属性)和成员方法。
- 类是对一类事物的描述(包括了这类事物的属性和方法),是抽象的,我们没办法直接通过类去实现类中的方法。
- 对象是一类事物的实例,是具体存在的,具备该类事物的属性和行为,我们可以通过对象去直接实现类中的方法。
- 类是对象的模板,对象是类的实体。
🍃成员变量和成员方法
🌺成员变量
- 定义在方法的外部,类的内部。使用范围是整个类
- 不需要初始值
- 存储在堆内存中(对象存在时才在存在)
🌲成员方法
格式: 访问修饰符 返回值类型 方法名称(参数列表){ 方法体 }
成员变量可以直接在成员方法中使用,但是main方法中如果调用成员变量和方法必须通过对象.属性名\方法名(参数列表)的形式来调用
成员方法之间的调用,直接写方法名(参数列表)即可
package cn.moming; public class Student { public String name; public String name1="桃子"; public int age; public boolean sex; public void study(String name){ System.out.println(time("张三")); System.out.println("这位叫"+name+"的同学在学习"); System.out.println(name1+"在旁辅导他"); } public String time(String name){ String t = "早上8:10开始"; return t; } public static void main(String[] args){ Student student = new Student(); student.study("张三"); System.out.println(student.name1+"非常认真"); } }
早上8:10开始 这位叫张三的同学在学习 桃子在旁辅导他 桃子非常认真
💐构造方法
构造方法是类的一种特殊方法,用来初始化类的一个新的对象,在创建对象(new 运算符)之后自动调用。Java中的每个类都有一个默认的构造方法,并且可以有一个以上的构造方法。通过构造方法可以完成对象的创建,以及实例变量的初始化。换句话说:构造方法是用来创建对象,并且同时给对象的属性赋值。
Java 构造方法有以下特点:
- 方法名必须与类名相同
- 可以有 0 个、1 个或多个参数
- 没有任何返回值,不能使用 void
- 默认返回类型就是对象类型本身
- 只能与 new 运算符结合使用
- 构造方法不能被 static、final、synchronized、abstract 和 native(类似于 abstract)修饰。
- 在一个类中,与类名相同的方法就是构造方法。每个类可以具有多个构造方法,但要求它们各自包含不同的方法参数(方法重载)。
- 如果在类中没有定义任何一个构造方法,则 Java 会自动为该类生成一个默认的无参构造方法,并且方法体为空。
- 如果类中显式地定义了一个或多个构造方法,则 Java 不再提供默认构造方法,必须手动定义一个无参构造。
- 对于实例变量来说,只要你在构造方法中没有手动给它赋值,统一都会默认赋值。默认赋系统默认值。
自动生成构造方法(IDEA工具)
在实例变量下鼠标右键点击Generate...(或ALT+INS)
选择构造函数(constructor)
先生成无参构造
再生成有参构造
package cn.moming2; public class Student { private String name; private int age; public Student() { //无参构造 } public Student(String name, int age) { //有参构造 this.name = name; this.age = age; } }
测试类
package cn.moming2; public class Test { public static void main(String[] args) { Student student1 = new Student(); //调用无参构造 System.out.println(student1); Student student2 = new Student("张三",18); //调用有参构造 System.out.println(student2); } }
cn.moming2.Student@3b07d329 cn.moming2.Student@41629346
如果想要获取传进去的实参,我们就要对实例变量进行封装。
🌷封装
🌹封装的含义
- 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。
🌹封装的作用
- 隐藏实现细节,仅对外暴露公共的访问方式,目的在于保护信息,保证数据的安全性。
- 将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。
🌹属性封装
- 属性私有化(使用private关键字进行修饰)。
- 对外提供简单的操作入口(对外提供公开的读取get()和修改set(),不可以用static修饰)。
package cn.moming2; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package cn.moming2; public class Test { public static void main(String[] args) { Student student1 = new Student(); String name1 = student1.getName(); int age1 = student1.getAge(); System.out.println(name1+"==="+age1); //系统默认初始值 student1.setName("沫洺"); student1.setAge(18); String newName1 = student1.getName(); int newAge1 = student1.getAge(); System.out.println(newName1+"==="+newAge1); //set传的值 Student student2 = new Student("张三",18); String name2 = student2.getName(); int age2 = student2.getAge(); System.out.println(name2+"==="+age2); //传进去的实参 } }
null===0 沫洺===18 张三===18
自动生成get/set方法
补充
方法封装:将方法体抽成一个方法,被private修饰,在另一个方法中调用方法
package cn.moming2;
public class Demo {
public static void main(String[] args) {
//计算1~100的和
int sum = 0;
for (int i = 0; i < 101; i++) {
sum+=i;
}
System.out.println(sum);
}
}
选择方法体,然后CTRL+ALT+M
修改方法名
这样在使用这个方法时,我们就可以直接那方法名去调用就行了
🌻总结
- 需要被保护的属性使用 private 进行修饰,给这个私有的属性对外提供公开的 set 和 get 方法,其中set方法用来修改属性的值,get方法用来读取属性的值。
- 并且set和get 方法在命名上也是有规范的,规范中要求 set 方法名是 set +属性名(属性名首字母大写),get 方法名是get +属性名(展性名首字母大写)。
- 其中set 方法有一个参数,用来给属性赋值,set 方法没有返回值,一般在 set 方法内部編写安全控制程序,因为毕竟 set 方法是修改内部数据的,而get 方法不需要参数,返回值类型是该属性所属类型
- 另外set 方法和 get 方法都不带 static 关键宇,不带 static 关键字的方法称为实例方法,这些方法调用的时候需要先创建对象,然后通过 “引用”去调用这些方法,实例方法不能直接采用 “类名〞的方式调用。
什么情况下封装:编写实例类时,用到封装有很多好处,其中比较实际的是:
- 拒绝直接调用声明字段,保护内部数据,更安全;
- 在编程中可达到缓存的效果,执行效率高;
- 重复调用,避免代码冗余,程序编写效率高。