我是张骚年,量子玄学信徒,祖安冲浪王者,B站白嫖大师,撕少保护协会资深会员,一个没有感情的表情包机器。

应届二本物理找不到工作,准备用五个月转行Java”上流社会“

脱发日记

WX20200511-202654@2x.png
学习面向对象的第一天,在网上看到一个段子:程序员是不缺对象的,没有什么对象是一个new解决不了的,如果有,就多new几个。
我挠了挠头,程序员路子都这么野的吗?

今日学习目标

了解什么面向对象

今日学习难点

理解面向对象

学习笔记 重点总结

什么是面向对象

计算机中的对象 : 复杂的客观事物在java程序中的表现形式。
在计算机眼中,一切都是对象。
举个例子:

描述一个对象:以水杯为例

  • 名称、材料、颜色、大小 ———外在特征
  • 除了有特征,还具有保温功能能干什么 ———-所具有的功能
  • 在描述的时候 除了描述特征、还需要描述功能

描述一个人 应该怎么描述

  • 身高、体重、年龄、衣服颜色
    • 对应的是数据,代表对象有什么特征、外在特点
    • 程序中以变量体现,称为对象的属性
  • 吃饭、睡觉、喝水、唱歌
    • 对应的是行为和功能,代表对象能做什么
    • 程序中以函数体现,函数以后统称为方法,称为对象的方法

通过面向对象可以在Java中模拟客观是的事物:

  • 通过属性模拟 事物的数据
  • 通过方法模拟 事物的行为和功能

总结

  1. 计算机的需求来源于客观世界
  2. 现实世界的对象:客观存在的事物
  3. 计算机中的对象:JVM的一个连续的存储空间,代表现实世界中一个对应的对象

    面向对象语法细节—类

    类:保存了一类对象的信息,定义了对象的属性和方法【对象的模板】
    类的组成:
  • 属性(实例变量)类的内部 方法的外部
    • 实例变量都有默认值
    • 作用范围:至少在整个类的内部
    • 实例变量作用范围内实例变量不能有命名冲突,可以和局部变量冲突,局部变量优先
  • 实例方法 代表对象能够做什么

    • 方法的声明 能够做神门
    • 方法的实现 方法体 怎么做
    • 声明组成:修饰符,返回值类型,方法名(形参列表) 可抛出的异常
    • 实例方法的执行必须依赖一个对象,执行过程中从执行方法的对象中获取实例变量 ``` public class Day07 {

      public static void main(String[] args) { // 创建对象通过new Dog dog = new Dog();

// 给狗的属性赋值 dog.name = “hhh”; dog.age = 18;

// 调用狗的方法 dog.eat(); } }

class Dog{ // 定义属性 狗的名字 String name; // 狗的年龄 int age;

// 定义方法 public void eat(){ System.out.println(“狗可以吃”); } }

  1. > 面向对象的开发方式:
  2. > 1. 定义类
  3. > 1. 创建对象
  4. > 1. 使用对象的实例变量和实例方法完成需求
  5. <a name="SXabU"></a>
  6. #### 方法重载
  7. 在一个类中,同一种功能可能会有多种表现形式。<br />例如:人的吃功能,对于不同的东西有不同的吃方式,吃药、吃饭、吃口香糖<br />因此在一个类中,写吃方法的时候,也会存在实现方式的差异。也就是方法名字相同 但是实现不同<br />这样的做法称之为方法的重载
  8. **方法的重载:在一个类中定义多个方法名相同,参数列表不同的方法**<br />参数列表不同的情况有:
  9. 1. 形参类型不同
  10. 1. 形参数量不同
  11. 1. 形参顺序不同
  12. > 注意:形参名不同,不算形参列表不同,不构成重载
  13. **使用的时候根据外界传入的实参来匹配对应的方法**<br />编译器根据调用者传递的实际参数,确定调用哪一个方法<br />编译器根据参数匹配方法时,先进行精确匹配,如果匹配不成功,则就近向上匹配,但是注意避免混淆的现象
  14. ```java
  15. public class Day07 {
  16. public static void main(String[] args) {
  17. // 创建对象通过new
  18. Dog dog = new Dog();
  19. // 给狗的属性赋值
  20. dog.name = "hhh";
  21. dog.age = 18;
  22. // 调用狗的方法
  23. dog.eat();
  24. // 调用重载的方法
  25. dog.eat("骨头");
  26. }
  27. }
  28. class Dog{
  29. // 定义属性 狗的名字
  30. String name;
  31. // 狗的年龄
  32. int age;
  33. // 定义方法
  34. public void eat(){
  35. System.out.println("狗可以吃");
  36. }
  37. // 重载的方法
  38. public void eat(String food){
  39. System.out.println("狗可以吃"+food);
  40. }
  41. }

构造方法

构造方法:类的内部除了有属性、方法 还有一个构造方法,构造方法 还是方法,只是比较特殊
构造方法的特点:

  1. 类以内 其他方法以外
  2. 构造方法的方法名必须和类名完全一致
  3. 构造方法没有返回值类型(连void都没有)
  4. 构造方法是在创建对象时,只能和new连用,不能手动调用,JVM会自动调用一次
  5. 构造方法允许重载
  6. 创建对象时候 构造方法通常可以为属性赋值
  7. 如果一个类中没有定义任何的构造方法,则JVM会自动添加一个默认公开、无参构造方法;但是如果类中定义了其他有参构造方法,则JVM不再提供默认公开无参数的构造方法 ```java public class Day07 {

    public static void main(String[] args) { // 创建对象通过new 使用构造方法创建对象

    1. Dog dog = new Dog();

// 使用有参构造方法创建对象 Dog kkk = new Dog(“kkk”, 23); // 给狗的属性赋值 dog.name = “hhh”; dog.age = 18;

// 调用狗的方法 dog.eat(); // 调用重载的方法 dog.eat(“骨头”); } }

class Dog{ // 定义属性 狗的名字 String name; // 狗的年龄 int age;

// 定义方法 public void eat(){ System.out.println(“狗可以吃”); } // 重载的方法 public void eat(String food){ System.out.println(“狗可以吃”+food); } // 无参构造方法 public Dog() { } // 两个参数的构造方法 public Dog(String name, int age) { this.name = name; this.age = age; } }

  1. <a name="VoQPt"></a>
  2. #### 对象的创建过程
  3. 一个对象的创建 不是一蹴而就的。有步骤的,第一步干啥,第二步干啥 第三步干啥
  4. **对象创建的触发点:使用new关键字创建对象**
  5. 1. 分配空间
  6. 1. 为属性赋默认值
  7. 1. 属性都有默认数据,自己无法选择
  8. 2. 初始化属性
  9. 1. 为属性第二次赋值
  10. 1. 不为属性赋初始值,第二步就没有了写了才有
  11. 3. 调用构造方法
  12. 1. 为属性第三次赋值
  13. 1. 同样还可以通过对象名.属性名 来为属性赋值
  14. <a name="72709cdf"></a>
  15. ### 今日学习名词
  16. | 名词 | 含义 |
  17. | --- | --- |
  18. | overload | 重载 |
  19. | class | 类 |
  20. <a name="1b3a3066"></a>
  21. ### 今日学习总结
  22. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1366162/1589202093618-f947f8fc-73fe-4334-bc77-ba751d8eedce.png#align=left&display=inline&height=939&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1878&originWidth=2352&size=540163&status=done&style=none&width=1176)
  23. <a name="QWhu5"></a>
  24. ### 每日习题
  25. <a name="KOK5l"></a>
  26. #### 编程:设计一个 Worker 类 和 Address 类,类的要求如下:
  27. 1. 定义一个 Worker 类,类中定义三个属性:姓名、年龄、工资(salary),要求如下:
  28. 1. 提供公开无参构造方法和三个参数的构造方法
  29. 1. 定义无参的 work 方法和带整数参数 work(int hours)方法,参数代表工人工作的小时数
  30. 2. 定义一个 Address 类,类中定义属性:地址(addr)、邮编(zipCode),为此类提供无参数和有 参数的构造方法。
  31. 2. 为 Worker 类添加一个 Address 类型的属性 address
  32. 2. 定义一个测试类,创建一个 Worker 对象,其姓名为张三、年龄为 26、工资为 10000.0;家庭地址为:北京市海淀区清华园 1 号院、邮编为 100010
  33. ```java
  34. public class Test17 {
  35. public static void main(String args[]) {
  36. Worker w = new Worker("zhangsan", 26, 10000.0);
  37. Address addres = new Address("北京市海淀区清华园1号院", "100010"); w.address = addres;
  38. }
  39. }
  40. //工人类
  41. class Worker {
  42. String name;//姓名
  43. int age;//年龄
  44. double salary;//工资
  45. Address address;//地址(属性的类型是Address类型)
  46. public Worker() {
  47. }
  48. public Worker(String name, int age, double salary) { this.name = name;
  49. this.age = age;
  50. this.salary = salary;
  51. }
  52. public void work() { System.out.println("work");
  53. }
  54. public void work(int hours) {
  55. System.out.println("worker works for " + hours + " hours");
  56. }
  57. }
  58. //地址类
  59. class Address {
  60. String address;
  61. String zipCode;
  62. public Address() {
  63. }
  64. public Address(String address, String zipCode) {
  65. this.address = address;
  66. this.zipCode = zipCode;
  67. }
  68. }