我是张骚年,量子玄学信徒,祖安冲浪王者,B站白嫖大师,撕少保护协会资深会员,一个没有感情的表情包机器。
应届二本物理找不到工作,准备用五个月转行Java”上流社会“
脱发日记

学习面向对象的第一天,在网上看到一个段子:程序员是不缺对象的,没有什么对象是一个new解决不了的,如果有,就多new几个。
我挠了挠头,程序员路子都这么野的吗?
今日学习目标
今日学习难点
理解面向对象
学习笔记 重点总结
什么是面向对象
计算机中的对象 : 复杂的客观事物在java程序中的表现形式。
在计算机眼中,一切都是对象。
举个例子:
描述一个对象:以水杯为例
- 名称、材料、颜色、大小 ———外在特征
- 除了有特征,还具有保温功能能干什么 ———-所具有的功能
- 在描述的时候 除了描述特征、还需要描述功能
描述一个人 应该怎么描述
- 身高、体重、年龄、衣服颜色
- 对应的是数据,代表对象有什么特征、外在特点
- 程序中以变量体现,称为对象的属性
- 吃饭、睡觉、喝水、唱歌
- 对应的是行为和功能,代表对象能做什么
- 程序中以函数体现,函数以后统称为方法,称为对象的方法
通过面向对象可以在Java中模拟客观是的事物:
- 通过属性模拟 事物的数据
- 通过方法模拟 事物的行为和功能
总结
- 计算机的需求来源于客观世界
- 现实世界的对象:客观存在的事物
- 计算机中的对象: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. 定义类> 1. 创建对象> 1. 使用对象的实例变量和实例方法完成需求<a name="SXabU"></a>#### 方法重载在一个类中,同一种功能可能会有多种表现形式。<br />例如:人的吃功能,对于不同的东西有不同的吃方式,吃药、吃饭、吃口香糖<br />因此在一个类中,写吃方法的时候,也会存在实现方式的差异。也就是方法名字相同 但是实现不同<br />这样的做法称之为方法的重载**方法的重载:在一个类中定义多个方法名相同,参数列表不同的方法**<br />参数列表不同的情况有:1. 形参类型不同1. 形参数量不同1. 形参顺序不同> 注意:形参名不同,不算形参列表不同,不构成重载**使用的时候根据外界传入的实参来匹配对应的方法**<br />编译器根据调用者传递的实际参数,确定调用哪一个方法<br />编译器根据参数匹配方法时,先进行精确匹配,如果匹配不成功,则就近向上匹配,但是注意避免混淆的现象```javapublic class Day07 {public static void main(String[] args) {// 创建对象通过newDog 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);}}
构造方法
构造方法:类的内部除了有属性、方法 还有一个构造方法,构造方法 还是方法,只是比较特殊
构造方法的特点:
- 类以内 其他方法以外
- 构造方法的方法名必须和类名完全一致
- 构造方法没有返回值类型(连void都没有)
- 构造方法是在创建对象时,只能和new连用,不能手动调用,JVM会自动调用一次
- 构造方法允许重载
- 创建对象时候 构造方法通常可以为属性赋值
如果一个类中没有定义任何的构造方法,则JVM会自动添加一个默认公开、无参构造方法;但是如果类中定义了其他有参构造方法,则JVM不再提供默认公开无参数的构造方法 ```java 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; } }
<a name="VoQPt"></a>#### 对象的创建过程一个对象的创建 不是一蹴而就的。有步骤的,第一步干啥,第二步干啥 第三步干啥**对象创建的触发点:使用new关键字创建对象**1. 分配空间1. 为属性赋默认值1. 属性都有默认数据,自己无法选择2. 初始化属性1. 为属性第二次赋值1. 不为属性赋初始值,第二步就没有了写了才有3. 调用构造方法1. 为属性第三次赋值1. 同样还可以通过对象名.属性名 来为属性赋值<a name="72709cdf"></a>### 今日学习名词| 名词 | 含义 || --- | --- || overload | 重载 || class | 类 |<a name="1b3a3066"></a>### 今日学习总结<a name="QWhu5"></a>### 每日习题<a name="KOK5l"></a>#### 编程:设计一个 Worker 类 和 Address 类,类的要求如下:1. 定义一个 Worker 类,类中定义三个属性:姓名、年龄、工资(salary),要求如下:1. 提供公开无参构造方法和三个参数的构造方法1. 定义无参的 work 方法和带整数参数 work(int hours)方法,参数代表工人工作的小时数2. 定义一个 Address 类,类中定义属性:地址(addr)、邮编(zipCode),为此类提供无参数和有 参数的构造方法。2. 为 Worker 类添加一个 Address 类型的属性 address2. 定义一个测试类,创建一个 Worker 对象,其姓名为张三、年龄为 26、工资为 10000.0;家庭地址为:北京市海淀区清华园 1 号院、邮编为 100010```javapublic class Test17 {public static void main(String args[]) {Worker w = new Worker("zhangsan", 26, 10000.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;}}
