2021-01-20

文章目录

  • 前言
  • 一、封装概述
    • 1.为什么要封装
    • 2.封装原则
  • 二、代码示例
    • 1.创建一个名为学生的类
    • 2.向学生类里面加一些学生们公有的东西
    • 3.写关于学生类的无参构造函数以及有参构造函数(重要!!!!!!!!!!)
    • 4.使用get、set 方法
    • 5.封装代码
  • 三,打击到我的代码
    • 1.家庭地址类
    • 2.成绩单类
    • 3.学生类
    • 2.测试
  • 总结

前言

唉,今天进行了一个小测试,一下子感觉学的就是个屁,前段时间还以为自己学得可以,就进行了个小测试,测试有10题,时间只有1个小时,值做出了5道,不能怪时间太少,只能怪自己打字慢、思路太迟钝了、知识掌握得不彻底,学了后面忘了前面,所以今天就复习巩固一下前面学得封装吧,稍微会有一点扩展,主要是被那个封装的题打击到了。

一、封装概述

1.为什么要封装

1、安全
2、隔离变化
3、操作简单
4、可从用

2.封装原则

该隐藏的隐藏起来,该暴露的暴露出来

二、代码示例

一言不合咱们就代码见了,哈哈,主要是不太喜欢那些太官方的话,所以干脆直接上干货了,

1.创建一个名为学生的类

public class Student {
     

}

注意:类名的首字母一定大写,还有最好用英文来表示,这是为了代码具有更强的可读性——见名知意。

2.向学生类里面加一些学生们公有的东西

代码如下(示例):

public class Student {
     
	private String name;
	private int number;
}

为了让大家看得更直观,我只加了两个属性学生名字(name),学号(number),这里我们就用面向企业级的关键修饰符private,为了避免属性暴露,当然也是为了后续的封装做准备。

3.写关于学生类的无参构造函数以及有参构造函数(重要!!!!!!!!!!)

public class Student {
     
	private String name;
	private int number;
	// 无参构造函数
	public Student() {
     
		
	}
	// 有参构造函数
	public Student(String name, int number) {
     
		super();
		this.name = name;
		this.number = number;
	}
	
	
}

这里想我一样的初学者建议手敲,方便加深印象。其实无参构造函数是系统默认存在的,可以不用弄出来但是不管在什么时候一定要记住,手动的加无参构造函数,因为如果一个类里面没有其他构造函数的话,那还好,但是当你有了有参构造函数,你又没手动添加,就会将你的无参构造函数给覆盖了,你就调用不了,泪目…,亲生体验。

4.使用get、set 方法

package com.etime09;

public class Student {
     
	private String name;
	private int number;
	// 无参构造函数
	public Student() {
     
		
	}
	// 有参构造函数
	public Student(String name, int number) {
     
		super();
		this.name = name;
		this.number = number;
	}
	// 将学生的两个私有属性进行对应的方法化
	public String getName() {
     
		return name;
	}
	public void setName(String name) {
     
		this.name = name;
	}
	public int getNumber() {
     
		return number;
	}
	public void setNumber(int number) {
     
		this.number = number;
	}

这是因为属性是private修饰的,不能再用 对象名.属性名 进行访问了,所以用方法来赋值以及访问。

5.封装代码

1、建立一个测试类

public class Test01 {
     

	public static void main(String[] args) {
     

	}

}

2、在测试类中构造一个学生对象(采用有参构造函数构造)

public class Test01 {
     

	public static void main(String[] args) {
     
		Student student01 = new Student("张三", 123456);

	}

}

3、使用get方法获取实例变量的值

public class Test01 {
     

	public static void main(String[] args) {
     
		Student student01 = new Student("张三", 123456);
		String name = student01.getName();
		int number = student01.getNumber();
		System.out.println(name);
		System.out.println(number);

	}

}

代码如下(测试结果):

张三
123456

终于将代码封装起来了,不在是那种public修饰的直接暴露的任人宰割的羔羊了。

三,打击到我的代码

题目是这样:
请用面向对象思想设计以下类及其相互关系。

1、成绩单。成绩单包括:语文、数学、英语成绩;可提供平均成绩,最低科目成绩,最高科目成绩。

2、家庭地址类。地址包括:省、市、街道、邮编

3、学生类。学生包括:姓名、学号、成绩,家庭住址

1.家庭地址类

创建一个地址类,里面加入四个属性省、市、街道、邮编,都是private修饰,所以用get set方法访问

package com.etime07;

public class Adress {
     
	private String province;
	private String city;
	private String street;
	private String email;
	public Adress() {
     
		
	}
	public Adress(String province, String city, String street, String email) {
     
		super();
		this.province = province;
		this.city = city;
		this.street = street;
		this.email = email;
	}
	public String getProvince() {
     
		return province;
	}
	public void setProvince(String province) {
     
		this.province = province;
	}
	public String getCity() {
     
		return city;
	}
	public void setCity(String city) {
     
		this.city = city;
	}
	public String getStreet() {
     
		return street;
	}
	public void setStreet(String street) {
     
		this.street = street;
	}
	public String getEmail() {
     
		return email;
	}
	public void setEmail(String email) {
     
		this.email = email;
	}
}

2.成绩单类

创建一个成绩单类,里面加入三个属性语文、数学、英语成绩,都是private修饰,所以用get set方法访问,加上题目要求的几个方法,比如平均数等

public class Report {
     
	private int chinese;
	private int math;
	private int english;
	
	public int ave() {
     
		return (chinese+math+english)/3;
	}
	public void max() {
     
		if(chinese>=math&&chinese>=english) {
     
			System.out.println("chinese 最高,分数为:"+chinese);
		}else if(math>=chinese&&math>=english) {
     
			System.out.println("math 最高,分数为:"+math);
		}else {
     
			System.out.println("english 最高,分数为:"+english);
		}
	}
	public void min() {
     
		if(chinese<=math&&chinese<=english) {
     
			System.out.println("chinese 最低,分数为:"+chinese);
		}else if(math<=chinese&&math<=english) {
     
			System.out.println("math 最低,分数为:"+math);
		}else {
     
			System.out.println("english 最低,分数为:"+english);
		}
	}
	
	
	public Report() {
     

	}
	public Report(int chinese, int math, int english) {
     
		super();
		this.chinese = chinese;
		this.math = math;
		this.english = english;
	}
	public int getChinese() {
     
		return chinese;
	}
	public void setChinese(int chinese) {
     
		this.chinese = chinese;
	}
	public int getMath() {
     
		return math;
	}
	public void setMath(int math) {
     
		this.math = math;
	}
	public int getEnglish() {
     
		return english;
	}
	public void setEnglish(int english) {
     
		this.english = english;
	}
}

3.学生类

将地址类和成绩单类联系起来方便后续题目的实现

public class Student {
     
	private String name;
	private int number;
	private Report report;
	private Adress adress;
	
	public Student() {
     

	}

	public Student(String name, int number, Report report, Adress adress) {
     
		super();
		this.name = name;
		this.number = number;
		this.report = report;
		this.adress = adress;
	}

	public String getName() {
     
		return name;
	}

	public void setName(String name) {
     
		this.name = name;
	}

	public int getNumber() {
     
		return number;
	}

	public void setNumber(int number) {
     
		this.number = number;
	}

	public Report getReport() {
     
		return report;
	}

	public void setReport(Report report) {
     
		this.report = report;
	}

	public Adress getAdress() {
     
		return adress;
	}

	public void setAdress(Adress adress) {
     
		this.adress = adress;
	}
}

2.测试

public class Test01 {
     

	public static void main(String[] args) {
     
		// TODO Auto-generated method stub
		Report report = new Report(95, 9, 93);
		Adress adress = new Adress("贵州", "六盘水", "凤凰新区", "012345");
		Student student01 = new Student("张三", 1234, report, adress);
		int result = student01.getReport().ave();
		System.out.println(result);
		student01.getReport().max();
		student01.getReport().min();

	}

}

代码如下(输出):

65
chinese 最高,分数为:95
math 最低,分数为:9

终于把题目的所有要求都达到了,这里面用到最多的知识点就是封装,一开始就给记得不清了,写起来就有点费力。

总结

其实通过这一次小小的测试让我知道了,还是有很多不足,还有很多需要弥补的知识点,还要多多回顾,以免自己明明学过,就因为磨砺两可给弄不出来是真的难受,大家引我为荐吧。

你可能感兴趣的:(Java学习日记,封装,类,java)