今日内容
零、 复习昨日
一、构造方法
二、重载
三、封装
零、 复习昨日
1 类和对象是什么关系?
- 类是模板(原材料)
- 对象是具体实例(成品)
- 类创建出对象
2 类中有什么?(类的成员)
- 成员属性(成员变量), 成员方法
3 创建对象的语法?
- 类名 对象名 = new 类名();
4 调用对象属性,方法的语法
- 对象名.属性
- 对象名.方法()
5 成员变量和局部变量的区别
- 位置: 成员变量在方法外,局部变量方法内
- 内存位置: 成员变量堆中对象里面,局部变量在栈中方法内
6 画创建一个对象的内存图
7 类可不可以创建多个对象呢?
- 可以,对象之间没有关系
- 每个对象都有属于自己属性方法
8 this是什么?
- this就是当前类对象
一、构造方法
1.1 无参构造
构造方法又叫构造器,构造函数单词 constructor
构造方法就是用来创建对象的
每个类中都有构造方法,但是默认隐藏的
语法
public 类名(){ }
- 构造方法没有返回值,也不需要定义返回值类型,连void也没有
- 构造方法的方法名只能是当前类类名
- 只能通过new来调用
构造方法作用
- 通过调用构造方法,可以在堆中创建对象
- 属性,方法初始化
// 类定义中可以写出无参构造
public class Student {
String name;
int age;
/**
* 构造方法,默认不显示
* 构造方法作用
* - 通过调用构造方法,可以在堆中创建对象
* - 属性,方法初始化
*/
public Student(){
System.out.println("Student()执行了" );
}
public void study(){
System.out.println(name+"在学习" );
}
}
// 通过无参构造创建对象
package com.qf.oop;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/2/29
* @desc
*/
public class TestOOP1 {
public static void main(String[] args) {
// 创建对象
// 类名 对象名 = new 类名();
// 类名 对象名 = new 构造方法();
Student student = new Student();
// student就是通过构造方法创建出的对象,属性就会初始化
}
}
无参构造创建出的对象,属性默认值是什么?
- 对应数据类型的默认值
思考: 通过无参构造创建出的对象属性都是默认值,使用时还需要单独给属性赋值,然后才可以有具体效果! 能不能有一种方式,创建出对象后 属性直接就有值呢?
- 有!! 通过有参构造创建对象!
1.2 有参构造
有参构造就是给构造方法设计参数,调用构造方法时,传入参数给属性赋值
作用就是: 创建出的对象有指定属性值,而不是默认值
public 类名(数据类型 变量名,...){ this.成员属性 = 变量; }
// 定义有参构造
public class Student {
String name;
int age;
/**
* 构造方法,默认不显示
* 构造方法作用
* - 通过调用构造方法,可以在堆中创建对象
* - 属性,方法初始化
*/
public Student(){
System.out.println("Student()执行了" );
}
// 有参数的构造方法
public Student(String name,int age){
this.name = name; // 因为成员变量和局部变量重名,用this来调用成员变量
this.age = age;
System.out.println("Student(String,int)" );
}
public void study(){
System.out.println(name+"在学习" );
}
}
// 调用有参构造创建对象
public static void main(String[] args) {
// 创建对象
// 类名 对象名 = new 类名();
// 类名 对象名 = new 构造方法();
Student student = new Student();
student.name = "老王";
student.study();
System.out.println("-------------" );
// 使用有参构造创建对象
Student student2 = new Student("老李",38);// 调用时给参数赋值
student2.study();
// student2对象创建出后,属性就有值
}
1.3 总结
语法总结
- 每个类都默认提供无参构造方法
- 但是类中只要写出任何一个构造方法,默认不再提供
使用总结
- 无论无参构造还是有参构造,都是创建对象的
- 无参构造*创建出的对象的属性是默认值(空值)
- 有参构造创建出的对象,属性直接就有值
- 以后建议定义类时候,给出类的有参和无参构造方法
1.4 练习
pdf5
通过构造方法创建对象,
- 先属性初始化
- 再执行构造方法内部代码
二、重载
重载是指类中方法的重载(Overload),语法要求
- 方法名一样,参数列表不一样(类型,个数,顺序任意不一样都行)
- 重载和返回值没有关系
- 作用: 就是方便使用,会根据传入的参数自己确定执行哪个方法
public static void main(String[] args) {
/**
* println()方法就是重载,源码中有多个重名但是参数不同的方法
* 作用: 方便调用
* 会根据传入的参数自己确定执行哪个方法
*/
System.out.println( );
System.out.println(1);
System.out.println(1.1);
System.out.println(true);
System.out.println("字符串");
System.out.println(new Student( ) );
System.out.println("-----------" );
/**
* 这几个构造方法,自己定义了重载的构造
* 方便调用,无论怎么传参数都可以创建对象
*/
Student s1 = new Student( );
Student s2 = new Student(18);
Student s3 = new Student("校长");
Student s4 = new Student("小张", 18);
}
练习pdf5,T1,T2
三、封装
面向对象编程: 封装,继承,多态
3.1 封装介绍
封装,就是打包,代码中将代码封装起来,比如
- 方法的封装
- 类的封装
封装什么作用?
- 隐藏一些实现的细节
- 只管使用就行
3.2 类的封装
完整的类的封装步骤
- 属性私有,设置private修饰符
- 提供setXxx,getXxx方法
强调: set,get方法是固定写法,一定是set,get后是属性名大写
package com.qf.oop;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/2/29
* @desc
*/
public class Phone {
/**
* 封装,需要将属性藏起来
* 即私有化,也就是给属性设置私有的修饰符
*/
private String brand;// 品牌
private double price;// 价格
public void setBrand(String brand) {
this.brand = brand;
}
public String getBrand() {
return brand;
}
// set方法给属性赋值的
public void setPrice(double price){
if (price > 0) {
this.price = price;
} else {
System.out.println("设置价格有误!" );
}
}
// get方法是获得属性值
public double getPrice(){
return price;
}
public void play(){
System.out.println(brand+"手机,价格"+price+"元,在打游戏" );
}
}
练习: 定义狗类,属性 int age, String color, String name,要求属性封装,提供有参无参构造
public class Dog{
// 属性私有
private int age;
private String color;
private String name;
// 构造方法
public Dog(){}
public Dog(int age,String color,String name){
this.age = age;
this.color = color;
this.name = name;
}
// setget方法
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setColor(String color){
this.color = color;
}
public String getColor(){
return color;
}
}
四、实战
类中定义其他类的属性的写法
定义工人类
定义地址类
要求:
为的Worker 类添加一个属性addr,该属性为 Address 类型。 创建一个Worker 对象,其姓名为"zhangsan",年龄为25,工资为2500,家庭住 址为“北京市海淀区清华园1 号”,邮政编码为100084。
// 工人(Worker)类,其中定义的有地址(Address)类属性
package com.qf.pdf.pdf5t13;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/2/29
* @desc
* 数据类型
* -基本
* -引用(数组,类,接口)
*/
public class Worker {
// 属性
private String name;
private int age;
private double salary;
// 设置属性 addr
private Address addr;
public Worker() {
}
public Worker(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
public void setAddr(Address addr){
this.addr = addr;
}
public Address getAddr(){
return addr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
// 普通方法
public void work(){
System.out.println(name+"在工作" );
}
public void work(int hours){
System.out.println(name+"在工作"+hours+"小时" );
}
}
// Address类
package com.qf.pdf.pdf5t13;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/2/29
* @desc
*/
public class Address {
private String address; // 住址
private int zipCode;// 邮编
public Address() {
}
public Address(String address, int zipCode) {
this.address = address;
this.zipCode = zipCode;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getZipCode() {
return zipCode;
}
public void setZipCode(int zipCode) {
this.zipCode = zipCode;
}
}
// 测试
package com.qf.pdf.pdf5t13;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/2/29
* @desc
*/
public class TestWorker {
public static void main(String[] args) {
// 创建Worker类对象
Worker worker = new Worker( );
worker.setName("zhangsan");
worker.setAge(25);
worker.setSalary(2500);
// 创建Address对象
Address address = new Address( );
address.setAddress("郑州二七区航海路60号");
address.setZipCode(4500000);
// 给工人类的addr属性赋值,赋值的是Address类对象
worker.setAddr(address);
// 输出工人的所有信息
System.out.println("工人姓名:" + worker.getName() );
System.out.println("工人年龄:" + worker.getAge() );
System.out.println("工人工资:" + worker.getSalary() );
// 这个输出的是Address的对象地址
System.out.println("工人地址:" + worker.getAddr() );
// worker.getAddr()是获得工人类中的Address对象,
// 再通过Address对象调用getAddress()方法获得住址属性
System.out.println("工人住址:" + worker.getAddr().getAddress() );
System.out.println("住址邮编:" + worker.getAddr().getZipCode() );
}
}
// 内存关系
五、总结
构造方法:
- 创建对象,输出初始化的
- 无参构造创建对象,属性默认值
- 有参构造创建对象,属性指定值
重载:
- 方法名一样,参数不一样
- 方便调用的
封装:
- 属性私有private,提供set get方法
- 固定格式,以后实体类都这么写
重点: 最后那个练习题的写法很重要!!!
idea情况缓存重启