java基础——day05-2 类与对象、封装、构造方法
封装
概述
封装可以理解为一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类数据,必须通过指定的方式。适当的封装可以让代码更易理解与维护,并增强代码的安全性。
原则
将属性隐藏起来,若要访问某个属性,提供公共方法对其访问。
封装步骤
1.使用private(私有的)关键字修饰成员变量。
2.访问private(私有的)成员变量,提供对应的getXXX方法,setXXX方法。
package day05; //定义一个学生类 public class Student_1 { //将学生类的属性私有化 private private String name; private int age; private int s_id; //定义学生的成员方法 学习 吃饭 public void study(){ System.out.println("我爱学习 学习使我快乐"); } public void eatFood(){ System.out.println("今天吃肯德基"); } //提供getXXX方法 setXXX方法,可以访问成员变量 即成员属性 //提供可以 修改的 学生名 年龄 学号 public void setName(String name){ name = name; } public void setAge(int age) { age = age; } public void setS_id(int s_id) { s_id = s_id; } //提供可 访问的 学生名 年龄 学号 public String getName(){ return name; } public int getAge() { return age; } public int getS_id(){ return s_id; } }
package day05; //定义一个学生类 public class Student_1 { //将学生类的属性私有化 private private String name; private int age; private int s_id; //定义学生的成员方法 学习 吃饭 public void study(){ System.out.println("我爱学习 学习使我快乐"); } public void eatFood(){ System.out.println("今天吃肯德基"); } //提供getXXX方法 setXXX方法,可以访问成员变量 即成员属性 //提供可以 修改的 学生名 年龄 学号 public void setName(String name){ this.name = name; } public void setAge(int age) { this.age = age; } public void setS_id(int s_id) { this.s_id = s_id; } //提供可 访问的 学生名 年龄 学号 public String getName(){ return this.name; } public int getAge() { return this.age; } public int getS_id(){ return this.s_id; } }
//注意:通过输出,我们会发现返回的结果为null,0,0,但是我们也用了set方法;这是由于形参变量与成员变量重名,导致成员变量被隐藏,方法中的变量名无法访问到成员变量,从而赋值失败。所以我们需要通过this关键字,来解决重名问题。
封装优化——this关键字
this的含义
this代表所在类的当前对象的引用(地址值),即对象自己的引用。
方法被哪个对象调用,方法中的this就代表哪个对象。即谁调用,this就代表谁。
this的格式
this.成员变量名;
对上述代码优化后:
package day05; //定义一个学生类 public class Student_1 { //将学生类的属性私有化 private private String name; private int age; private int s_id; //定义学生的成员方法 学习 吃饭 public void study(){ System.out.println("我爱学习 学习使我快乐"); } public void eatFood(){ System.out.println("今天吃肯德基"); } //提供getXXX方法 setXXX方法,可以访问成员变量 即成员属性 //提供可以 修改的 学生名 年龄 学号 public void setName(String name){ this.name = name; } public void setAge(int age) { this.age = age; } public void setS_id(int s_id) { this.s_id = s_id; } //提供可 访问的 学生名 年龄 学号 public String getName(){ return this.name; } public int getAge() { return this.age; } public int getS_id(){ return this.s_id; } }
package day05; public class day05_5 { public static void main(String[] args) { //实例化 学生类1 Student_1 student = new Student_1(); //通过set方法 为student成员变量(属性)赋值 student.setName("刘昊然"); student.setAge(18); student.setS_id(20210304); //通过get方法 打印输出刘昊然同学的信息(属性) System.out.println("我叫"+student.getName()+",今年"+student.getAge()+"岁"+",我的学号是"+student.getS_id()); //调用student拥有的方法 student.study(); student.eatFood(); } }
//现在通过set方法和get方法 打印输出的结果正常了。
封装优化——构造方法
当一个对象被创建时(被实例化),构造方法用来初始化该对象,给对象的成员变量赋初始值。
无论自己是否自定义构造方法,所有类都有构造方法,因为java提供了一个无参数的构造方法。一旦自己定义了构造方法,java自动提供的无参数构造方法就会失效。(你没定,java有;你定了,那就用你的)
构造方法定义格式
修饰符 构造方法名(参数列表){
方法体;
}
package day05; //定义一个学生类 public class Student_1 { //将学生类的属性私有化 private private String name; private int age; private int s_id; //添加构造方法 //无参数构造方法 必须 public Student_1(){} //有参数构造方法 此处为全参 建议 public Student_1(String name,int age,int s_id){ this.name =name; this.age = age; this.s_id = s_id; } //定义学生的成员方法 学习 吃饭 public void study(){ System.out.println("我爱学习 学习使我快乐"); } public void eatFood(){ System.out.println("今天吃肯德基"); } //提供getXXX方法 setXXX方法,可以访问成员变量 即成员属性 //提供可以 修改的 学生名 年龄 学号 public void setName(String name){ this.name = name; } public void setAge(int age) { this.age = age; } public void setS_id(int s_id) { this.s_id = s_id; } //提供可 访问的 学生名 年龄 学号 public String getName(){ return this.name; } public int getAge() { return this.age; } public int getS_id(){ return this.s_id; } }
package day05; public class day05_6 { public static void main(String[] args) { //通过无参数的构造方法创建对象 Student_1 s = new Student_1(); System.out.println("姓名:"+s.getName()+" 年龄:"+s.getAge()+" 学号:"+s.getS_id()); //输出发现其带有的是默认参数值参数值 null 0 0 //通过set方法 为s赋值 s.setName("周杰伦"); s.setAge(40); s.setS_id(19901212); //再次输出 System.out.println("姓名:"+s.getName()+" 年龄:"+s.getAge()+" 学号:"+s.getS_id()); //发现其有对应的参数值了 System.out.println("============================================="); //通过全参的构造方法 实例化一个学生 Student_1 s1 = new Student_1("迪丽热巴",18,2021030421); System.out.println("姓名:"+s1.getName()+" 年龄:"+s1.getAge()+" 学号:"+s1.getS_id()); //通过输出 发现不用set方法 就能直接输出对应的名字 年龄 学号 } }
注意事项:
1.若不自定义构造方法,系统会自动给出无参构造方法
2.若自己定义了构造方法,系统不再提供无参构造方法
3.构造方法是可以重载的,即可有参,也可无参
标准代码——JavaBean
JavaBean(对象)是Java语言编写类的一种标准规范。
符合JavaBean的类,要求类必须:
1.具体的(如学生类、猫类.....)
2.公共的(public)
3.含无参数的构造方法
4.提供操作成员变量的set和get方法
public class ClassName { //成员变量 //构造方法 //无参构造方法 必须 //有参构造方法 建议 //成员方法 //getXXX //setXXX }
编写符合JavaBean的类,学生类,代码如下
package day05; public class Student_2 { //1、定义成员变量 姓名 年龄 性别 学号 private String name; private int age; private String sex; private int sid; //----------------------------------------------------------------------- //2、定义构造方法 //无参 public Student_2(){} //含一个参数的 public Student_2(String name){ this.name = name; } //含两个参数的 public Student_2(String name,int age){ this.name = name; this.age = age; } //含三个参数的 public Student_2 (String name,int age,String sex){ this.name = name; this.age = age; this.sex = sex; } //含全参的 public Student_2(String name,int age ,String sex,int sid){ this.name = name; this.age = age; this.sex = sex; this.sid =sid; } //----------------------------------------------------------------------- //3.成员方法 成员方法 放在构造方法上面感觉更直观..... public void study(){ System.out.println("好好学习 天天向上"); } public void eatFood(){ System.out.println("今天吃麦当劳"); } //----------------------------------------------------------------------- //4.添加get 和set方法 public String getName(){ return name; } public int getAge(){ return age; } public String getSex(){ return sex; } public int getSid(){ return sid; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setSex(String sex) { this.sex = sex; } public void setSid(int sid) { this.sid = sid; } }
注意:
由于构造方法 以及get set方法 太长 建议使用 idea快捷键 Alt+insert 快速生成

浙公网安备 33010602011771号