目录
为什么使用封装
编写一个学生类,要求:
- 具有属性:学号,姓名,年龄
- 具有行为:个人描述
- 要求:学生最大年龄为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的权限修饰只可以用public和default(缺省)。
- 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,增强程序的阅读性
友情链接
来源:CSDN
作者:陌上人如玉君子世无双
链接:https://blog.csdn.net/qq_41445580/article/details/104054347