Java基础学习总结07——封装

南笙酒味 提交于 2020-01-20 19:04:32

目录

为什么使用封装

封装的概念

什么是封装

封装的实现步骤

封装的具体实现

private关键字

四种访问权限修饰符

构造方法

为什么需要构造方法

构造方法的概念

this关键字

为什么使用this关键字

this关键字概念

调用属性及方法

友情链接

为什么使用封装

编写一个学生类,要求

  • 具有属性:学号,姓名,年龄
  • 具有行为:个人描述
  • 要求:学生最大年龄为25岁,最小年龄为3岁;
public class Student {
public int stuNo;//学号
public String stuName;//姓名
public int stuAge;//年龄

//个人介绍
public void desc(){
System.out.println("大家好,我叫:"+stuName+",今年:"+stuAge+"岁,"
+ "我的学号是:"+stuNo);
}

编写测试类,要求:

  • 实例化学生对象,并对属性赋值
  • 调用个人介绍方法,在控制台输出
public static void main(String[] args) {
//创建对象
Student stu=new Student();
//调用属性
stu.stuNo=10001;
stu.stuAge=-100;//年龄不能是负数
stu.stuName="张三";
//调用方法
stu.desc();
}

问题:stu.stuAge= -100;要满足学生年龄要求,年龄不应该是负数;应该将stuAge属性保护起来防止乱用

保护的方式:封装

封装的概念

什么是封装

Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()setXxx()实现对该属性的操作,以实现下述目的:

  • 隐藏一个类中不需要对外提供的实现细节;
  • 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
  • 便于修改,增强代码的可维护性
  • 安全性更好

​​​​​​​封装的实现步骤

需要注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作。当然最好使用get/set方法,比较标准。

封装的具体实现

public class Student {
//将属性定义为private,只能被Student类内部访问
private int stuNo;//学号
private String stuName;//姓名
private int stuAge;//年龄
//在这里定义get和set方法
public int getStuAge(){
return stuAge;
}
public void setStuAge(int age){
if(age>=3 && age<=25){
stuAge=age;
}else{
System.out.println("输入有误,学生年龄最小为3岁,最大为25岁");
}
}
 其他get和set方法省略
//个人介绍
public void desc(){
System.out.println("大家好,我叫:"+stuName+",今年:"+stuAge+"岁,"
+ "我的学号是:"+stuNo);
}
}

测试:通过set方法为各个属性赋值

public static void main(String[] args) {
//创建对象
Student stu=new Student();
//调用属性
stu.setStuNo(10001);
stu.setStuName("张三");
stu.setStuAge(-100);
//调用方法
stu.desc();
}

private关键字

四种访问权限修饰符

Java权限修饰符public、protected、private置于类的成员定义前,用来限定对象对该类成员的访问权限。

修饰符

类内部

同一个包

子类

任何地方

private

Yes

 

 

 

(缺省)

Yes

Yes

 

 

protected

Yes

Yes

Yes

 

public

Yes

Yes

Yes

Yes

对于class的权限修饰只可以用publicdefault(缺省)。

  • public类可以在任意地方被访问。
  • default类只可以被同一个包内部的类访问。

构造方法

为什么需要构造方法

有一个学生类,如下:

public class Student {
//将属性定义为private,只能被Student类内部访问
private int stuNo;//学号
private String stuName;//姓名
private int stuAge;//年龄
private String sex;//性别
private String phone;//电话
private String address;//地址
public int getStuNo() {
return stuNo;
}
public void setStuNo(int no) {
stuNo = no;
}
//其他get和set方法省略

编写测试类,要求

  • 实例化学生对象,并对属性赋值
  • 调用个人介绍方法,在控制台输出
public static void main(String[] args) {
//创建对象
Student stu=new Student();
//调用属性
stu.setStuNo(10001);
stu.setStuName("张三");
stu.setStuAge(12);
stu.setSex("男");
stu.setPhone("1898989981");
stu.setAddress("山东济宁");
//调用方法
stu.introduced();

}

问题:学生类中有太多的属性及对应的set方法,在初始化时容易忘记,有没有可能简化对象的初始化代码?

可以通过构造方法解决

构造方法的概念

根据参数不同,构造方法可以分为如下两类:

  • 隐式无参构造方法(系统默认提供)
  • 显式定义一个或多个构造方法(无参、有参)

注  意:

  • Java语言中,每个类都至少有一个构造方法
  • 默认构造方法的修饰符与所属类的修饰符一致
  • 一旦显式定义了构造方法,则系统不再提供默认构造方法
  • 一个类可以创建多个重载的构造方法
  • 父类的构造方法不可被子类继承

具体实现-无参构造方法​​​​​​​具体实现-无参构造方法

public class Student {
//将属性定义为private,只能被Student类内部访问
private int stuNo;//学号
private String stuName;//姓名
private int stuAge;//年龄
private String sex;//性别
private String phone;//电话
private String address;//地址
//无参构造方法,注意:如果不提供构造方法,Java程序会默认通过一个无参的构造方法
public Student() {

}
//个人介绍
public void introduced(){
System.out.println("大家好,我叫:"+stuName+",今年:"+stuAge+"岁,"
+ "我的学号是:"+stuNo+",我的年龄是:"+sex+",我的电话是:"+
phone+",我住在:"+address);
}
//  get和set方法省略

使用new关键字调用无参构造方法,完成对象的创建

public static void main(String[] args) {
//创建对象,这里调用了无参构造方法
Student stu=new Student();
//调用属性
stu.setStuNo(10001);
stu.setStuName("张三");
stu.setStuAge(12);
stu.setSex("男");
stu.setPhone("1898989981");
stu.setAddress("山东济宁");
//调用方法
stu.introduced();
}

具体实现-有参构造方法

public class Student {
//将属性定义为private,只能被Student类内部访问
private int stuNo;//学号
private String stuName;//姓名
private int stuAge;//年龄
private String sex;//性别
private String phone;//电话
private String address;//地址
//无参构造方法,注意:如果不提供构造方法,Java程序会默认通过一个无参的构造方法
//一旦定义了有参构造方法,则系统不再提供默认构造方法,必须手动提供无参构造方法
public Student() {

}
//有参构造方法
public Student(int no, String name, int age, String sex1, 
String phone1, String address1) {
stuNo = no;
stuName = name;
stuAge = age;
sex = sex1;
phone = phone1;
address = address1;
}

通过调用带参的构造方法,简化对象初始化代码

public static void main(String[] args) {
//创建对象时,一并完成了对象属性的初始化工作
Student stu=new Student(1001, "张三", 19, "男", "13890876666", "山东济宁");
//调用方法
stu.introduced();
}

this关键字

为什么使用this关键字

public int getStuNo() {

return stuNo;

}
public void setStuNo(int stuNo) {
stuNo = stuNo;
}

问题:setStuNo方法的形参和student类属性名出现了重名

this关键字概念

java中,this关键字比较难理解,它的作用和其词义很接近。

  • 它在方法内部使用,即这个方法所属对象的引用;
  • 它在构造方法内部使用,表示该构造方法正在初始化的对象

this表示当前对象,可以调用类的属性、方法和构造方法

什么时候使用this关键字呢?

  • 当在方法内需要用到调用该方法的对象时,就用this

调用属性及方法

public int getStuNo() {
this.introduced();//使用this关键字调用方法
return stuNo;

}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;//使用this关键字调用属性
}

 1.当形参与成员变量重名时,如果在方法内部需要使用成员变量,必须添加this来表明该变量是类成员

  2.在任意方法内,如果使用当前类的成员变量或成员方法可以在其前面添加this,增强程序的阅读性

友情链接

Java基础学习总结01——Java入门与环境搭建

Java基础学习总结02——变量与运算符

Java基础学习总结03——顺序结构及条件结构

Java基础学习总结04——循环结构(while、do-while、for)

Java基础学习总结05——数组​​​​​​​

Java基础学习总结06——方法、类与对象

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!