转行学Java的第7天:了解面向对象

493 阅读9分钟

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

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

脱发日记

学习面向对象的第一天,在网上看到一个段子:程序员是不缺对象的,没有什么对象是一个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. 创建对象
  3. 使用对象的实例变量和实例方法完成需求

方法重载

在一个类中,同一种功能可能会有多种表现形式。
例如:人的吃功能,对于不同的东西有不同的吃方式,吃药、吃饭、吃口香糖
因此在一个类中,写吃方法的时候,也会存在实现方式的差异。也就是方法名字相同 但是实现不同
这样的做法称之为方法的重载

方法的重载:在一个类中定义多个方法名相同,参数列表不同的方法
参数列表不同的情况有:

  1. 形参类型不同
  2. 形参数量不同
  3. 形参顺序不同

注意:形参名不同,不算形参列表不同,不构成重载

使用的时候根据外界传入的实参来匹配对应的方法
编译器根据调用者传递的实际参数,确定调用哪一个方法
编译器根据参数匹配方法时,先进行精确匹配,如果匹配不成功,则就近向上匹配,但是注意避免混淆的现象

public class Day07 {

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

//        给狗的属性赋值
        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);
    }
}

构造方法

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

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

    public static void main(String[] args) {
//        创建对象通过new  使用构造方法创建对象
        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;
    }
}

对象的创建过程

一个对象的创建 不是一蹴而就的。有步骤的,第一步干啥,第二步干啥 第三步干啥

对象创建的触发点:使用new关键字创建对象

  1. 分配空间
  2. 为属性赋默认值
  3. 属性都有默认数据,自己无法选择
  4. 初始化属性
  5. 为属性第二次赋值
  6. 不为属性赋初始值,第二步就没有了写了才有
  7. 调用构造方法
  8. 为属性第三次赋值
  9. 同样还可以通过对象名.属性名 来为属性赋值

今日学习名词

名词 含义
overload 重载
class

今日学习总结

image.png
image.png

每日习题

编程:设计一个 Worker 类 和 Address 类,类的要求如下:

  1. 定义一个 Worker 类,类中定义三个属性:姓名、年龄、工资(salary),要求如下:
  2. 提供公开无参构造方法和三个参数的构造方法
  3. 定义无参的 work 方法和带整数参数 work(int hours)方法,参数代表工人工作的小时数
  4. 定义一个 Address 类,类中定义属性:地址(addr)、邮编(zipCode),为此类提供无参数和有 参数的构造方法。
  5. 为 Worker 类添加一个 Address 类型的属性 address
  6. 定义一个测试类,创建一个 Worker 对象,其姓名为张三、年龄为 26、工资为 10000.0;家庭地址为:北京市海淀区清华园 1 号院、邮编为 100010
public class Test17 {
    public static void main(String args[]) {
        Worker w = new Worker("zhangsan"2610000.0);
        Address addres = new Address("北京市海淀区清华园1号院""100010"); w.address = addres;
    } 
}
//工人类
class Worker {
    String name;//姓名
    int age;//年龄
    double salary;//工资
    Address address;//地址(属性的类型是Address类型)
    
    public Worker() {
        
    }
    public Worker(String name, int age, double salary) this.name = name;
        this.age = age;
        this.salary = salary;
    }
    public void work() { System.out.println("work");
    }
    public void work(int hours) {
        System.out.println("worker works for " + hours + " hours");
    } 
}
//地址类
class Address {
    String address;
    String zipCode;
    public Address() {
    }
    public Address(String address, String zipCode) 
        this.address = address;
        this.zipCode = zipCode;
    } 
}