什么是面向对象
-
面向对象:面向对象思想就是不断的创建对象,使用对象,指挥对象做事情,强调的是对象,对象中有具体的方法,帮我们完成相应的功能,面向对象是基于面向过程的
-
面向过程:其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。强调的是过程,通过第一步,第二部,一步一步自己完成对应的需求。代表语言:C语言,当需求单一,或者简单时,我们一步一步去操作也没问题,并且效率也挺高,但是随着需求的不断更改,功能的不断增多,一步一步就显着有点麻烦了。而面想对象就可以通过对功能和步骤的封装,使得结构清晰,使用更方便
-
简单比较:
用面向过程修电脑:
1.学习如何修电脑
2.检查哪里坏了
3.买需要更换的配件
4.修电脑
5.修好使用
用面向对象修电脑:
1.找个修电脑的师傅
2.调用修电脑的技术(功能),传递进去钱的参数
3.电脑修好
4.使用
- 比较可得两者优劣:
面向过程:
优点:性能比面向对象好,因为类调用时需要实例化,开销比较大,比较消耗资源。
缺点:不易维护、不易复用、不易扩展.
面向对象:
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护 .
缺点:性能比面向过程差
类与对象
-
在面向对象程序设计中,数据和对数据的操作被封装在一个集合体中,即被定义为类。类是用来定义一组对象的共有状态和行为的模板。
-
类是一种复杂的数据类型,它是将数据和对数据的操作封装在一起的集合体,涉及数据类的扩展。类不仅包含数据,还包含对数据进行操作的方法,正是这些方法反映了数据的行为。
-
类中的数据成为成员变量,对数据进行的操作称为成员方法。程序中可以生成一个对象,并用标识符表示,通过对象引用类中的成员变量和成员方法。
-
对象是类的实例,是某个类的变量。当一个程序运行时,系统为对象分配内存单元,而不是为类分配内存单元。类和对象是密切相关的,类脱离不了对象,对象必须依赖类。
举例:
类的定义
/*
* 需求:定义一个学生类。
*
* 学生事物:
* 属性:姓名,年龄...
* 行为:学习,吃饭...
*
* 学生类:
* 成员变量:姓名,年龄...
* 成员方法:学习,吃饭...
*/
public class Student {
//成员变量
//姓名
String name;
//年龄
int age;
//成员方法
//学习的方法
public void study() {
System.out.println("好好学习,天天向上");
}
//吃饭的方法
public void eat() {
System.out.println("学习饿了要吃饭");
}
}
类的使用
/*
* 类的使用:
* 使用一个类,其实就是使用该类的成员。(成员变量和成员方法)
* 而我们要想使用一个类的成员,就必须先拥有该类的对象。
* 那么我们如何拥有一个类的对象呢?
* 创建对象就可以了
* 我们如何创建对象呢?
* 格式:
* 类名 对象名 = new 类名();
* 对象如何访问成员呢?
* 成员变量:
* 对象名.成员变量
* 成员方法:
* 对象名.成员方法(...)
*/
public class StudentTest {
public static void main(String[] args) {
//类名 对象名 = new 类名();
Student s = new Student();
//System.out.println("s:"+s);//地址值
//使用成员变量
System.out.println("姓名:"+s.name);//null
System.out.println("年龄:"+s.age);//0
System.out.println("----------");
//给成员变量赋值
s.name = "刘诗诗";
s.age = 18;
//再次使用成员变量
System.out.println("姓名:"+s.name);//刘诗诗
System.out.println("年龄:"+s.age);//18
System.out.println("----------");
//调用成员方法
s.study();
s.eat();
}
}
成员变量与成员方法
成员变量:和我们学习过的变量的定义是一样的,有两个小区别:
-
位置不同:类中,方法外
-
初始化值:成员变量不需要给初始化值也可以使用,因为它有默认值
成员方法:和我们学习过的方法的定义是一样的,有一个小区别。
-
去掉了修饰符中的static关键字
成员变量和局部变量的区别
A:在类中的位置不同
-
成员变量:在类中,方法外
-
局部变量:在方法中或者方法声明上(形式参数)
B:在内存中的位置不同
-
成员变量:在堆内存
-
局部变量:在栈内存
C:生命周期不同
-
成员变量:随着对象的创建而存在,随着对象的消失而消失
-
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
-
成员变量:有默认值
-
局部变量:没有默认值,必须先定义,赋值,最后使用
private、this关键字和封装
private关键字
1.private关键字:
a:是一个权限修饰符。
b:可以修饰成员(成员变量和成员方法)
c:被private修饰的成员只在本类中才能访问
2. private最常见的应用:
- 把成员变量用private修饰
- 提供对应的getXxx()/setXxx()方法
封装
-
概述
是面向对象三大特征之一
是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改 -
封装的好处
将不需要对外提供的内容都隐藏起来。
把属性隐藏,提供公共方法对其访问。
成员变量private,提供对应的getXxx()/setXxx()方法 -
封装的好处
通过方法来控制成员变量的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性
this关键字
- 概述
代表所在类的对象引用,方法被哪个对象调用,this就代表那个对象 - 使用
局部变量和成员变量重名 - 代码
/*
* 如果局部变量名称和成员变量名称一致,在方法中使用的时候采用的是就近原则。
*
* 我们有没有办法把局部变量的name赋值给成员变量的name呢?
* 有
*
* 有什么办法呢?
* 用this关键字就可以解决这个问题
*
* this:代表所在类的对象引用
* 方法被哪个对象调用,this就代表谁。
*
* 使用场景:
* 就是用于解决成员变量被隐藏的问题。
*/
public class Student {
private String name;
private int age;
public void setName(String name) { //"刘诗诗"
//name = name;
this.name = name;
}
public String getName() {
return name;
//return this.name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
构造方法
- 作用概述
给对象的数据进行初始化 - 格式
方法名与类名相同
没有返回值类型,连void都没有
没有具体的返回值 - 代码
/*
* 构造方法:
* 给对象的数据进行初始化
*
* 格式:
* 方法名和类名相同
* 没有返回值类型,连void都不能写
* 没有具体的返回值
*
*/
public class Student {
public Student() {
System.out.println("这是构造方法");
}
}
public class StudentDemo {
public static void main(String[] args) {
//如何调用构造方法呢?
//通过new关键字调用
//格式:类名 对象名 = new 构造方法(...);
Student s = new Student();
}
}
4.注意事项
- 如果你不提供构造方法,系统会给出默认构造方法
- 但是如果你提供了构造方法,系统将不再提供
- 构造方法也是可以重载的,重载条件和普通方法相同