android基础学习-java篇day4-step2-第二节:java封装

什么是封装?

-将类的某些信息隐藏在类的内部,不允许外部程序访问

-通过该类提供的方法来实现对隐藏信息的操作和访问

-隐藏对象的信息

-留出访问的接口

特点:

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关键字后,变成静态属性/类属性;

当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<this.getStudentInfo().length;i++) {
			if((this.getStudentInfo()[i]==null) ){
				this.getStudentInfo()[i]=stu;
				break;
			}
		}
		//2将学生个数保存到学生个数中studentNum
		this.studentNum=i+1;
		
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

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()+"名");
		
		
	}

}

猜你喜欢

转载自blog.csdn.net/qq_17846019/article/details/82460444