我是张骚年,量子玄学信徒,祖安冲浪王者,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(“狗可以吃”);
}
}
面向对象的开发方式:
定义类 创建对象 使用对象的实例变量和实例方法完成需求
方法重载
在一个类中,同一种功能可能会有多种表现形式。
例如:人的吃功能,对于不同的东西有不同的吃方式,吃药、吃饭、吃口香糖
因此在一个类中,写吃方法的时候,也会存在实现方式的差异。也就是方法名字相同 但是实现不同
这样的做法称之为方法的重载
方法的重载:在一个类中定义多个方法名相同,参数列表不同的方法
参数列表不同的情况有:
形参类型不同 形参数量不同 形参顺序不同
注意:形参名不同,不算形参列表不同,不构成重载
使用的时候根据外界传入的实参来匹配对应的方法
编译器根据调用者传递的实际参数,确定调用哪一个方法
编译器根据参数匹配方法时,先进行精确匹配,如果匹配不成功,则就近向上匹配,但是注意避免混淆的现象
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不再提供默认公开无参数的构造方法
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关键字创建对象
分配空间 为属性赋默认值 属性都有默认数据,自己无法选择 初始化属性 为属性第二次赋值 不为属性赋初始值,第二步就没有了写了才有 调用构造方法 为属性第三次赋值 同样还可以通过对象名.属性名 来为属性赋值
今日学习名词
名词 | 含义 |
---|---|
overload | 重载 |
class | 类 |
今日学习总结
每日习题
编程:设计一个 Worker 类 和 Address 类,类的要求如下:
定义一个 Worker 类,类中定义三个属性:姓名、年龄、工资(salary),要求如下: 提供公开无参构造方法和三个参数的构造方法 定义无参的 work 方法和带整数参数 work(int hours)方法,参数代表工人工作的小时数 定义一个 Address 类,类中定义属性:地址(addr)、邮编(zipCode),为此类提供无参数和有 参数的构造方法。 为 Worker 类添加一个 Address 类型的属性 address 定义一个测试类,创建一个 Worker 对象,其姓名为张三、年龄为 26、工资为 10000.0;家庭地址为:北京市海淀区清华园 1 号院、邮编为 100010
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;
}
}