我是张骚年,量子玄学信徒,祖安冲浪王者,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 />编译器根据参数匹配方法时,先进行精确匹配,如果匹配不成功,则就近向上匹配,但是注意避免混淆的现象
```java
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);
}
}
构造方法
构造方法:类的内部除了有属性、方法 还有一个构造方法,构造方法 还是方法,只是比较特殊
构造方法的特点:
- 类以内 其他方法以外
- 构造方法的方法名必须和类名完全一致
- 构造方法没有返回值类型(连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>
### 今日学习总结
![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)
<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 类型的属性 address
2. 定义一个测试类,创建一个 Worker 对象,其姓名为张三、年龄为 26、工资为 10000.0;家庭地址为:北京市海淀区清华园 1 号院、邮编为 100010
```java
public 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;
}
}