面向对象
1 概述
要完成一个需求时,每一个具体的步骤我们都是参与者,并且我们要面对的是每一个步骤和过程,这种思想称之为面向过程思想。
面向过程开发其实就是面向着具体的每一个步骤和过程,然后把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。
面向过程思想的代表语言是C语言。
面向对象思想:
- 面向对象思想是基于面向过程的
- 面向过程强调的是每一个功能的步骤
- 面向对象强调的是对象,由对象去调用对应的功能
- 面向过程中我们的角色是执行者,面向对象中我们的角色是一个指挥者
特点:
- 是一种更符合我们思考习惯的思想
- 可以将复杂的事情简单化
- 我们从执行者变成了指挥者
2 类与对象及其使用
- 类与对象的关系
- 我们学习编程语言,就是为了模拟现实世界的事物。比如网上购物,超市的计费系统。
- 如何表示一个现实世界的事物呢?
- 属性 就是该事物的描述信息
- 行为 就是该事物能够干什么
- java语言中最基本的单位是类,所有的事物我们都通过类来体现。
- 类:是一组相关的属性和行为的集合。
- 对象:就是该类事物的一个具体的体现。
3 类的定义
- java中用class描述事物
- 成员变量 就是事物的属性
- 成员方法 就是事物的行为
- 定义类其实就是定义类中的成员(成员变量和成员方法)
- 成员变量:和定义局部变量是一样的,只不过位置发生了改变。位置在类中,方法外
- 成员方法:和以前定义方法一样,只是把前面的static去掉。
public class Student {
// 属性 成员变量
// 年龄
int age;
// 姓名
String name;
// 学号
int id;
// 行为 成员方法
public void study(){
System.out.println("好好学习,天天向上");
}
public void eat(){
System.out.println("学习饿了就吃饭");
}
}
4 对象的创建和使用
- 创建对象
- 格式: 类名 对象名 = new 类名();
- 使用对象访问类中的成员
- 对象名.成员变量
- 对象名.成员方法()
public static void main(String[] args) {
// 创建对象 类名 对象名 = new 类名();
Student student = new Student();
// 打印的结果就是内存地址
System.out.println(student);
// 给成员变量赋值
student.id = 100;
student.age = 18;
student.name = "张君宝";
System.out.println(student.name);
// 使用成员方法
student.eat();
student.study();
}
5 对象的内存图
- 创建一个对象的内存图
public class Phone {
// 成员变量
// 品牌
String brand;
// 价格
int price;
// 颜色
String color;
// 成员方法
public void call(String name){
System.out.println("给" + name + "打电话");
}
public void sendWeChatMsg(){
System.out.println("大哥大嫂过年好~");
}
}
public class TestDemo1 {
public static void main(String[] args) {
// 创建对象
Phone phone = new Phone();
System.out.println(phone);
// 给成员变量赋值
phone.brand = "小米";
phone.price = 1999;
phone.color = "白色";
System.out.println("品牌是:" + phone.brand +"价格:"+ phone.price +"颜色:"+ phone.color);
phone.call("张三");
phone.sendWeChatMsg();
}
}
6 对象地址的进制
十进制: 0 - 9 满十进一
二进制: 0 - 1 满二进一 用0b开头 0b000111 0b11100
八进制: 0 - 7 满八进一 用0开头
十六进制(HEX): 0-9 a-f 满十六进一 用0x开头
7 局部变量和成员变量的区别
- 在类中的位置不同
- 成员变量:在类中,方法外
- 局部变量:方法中或者方法的声明上(形参)
- 作用域不同
- 成员变量:在这个类中都能调用
- 局部变量:在定义的括号中能调用,除了括号就不行
- 在内存中的位置不同
- 成员变量:堆内存
- 局部变量: 栈内存
- 初始化值不同
- 成员变量:有默认值
- 局部变量:没有默认值。必须先定义并且赋值后才可以使用
- 生命周期不同
- 成员变量:随着对象的创建而存在,随着对象的消失而消失
- 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
8 构造方法
-
作用
- 给对象的数据进行初始化
-
格式:
- 方法名和类名相同
- 没有返回值类型,连void都没有
- 没有具体的返回值
修饰符 构造方法名(参数列表){ }
注意点:一个类中,如果没有提供任何构造方法,系统会自动给一个默认的没有参数的构造方法
如果一个类中提供了构造方法,系统将不再提供默认的没有参数的构造方法。
构造方法可以重载
9 封装
封装是面向对象的三大特性之一。
面向对象三大特性:封装、继承、多态
- private关键字
- 是一个权限修饰符
- 可以修饰成员变量和成员方法和构造方法
- 被private修饰的成员只能在本类中使用,外部无法访问
- private最常见的应用
- 把成员变量用private修饰
- 提供对应的setXxx()/getXxx()方法
class Person{
// 姓名
private String name;
// 年龄
// private修饰的内容只能在本类中使用
private int age;
// 给姓名赋值
public void setName(String n){
name = n;
}
// 获取姓名
public String getName(){
return name;
}
// 成员方法 set方法
// 设置年龄值
public void setAge(int a){
if (a <0 || a > 120){
age = 18;
return;
}
age = a;
}
// 获取年龄的方法
public int getAge(){
return age;
}
public Person(){}
public Person(String n){
name = n;
}
public Person(String n,int a){
name = n;
age = a;
}
public void work(){
System.out.println("人要工作");
}
}
- 封装的概述
- 是面向对象的三大特征之一
- 现实客观世界中成员变量都是隐藏在对象内部的,外部是无法直接操作和修改的。
- 封装的原则
- 将不需要对外提供的内容都隐藏起来
- 把成员变量隐藏,提供公共方法让其他类访问
- 封装的好处
- 通过方法来控制成员变量的操作,提高了代码的安全性
- 把代码用方法进行封装,提高代码的复用性
10 this关键字
-
this关键字概述
- this:代表所在类的对象的引用
- 方法被哪个对象调用,this就是代表哪个对象
-
this关键字的使用
- 解决局部变量和成员变量重名的问题
- this.age 是调用本对象中的成员变量
public void setAge(int age){ this.age = age; }
- this.成员方法名()
- 在本类中调用成员方法,一般这里的this.可以省略
public void teach(){ System.out.println("小小教书匠"); this.work(); } public void work(){ System.out.println("老师要工作"); }
- this(参数);
- 这种用法是调用本类中的构造方法
public Teacher(String teacherName){ this.teacherName = teacherName; } public Teacher(String teacherName,int age){ this(teacherName);// this.teacherName = teacherName; this.age = age; }