day11_面向对象
今日内容
零、 复习昨日
晨考
public class Phone {// 成员属性/成员变量// 数据类型 变量名;double price;String brand;// 成员方法public void call(String num) {System.out.println("给xxx打电话");} }
public static void main(String[] args) {// 创建对象// 类名 对象名 = new 类名();Phone p = new Phone();p.price = 100.0; }
对象创建时,内存过程
- 一旦执行new Phone();
- 会在堆中开辟空间
- 属性初始化,方法初始化
- 对象分配地址,地址赋值给对象引用
一、作业
略
二、成员变量&局部变量
以学生类为例演示: 属性 年龄和姓名 方法 学习和睡觉
package com.qf.oop;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class Student {/*** 成员变量* 1 类中方法外* 2 声明完,可以在方法内直接使用* 3 在创建对象时成员变量被初始化* 4 生命周期: 创建对象时出现,当对象失去引用后被GC机制回收* 5 成员变量在堆*/String name;int age;/*** 局部变量* 1 方法签名中,和方法体内* 2 声明完局部变量,必须手动赋初始值* 3 局部变量是方法进栈时完成初始化* 4 局部变量生命周期: 随着方法进栈而出现,方法执行完弹栈而消失* 5 局部变量在栈*/public void study(int hours) {System.out.println(name );// 使用成员变量// 定义局部变量int a = 1;System.out.println(a ); // 使用局部变量System.out.println("学生学习,学了"+hours+"小时" );}public void sleep() {System.out.println("学生睡觉" );}
}
不同点 | 成员变量 | 局部变量 |
---|---|---|
位置不一样 | ||
使用前初始值不一样 | ||
初始化时机 | ||
生命周期 | ||
内存位置 |
为什么成员变量使用前,没见到赋值动作,还能使用呢?
- 答案: 任何变量使用前都要有初始值
- 在new 对象时,堆内存空间会给属性初始化
- 此时属性已经被赋值
- 等到对象调用方法执行时,成员变量已经被赋值了
总结:(掌握的程度)
- 分清楚哪是成员变量哪是局部变量
- 搞清楚变量初始值使用上的不同
- 其余: 内存位置,初始值时机,生命周期等熟悉即可
三、this关键字
this
- 单词是 这个
- 代表当前对象
- 代表的是调用这个方法的当前对象
- 即谁调用这个方法,this就是谁
package com.qf.oop;/*** --- 天道酬勤 ---** @author QiuShiju* @desc this关键词*/
public class Phone {String color;double price;public void call(String num) {/*** 当成员变量和局部变量重名时:* 1 就近原则,自己方法内有就用自己的* 2 即如果不重名,那就只能使用成员变量* ----------------------------------* this 是这个的意思,即这个当前对象*/String color = "黑色";// 局部变量System.out.println("this --> "+this );System.out.println("这个手机什么颜色? " + color );/*** 当前成员变量和局部变量重名时,但是还要使用成员变量* 此时就必须使用this来说明,调用的就是对象的成员变量*/System.out.println("这个手机什么颜色? " + this.color );// this就是当前对象,可以调用属性和方法this.play();System.out.println("给"+num+"打电话" );}public void play(){}
}
总结:
- this就是当前对象
- this可以调用对象的属性和方法
- 什么时候用到this呢? 只有当局部变量和成名变量重名时使用!!!
- 即使用this来区别一下
四、构造方法[重要]
4.1 构造方法/构造函数/构造器/constructor
是什么? 是个方法,但是有点特殊…(后续解密)
干什么的? 构造方法: 用来创建对象的方法,即构造是构造出一个对象
怎么干的? 类名 对象名 = new 类名(); --> 类名 对象名 = new 构造方法();
在哪? 每个类中都有,默认是隐藏的,也可以显式写出
构造方法语法:
public 类名([参数]){}
构造方法的特点
- 构造方法是方法,但是没有返回值类型,也没有void
- 方法名也很特殊,当前类的类名,首字母大写的
- 构造方法参数列表可以添加参数的
- 只能通过new 来调用
4.2 对象创建过程
构造方法用来创建对象.那么调用构造方法创建对象的过程是怎么样?
Car car = new Car();
- 调用Car(),即调用Car类的无参构造方法
内存中开辟空间,属性初始化
再执行构造方法内的代码
- 地址值赋值给引用
4.3 有参构造
为什么要有有参构造?
因为无参构造创建出的对象属性都是默认值(null,0,0.0)这些,使用时还需再单独赋值,比较麻烦. 所以才有了有参构造,可以创建出对象,属性就有指定值;
package com.qf.oop;/*** --- 天道酬勤 ---** @author QiuShiju* @desc 构造方法*/
public class Car {String brand;double price;// 无参构造public Car(){System.out.println("Car()执行了" );}// 有参数的构造方法public Car(String brand,double price) {this.brand = brand;// 局部变量给成员变量赋值this.price = price;}public void run(){System.out.println("跑到" );}
}
public static void main(String[] args){// 类名 对象名 = new 构造方法();Car car = new Car();System.out.println(car.brand);System.out.println(car.price);/*** 无参构造创建出的对象中属性值: 默认值* 使用时还需再赋值?* 有没有创建出对象就有指定的属性值? --> 有参构造*/Car car2 = new Car("东风",280000);System.out.println(car2.brand );System.out.println(car2.price );Car car3 = new Car("解放",180000);System.out.println(car3.brand );System.out.println(car3.price );/*** 有参构造创建出的对象属性都是指定值* 作用是什么? 为了方便创建对象*/
}
总结: 无论是有参构造还是无参构造,都是用来创建对象. 用哪个创建对象都可以,只不过无参创建出的对象属性都是默认值,有参构造创建出的对象属性都是指定值
4.4 语法总结
- 构造方法写在类中
- 没有返回值类型,也没有void
- 方法名一定是类名
- 可以有参数,可以无参数
- 构造方法只能通过new来调用
- 每个类都默认隐藏一个无参构造
- 但是类中显式写出任何一种构造方法,隐式不再提供
- 因此我们建议,有参无参构造要同时给出
学完构造方法,你要会什么?
1 理解什么是构造方法,用来干什么,怎么写的,写在哪里
2 对比有参无参构造的区别
3 [重要] 熟练的使用有参无参构造创建对象
4 [熟知] 有参无参创建出的对象有什么不一样
五、重载
重载(Overload)
- 重载是指一个类中多个方法之间的关系叫重载
- 具体点: 这些方法 方法名一样,
参数列表不一样
的关系叫做重载- 参数列表不一样
- 参数的个数,类型,顺序任何不一样都是不一样
package com.qf.oop;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class Dog {public String name;public int age;// 这些构造方法是重载关系public Dog() {}public Dog(String name) {this.name = name;}public Dog(int age) {this.age = age;}public Dog(String name,int age) {this.name = name;this.age = age;}public Dog(int age,String name) {this.name = name;this.age = age;}
}
new Dog();new Dog(2,"");new Dog(2);/*** 这些方法都是重载,主要目的就是方便调用.* 根据传入的参数类型,来确定执行哪个方法*/System.out.println( );System.out.println(1);System.out.println(1.1);System.out.println("zzzz");
六、复习
由类创建对象: Car car = new Car(); Dog dog = new Dog(); Tiger tiger = new Tiger();
创建出的对象,对象内部有什么
- 属性
- 方法
使用对象,使用对象的什么东西?
- 使用属性
- 取值 数据类型 变量名 = 对象.属性;
- 赋值 对象.属性 = 值;
- 使用方法
- 对象.方法();
七、作业
工人类
package com.qf.oop;/*** --- 天道酬勤 ---** @author QiuShiju* @desc 引用数据类型: 数组,类,接口*/
public class Worker {String name;// 姓名int age;// 年龄double salary;// 薪水Address addr;// 无参构造public Worker(){}// 有参构造public Worker(String name,int age,double salary) {this.salary = salary;this.age = age;this.name = name;}// 工作的方法public void work() {System.out.println("工作" );}public void work(int hours) {System.out.println("工作"+hours+"小时" );}public static void main(String[] args) {Worker w1 = new Worker( );w1.salary = 1000;w1.name = "张三";w1.age = 19;System.out.println(w1.salary );System.out.println(w1.name );System.out.println(w1.age );w1.work();w1.work(10);Worker w2 = new Worker("李四", 20, 2000);System.out.println(w2.salary );System.out.println(w2.name );System.out.println(w2.age );w2.work();w2.work(8);// --------------------Worker w3 = new Worker();w3.name = "王五";w3.age = 25;w3.salary = 2500.1;// 因为addr的数据类型是Address类型w3.addr = new Address();// System.out.println(w3.addr );w3.addr.zipCode = "100086";w3.addr.address = "郑州航海路60号";System.out.println(w3.name );System.out.println(w3.age );System.out.println(w3.salary );System.out.println(w3.addr.address );System.out.println(w3.addr.zipCode );}
}
地址类
public class Address {String address;// 地址String zipCode;// 邮编public Address(){}public Address(String address,String zipCode){this.address = address;this.zipCode = zipCode;}
}
附录
student 学生
sleep 睡觉
eat 吃
study 学习
method signature 方法签名
方法签名主要是方法的定义,即不包含方法体的那一部分
public void study(int hours)
might 可能
salary 薪水
NullPointerException 空指针异常,空指针就是空引用就是空
public class Address {String address;// 地址String zipCode;// 邮编public Address(){}public Address(String address,String zipCode){this.address = address;this.zipCode = zipCode;}
}
[外链图片转存中…(img-vJnyYmni-1681206567135)]
附录
student 学生
sleep 睡觉
eat 吃
study 学习
method signature 方法签名
方法签名主要是方法的定义,即不包含方法体的那一部分
public void study(int hours)
might 可能
salary 薪水
NullPointerException 空指针异常,空指针就是空引用就是空