唉,今天进行了一个小测试,一下子感觉学的就是个屁,前段时间还以为自己学得可以,就进行了个小测试,测试有10题,时间只有1个小时,值做出了5道,不能怪时间太少,只能怪自己打字慢、思路太迟钝了、知识掌握得不彻底,学了后面忘了前面,所以今天就复习巩固一下前面学得封装吧,稍微会有一点扩展,主要是被那个封装的题打击到了。
1、安全
2、隔离变化
3、操作简单
4、可从用
该隐藏的隐藏起来,该暴露的暴露出来
一言不合咱们就代码见了,哈哈,主要是不太喜欢那些太官方的话,所以干脆直接上干货了,
public class Student {
}
注意:类名的首字母一定大写,还有最好用英文来表示,这是为了代码具有更强的可读性——见名知意。
代码如下(示例):
public class Student {
private String name;
private int number;
}
为了让大家看得更直观,我只加了两个属性学生名字(name),学号(number),这里我们就用面向企业级的关键修饰符private,为了避免属性暴露,当然也是为了后续的封装做准备。
public class Student {
private String name;
private int number;
// 无参构造函数
public Student() {
}
// 有参构造函数
public Student(String name, int number) {
super();
this.name = name;
this.number = number;
}
}
这里想我一样的初学者建议手敲,方便加深印象。其实无参构造函数是系统默认存在的,可以不用弄出来但是不管在什么时候一定要记住,手动的加无参构造函数,因为如果一个类里面没有其他构造函数的话,那还好,但是当你有了有参构造函数,你又没手动添加,就会将你的无参构造函数给覆盖了,你就调用不了,泪目…,亲生体验。
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修饰的,不能再用 对象名.属性名 进行访问了,所以用方法来赋值以及访问。
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、学生类。学生包括:姓名、学号、成绩,家庭住址
创建一个地址类,里面加入四个属性省、市、街道、邮编,都是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;
}
}
创建一个成绩单类,里面加入三个属性语文、数学、英语成绩,都是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;
}
}
将地址类和成绩单类联系起来方便后续题目的实现
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;
}
}
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
终于把题目的所有要求都达到了,这里面用到最多的知识点就是封装,一开始就给记得不清了,写起来就有点费力。
其实通过这一次小小的测试让我知道了,还是有很多不足,还有很多需要弥补的知识点,还要多多回顾,以免自己明明学过,就因为磨砺两可给弄不出来是真的难受,大家引我为荐吧。