> 文章列表 > day11_面向对象

day11_面向对象

day11_面向对象

今日内容

零、 复习昨日
一、作业
二、局部变量&成员变量
三、this关键字
四、构造方法
五、重载

零、 复习昨日

晨考


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("学生睡觉" );}
}
不同点 成员变量 局部变量
位置不一样
使用前初始值不一样
初始化时机
生命周期
内存位置

day11_面向对象

为什么成员变量使用前,没见到赋值动作,还能使用呢?

  • 答案: 任何变量使用前都要有初始值
    • 在new 对象时,堆内存空间会给属性初始化
    • 此时属性已经被赋值
    • 等到对象调用方法执行时,成员变量已经被赋值了

总结:(掌握的程度)

  • 分清楚哪是成员变量哪是局部变量
  • 搞清楚变量初始值使用上的不同
  • 其余: 内存位置,初始值时机,生命周期等熟悉即可

三、this关键字

this

  • 单词是 这个
  • 代表当前对象
  • 代表的是调用这个方法的当前对象
  • 即谁调用这个方法,this就是谁

day11_面向对象

day11_面向对象

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 来调用

day11_面向对象

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 );/*** 有参构造创建出的对象属性都是指定值* 作用是什么? 为了方便创建对象*/
}

总结: 无论是有参构造还是无参构造,都是用来创建对象. 用哪个创建对象都可以,只不过无参创建出的对象属性都是默认值,有参构造创建出的对象属性都是指定值

day11_面向对象

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;}
}

day11_面向对象

附录

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 空指针异常,空指针就是空引用就是空