-将类的某些信息隐藏在类的内部,不允许外部程序访问
-通过该类提供的方法来实现对隐藏信息的操作和访问
-隐藏对象的信息
-留出访问的接口
特点:
1、只能通过规定方法访问数据
2、隐藏类的实例细节,方便修改和实现
实现步骤:
private访问修饰符:只能在当前类内访问;
Cat.java
package com.demo.day4.object;
public class Cat {
/*封装的三个步骤:
*1-修改属性的可见性
*2-创建getter/setter方法
*3-在getter/setter方法中加入控制属性的语句*/
//成员属性//静态的;对象的特征
// *1-修改属性的可见性
private String name;//定义猫的名字//限定只能在类内访问
private int age;//定义猫的年龄
private double weight;//定义猫的体重
private String species;//定义猫的品质
//成员方法:动态的;可以对象干什么
//猫能跑、能吃
public void run(String name) {
System.out.println(name+"快跑");
}
//*2-创建getter/setter方法
//*3-在getter/setter方法中加入控制属性的语句*/
//鼠标右键,source-Generate Getters and Setters 自动生成封装
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 getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public String getSpecies() {
return species;
}
public void setSpecies(String species) {
this.species = species;
}
public void eat(String name) {
System.out.println(name+"吃鱼");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
CatTest.java
package com.demo.day4.object;
public class CatTest {
public static void main(String[] args) {
// 实例化对象
Cat one=new Cat();
one.setName("花花");
System.out.println("猫的名字"+one.getName());
System.out.println("猫的年龄"+one.getAge());
System.out.println("猫的体重"+one.getWeight());
System.out.println("猫的品质"+one.getSpecies());
//对应一个类当中的成员属性,是有默认值得
/*
* 猫的名字null (String)默认值
* 猫的年龄0 (int)默认值
* 猫的体重0.0 (double)默认值
* 猫的品质null
*/
one.run(one.getName());
one.eat(one.getName());
}
}
输出结果:
猫的名字花花
猫的年龄0
猫的体重0.0
猫的品质null
花花快跑
花花吃鱼
语法:
package包名;
例:package com.demo.day4.object;
注意:
1、必须放在java源文件的中的第一行
2、一个Java源文件中只能有一个package
3、包名全部英文小写
4、命名方式:域名倒序+模块+功能
语法:
import 包名.类名;
例如:导入包中的全部类:import com.demo.day4.*; 导入包中指定的类 import com.demo.day4.Cat;
比如:那么就可以在BookTest类使用Cat这个类了
静态、静态成员、静态类成员
使用属性static关键字后,变成静态属性/类属性;
当static加到方法前后、方法由成员方法,变成类方法。
注意:
//成员方法,可以直接范围类中的静态成员
//静态方法,不能直接访问非静态成员,只能调用静态成员。
但可以通过实例化一个对象来,通过
对象名.非静态方法();来访问
同理:对象名.属性
//静态方法中,不能使用this
没有静态的类;
1.类对象共享
2.这个类加载时产生,直到这类彻底销毁时释放,生命周期长。
static的作用:
(无论这个类实例化多少个对象,都会共用同一个空间)
(无论实例化出多少只猫,对于价格price而已,他们共用同一块存储空间)
-1对象名.静态成员 访问
-2类名.静态成员 访问
Cat.java中
public static int price;//定义价格
CatTest.java中
Cat one=new Cat();
one.price=2000;//第一种方式使用静态的属性
Cat.price=2000;//第二种,用类来直接使用静态的属性
Cat two=new Cat();
two.price=1000;
System.out.println("A猫的价格"+one.price);
System.out.println("B猫的价格"+one.price);
输出结果:都为1000
A猫的价格1000
B猫的价格1000
static的作用:
(无论这个类实例化多少个对象,都会共用同一个空间)
(无论实例化出多少只猫,对于价格而已,他们共用同一块存储空间)
语法格式:
{
操作
}
代码块:
1-普通代码块:顺序执行,先出现,先执行。(在方法中)
2-构造代码块:创建对象时调用,优先于构造方法执行。(在类中)
3-静态代码块:类加载时调用,优先于构造代码块执行
注意:无论产生多少个实例类,静态代码块只执行一次(仅希望执行一次的代码可以防止静态代码块中)
模拟场景实现
某校开始"计算机科学与应用"专业,专业编号J0001,学制年限4年。
现有3名学生都报名学习了这个专业。
扩展功能:实现统计指定专业下有多少名学生
姓名 | 学号 | 性别 | 年龄 |
张三 | S01 | 男 | 18 |
李四 | S02 | 女 | 17 |
王五 | S03 | 男 | 20 |
运行效果:
专业信息如下:
专业名称:计算机科学学院
专业编号:J0001
专业年限:4
===========================
学生信息如下:
姓名:张三
学号:S01
性别:男
年龄:18
专业名称:计算机科学学院
专业年限:4
===========================
学生信息如下:
姓名:李四
学号:S02
性别:女
年龄:17
专业名称:计算机科学学院
专业年限:4
===========================
学生信息如下:
姓名:王五
学号:S03
性别:男
年龄:20
专业名称:计算机科学学院
专业年限:4
===========================
计算机科学学院已有学生3名
案例分析:
1、专业类:(Subject.java)
属性:专业标号、专业名称、学期年限
方法:介绍(功能:介绍专业相关信息)
2、学生类:(Student.java)
属性:姓名、学号、性别、年龄、专业名称、专业年限
方法:自我介绍(功能:介绍学生相关信息)(StudentInfo)、统计学生个数(addStudent)
·实现专业与学生关联:
在学生类中,添加一个专业对象(Subject studentSubject )作为属性,从中获取专业名称、专业年限。
扩展功能:
实现方法:在学生类中添加属性:学生数组(Student[] studentInfo)、学生总人数studentNum
添加方法:新增学生(功能:将新增学生插入数组,并获取学生总人数)
Student.java
package com.demo.day4.info;
/**
* 这个是一个学生信息的操作类, 进行姓名、学号、性别、年龄、专业、专业年限、专业人数的封装
*
* @author Mr-Donkey
*
*/
public class Student {
private String studentName;
private String studentNo;
private String studentSex;
private int studentAge;
private Subject studentSubject;
private Student[] studentInfo;// 定义一个数组用来存放学生信息
private int studentNum;// 定义一个来存放学生的个数
// 带参的构造函数
// 定义了姓名、学号、性别、年龄、(专业、专业年限)专业的对象
public Student(String studentName, String studentNo, String studentSex, int studentAge, Subject studentSubject) {
this.setStudentName(studentName);
this.setStudentNo(studentNo);
this.setStudentSex(studentSex);
this.setStudentAge(studentAge);
this.setStudentSubject(studentSubject);
}
// 带参的构造函数
// 定义了姓名、学号、性别、年龄、(专业、专业年限)专业的对象
public Student(String studentName, String studentNo, String studentSex, int studentAge, Subject studentSubject,Student[] studentInfo) {
this.setStudentName(studentName);
this.setStudentNo(studentNo);
this.setStudentSex(studentSex);
this.setStudentAge(studentAge);
this.setStudentSubject(studentSubject);
this.setStudentInfo(studentInfo);
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getStudentNo() {
return studentNo;
}
public void setStudentNo(String studentNo) {
this.studentNo = studentNo;
}
public String getStudentSex() {
return studentSex;
}
// 如果性别不是男女、则默认是男
public void setStudentSex(String studentSex) {
if (studentSex.equals("男") || (studentSex.equals("女"))) {
this.studentSex = studentSex;
} else {
this.studentSex = "男";
}
}
public int getStudentAge() {
return studentAge;
}
// 如果学生的年龄不是在10-100之间,则默认18
public void setStudentAge(int studentAge) {
if (studentAge < 10 || studentAge > 100)
this.studentAge = 18;
this.studentAge = studentAge;
}
public Subject getStudentSubject() {
return studentSubject;
}
public void setStudentSubject(Subject studentSubject) {
// 如果没有实例化对象,则进行实例化
if (studentSubject == null) {
this.studentSubject = new Subject();
}
this.studentSubject = studentSubject;
}
public Student[] getStudentInfo() {
// 如果没有实例化存放学生的数组,则初始化
if (this.studentInfo == null) {
this.studentInfo = new Student[200];
}
return studentInfo;
}
public void setStudentInfo(Student[] studentInfo) {
this.studentInfo = studentInfo;
}
public int getStudentNum() {
return studentNum;
}
public void setStudentNum(int studentNum) {
this.studentNum = studentNum;
}
// 显示学生信息的方法,返回信息
public String showStudentInfo() {
String arr = "学生信息如下:\n" + "姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
+ this.getStudentSex() + "\n年龄:" + this.getStudentAge() + "\n专业名称:"
+ this.studentSubject.getSubjectName() + "\n专业年限:" + this.studentSubject.getSubjectLife();
return arr;
}
//将学生信息装入数组,并计算学生个数
public void addStudent(Student stu) {
/**
* 1将学生信息保存到数组中
* 2将学生个数保存到学生个数中studentNum
*/
//1将学生信息保存到数组中
int i;
for(i=0;i
Subject.java
package com.demo.day4.info;
/**
* 这个是学科信息的类,包含专业名称、专业编号、学制年限
*
* @author Mr-Donkey
*
*/
public class Subject {
private String subjectName;
private String subjectNo;
private int subjectLife;
// 无参的构造函数
public Subject() {
}
// 构造带参的构造函数
public Subject(String subjectName, String subjectNo, int subjectLife) {
this.setSubjectName(subjectName);
this.setSubjectNo(subjectNo);
this.setSubjectLife(subjectLife);
}
public String getSubjectName() {
return subjectName;
}
public void setSubjectName(String subjectName) {
this.subjectName = subjectName;
}
public String getsubjectNo() {
return subjectNo;
}
public void setSubjectNo(String subjectNo) {
this.subjectNo = subjectNo;
}
public int getSubjectLife() {
return subjectLife;
}
public void setSubjectLife(int subjectLife) {
this.subjectLife = subjectLife;
}
// 定义一个显示的方法,返回信息
public String showSubject() {
String arr = "专业信息如下:\n" + "专业名称:" + this.getSubjectName() + "\n专业编号:" + this.getsubjectNo() + "\n专业年限:"
+ this.getSubjectLife();
return arr;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
Test.java
package com.demo.day4.test;
import com.demo.day4.info.Student;
import com.demo.day4.info.Subject;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//声明并实例化Subject对象
//测试Subject
Subject sub=new Subject("计算机科学学院","J0001" , 4);
System.out.println(sub.showSubject());
System.out.println("===========================");
//测试Student
Student stu=new Student("张三","S01","男",18,sub);
System.out.println(stu.showStudentInfo());
System.out.println("===========================");
Student stu1=new Student("李四","S02","女",17,sub);
System.out.println(stu1.showStudentInfo());
System.out.println("===========================");
Student stu2=new Student("王五","S03","男",20,sub);
System.out.println(stu2.showStudentInfo());
System.out.println("===========================");
//显示专业已有人数
stu.addStudent(stu);
stu.addStudent(stu1);
stu.addStudent(stu2);
System.out.println(sub.getSubjectName()+"已有学生"+stu.getStudentNum()+"名");
}
}