本文主要是介绍day09_面向对象_构造方法_封装,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今日内容
零、 复习昨日
一、构造方法
二、重载
三、封装
零、 复习昨日
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;// 设置属性 addrprivate 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情况缓存重启
这篇关于day09_面向对象_构造方法_封装的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!