百知教育学习 - 胡鑫喆 - 07_面向对象的基础
01_面向过程
02_生活中的对象
-
面向过程:
从计算机执行角度出发,以代码 执行过程 为 核心 -
面向对象:
从 人的角度出发,从现实世界角度出发 -
对象:
- 特征: 称为 属性,一般为名词,代表对象有什么。
- 行为: 称为 方法,一般为动词,代表对象能做什么。
-
对象之间的关系:
汽车 车 继承 is a
汽车 发动机 关联 has a
汽车 司机 依赖 use a
03_生活中的面向对象
04_对象和类
-
Java中的对象:
- 是一块儿 数据
- 代表了生活中的一个对象
- 生活中对象的 抽象
-
生活中的类:
- 概念:
在一组相同或类似的对象中,抽取 出 共性的特征和行为,保留所关注的部分。
- 概念:
-
Java中的类:
- 是一段 代码。
- 定义了一类对象应该具有哪些 属性,方法。
- 对象的 模板
05_成员变量
-
成员变量(实例变量)
- 成员变量与实例变量相比是一个更加宽泛的概念,成员变量不是局部变量。
-
成员变量与局部变量的语法差异
- 成员变量:(与数组相同)
- 默认值:数值型变量 0; 布尔类型 false; 对象类型 null;
- 作用范围:全类内部
- 命名:可以和局部变量重名,局部变量优先。
- 局部变量:
- 默认值:无
- 作用范围:声明开始-代码块结束
- 命名:重合范围不允许两个局部变量重名
- 成员变量:(与数组相同)
06_成员方法
-
方法的声明:
- 语法: 修饰符 返回值类型 方法名 (形参列表) 抛出的异常
- 内涵: 代表了对象能做什么
- 注意: 尽管方法声明时形参列表可能会使用类中的属性,但是 方法与属性 的 声明 和它们的 顺序无关。
-
方法的实现:
- 语法: { 代码块 }
- 内涵: 代表了对象怎么做
07_方法重载的语法
- 语法: 定义多个方法,方法名相同,参数表不同
- 参数表不同的几个方面:
- 参数个数不同
- 参数类型不同
- 参数类型排列不同
- 方法的选择:
- 编译器(而不是虚拟机)在编译时会根据 实参的类型,选择相应的方法去调用。
- 如果没有找到匹配的方法,编译器就会 向上就近匹配(先byte,short,后int…),但是不允许出现 引用不明确 的情况。
- 例如:
//向上就近匹配 byte a = 10; m(a); public void m(short a){} // 会匹配此函数 public void m(int a){} //引用不明确,此时编译器不知道该提升哪一个变量,如果只有下面两个函数中的一个则不会报错 m(1,2); public void m(int a, double b){} public void m(double b, int a){}
08_重载的作用
- 允许类中的同一类方法同名,屏蔽参数的差异 (这样可以只关注方法本身,而不用在意实现的细节):因为参数不同,同一行为的行为方式会不同。
- 例如:
public class Person{ public void eat(食物 a){ //食物放入口中 //咀嚼 //咽下 } public void eat(药物 b){ //药物放入口中 //喝水 //咽下 } public void eat(口香糖 c){ //口香糖放入口中 //咀嚼 //吐出 } }
09_构造方法
-
构造方法
1. 不能定义返回值类型
2. 方法名必须和类名相同,包括大小写
3. 不能手工调用,只能再对象创建过程中自动调用一次 -
对象的创建过程
- 分配空间,属性被赋予默认值
- 初始化属性,性被赋予初始值
- 调用构造方法 ,属性可以被赋予构造参数
-
注意:
如果一个类中,没有定义任何构造方法,系统会提供默认的无参的公开构造方法。
10_对象的创建和访问
11_面向过程和面向对象
-
代码
package day8; public class TestOO{ public static void main(String[] args){ study ("Liucy", "CoreJava"); Student s = new Student("Liucy"); s.study("CoreJava"); } public static void study(String name, String course){ System.out.println("Student "+name+" study "+course); } } class Student{ String name; public Student(String n){ name = n; } public void study(String course){ System.out.println("Student "+name+" study "+course); } }
-
运行结果
12_引用
-
概念:
对象类型的变量(出去8种基本类型的变量,都属于 引用)
-
值:
对象的 地址
-
调用方法时传递的参数:
- 基本类型的变量传 值
- 对象类型的变量传 地址(实参和形参指向同一对象)
-
代码
package day9; public class TestReference{ public static void main(String[] args){ int a = 10; int b = a; b++; System.out.println(a); //10 Student s1 = new Student(); Student s2 = s1; s2.age++; System.out.println(s1.age); //19 changeInt(a); System.out.println(a); //10 Student s = new Student(); changeAge(s); System.out.println(s.age); //19 } public static void changeInt(int a){ a++; } public static void changeAge(Student s){ s.age++; } } class Student{ String name = "Liucy"; int age = 18; }
-
结果
13_this
-
this
- 本质: 引用
- 用法: “this.”, 在类中使用,指向当前对象,访问类中的属性和方法,如果不加引用,默认 为 this引用。
- 作用: 用于 区分成员变量 和 局部变量。
-
this()
- 用法: 用在构造方法中,表示 调用本类其他的构造方法,必须是构造方法中的 第一条语句。
-
代码
package day9; public class TestThis{ public static void main(String[] args){ MyClass mc = new MyClass("yuan"); System.out.println(mc.a); mc.m1(); } } class MyClass{ int a = 10; int b = 20; public MyClass(){ //10000 } public MyClass(int i){ this(); System.out.println("OK"); } public MyClass(String s){ this(10); } public void m1(){ int a = 30; System.out.println(a); //30 System.out.println(this.a); } public void m2(){ System.out.println(a); //System.out.println(this.a); System.out.println(b); //System.out.println(this.b); m1(); //this.m1(); } }
-
结果