0719(012天 面向对象基础02-封装)
每日一狗(边牧coffee的一家)
主标题
文章目录
1. 面向对象基础02(封装)
类:用户自定义的数据类型
- 成员属性:数据
- 成员方法:操作
关键字:class
类名规范:首字母大写,分词首字母大写。
class stu{
// 属性
int stuId;
int name;
// 操作
void gaiMing(){}
}
对象:类的实例化
- 变量(可命名存储空间)
- 研究目标
对象的属性和方法能不能直接访问修改取决于范围限定词
类名 变量名 = new 类名();
对象的属性使用方法赋值,可以在方法内部进行合法性检验。
一般情况下对象的属性都是私有的,当要把一个属性设定为公共的话,为该对象添加对应的
get、set
方法
限定词 | 当前类内 | 同包 | 子类 | 到处可见 |
---|---|---|---|---|
private | T | |||
无范围限定 | T | T | ||
protected | T | T | T | |
public | T | T | T | T |
练习题:
1. 封装输出员工信息
声明员工类Employee,包含属性:编号、姓名、年龄、薪资,并在main方法中,创建2个员工对象,并为属性赋值,并打印两个员工的信息。
package com.ketang;
public class MyDate {
private int year, month, day;
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
if (month > 12) {
this.year += month / 12;
this.month = month % 12;
} else if (month < 1) {
int y = 0;
while (month < 1) {
y--;
month += 12;
}
this.year += y;
this.month = month;
} else {
this.month = month;
}
}
public int getDay() {
return day;
}
public void setDay(int day) {
if (day < 1 || day > 31) {
System.out.println("非法字符");
return;
}
this.day = day;
}
@Override
public String toString() {
return "出生日期是" + year + "年" + month + "月" + day + "日";
}
public void show() {
System.out.println("日期是" + year + "年" + month + "月" + day + "天");
}
}
====================================================================package com.ketang;
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Empoyee e1 = new Empoyee();
e1.setBianHao(1);
e1.setNianLing(20);
e1.setXingMing("小黄");
e1.setXinZi(8000);
e1.show(); // 员工1的编号:1,姓名:小黄,年龄:20,薪资:8000.0
Empoyee e2 = new Empoyee();
e2.setBianHao(2);
e2.setNianLing(21);
e2.setXingMing("小兰");
e2.setXinZi(9000);
e2.show(); // 员工2的编号:2,姓名:小兰,年龄:21,薪资:9000.0
}
}
2. 自定义日期类
声明员工类Employee,包含属性:编号、姓名、年龄、薪资,
并在main方法中,创建2个员工对象,并为属性赋值,并打印两个员工的信息。
package com.ketang;
public class MyDate {
private int year, month, day;
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
if (month > 12) {
this.year += month / 12;
this.month = month % 12;
} else if (month < 1) {
int y = 0;
while (month < 1) {
y--;
month += 12;
}
this.year += y;
this.month = month;
} else {
this.month = month;
}
}
public int getDay() {
return day;
}
public void setDay(int day) {
if (day > 31) {
while (true) {
if (day <= auxiliaryDay()) {
break;
}
day -= auxiliaryDay();
this.setMonth(++month);
}
} else if (day < 1) {
while (true) {
if (day >= auxiliaryDay()) {
break;
}
day += auxiliaryDay();
this.setMonth(++month);
}
}
this.day = day;
}
public int auxiliaryDay() {
int res = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
res = 31;
break;
case 4:
case 6:
case 9:
case 11:
res = 30;
break;
case 2:
if ((year % 4 == 0 && year % 10 != 0) || (year % 400 == 0)) {
res = 29;
break;
} else {
res = 28;
break;
}
default:
res = 0;
}
return res;
}
@Override
public String toString() {
return year + "年" + month + "月" + day + "日";
}
public void show() {
System.out.println("日期是" + year + "年" + month + "月" + day + "天");
}
}
3.自定义公民类
声明公民类Citizen,包含属性:姓名,生日,身份证号,其中姓名是String类型,生日是MyDate类型, 身份证号也是String类型。
在main方法中创建你们家庭成员的几个对象,并打印信息
package com.ketang;
public class Citizen {
private String name;
private MyDate birthday;
private String ID;
@Override
public String toString() {
return "姓名是" + name + ", 生日是" + birthday.toString() + ", 身份证号是" + ID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public MyDate getBirthday() {
return birthday;
}
public void setBirthday(MyDate birthday) {
this.birthday = birthday;
}
public String getID() {
return ID;
}
public void setID(String iD) {
ID = iD;
}
}
===============================================================================
package com.ketang;
public class Test03公民 {
public static void main(String[] args) {
//
Citizen[] arr = new Citizen[3];
arr[0] = new Citizen();
arr[0].setName("小黑子");
arr[0].setID("610122*****3414");
arr[0].setBirthday(new MyDate());
arr[0].getBirthday().setYear(2016);
arr[0].getBirthday().setMonth(12);
arr[0].getBirthday().setDay(14);
arr[1] = new Citizen();
arr[1].setName("小化子");
arr[1].setID("610122*****3414");
arr[1].setBirthday(new MyDate());
arr[1].getBirthday().setYear(2016);
arr[1].getBirthday().setMonth(12);
arr[1].getBirthday().setDay(14);
arr[2] = new Citizen();
arr[2].setName("小渣子");
arr[2].setID("610122*****3414");
arr[2].setBirthday(new MyDate());
arr[2].getBirthday().setYear(2016);
arr[2].getBirthday().setMonth(12);
arr[2].getBirthday().setDay(14);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[0].toString());
}
}
}
4. 自定义日期类
声明一个日期类MyDate,包含属性:年、月、日,并在MyDate类中声明几个方法: 1、boolean isLeapYear():判断当前日期的是闰年吗?
2、void set(int y, int m, int d):修改年,月,日为新日期
3、void puls(int years, int months, int days):加上years年,months月,days天后的日期
在main方法中创建对象,并调用测试
=================== 实现类 ===================
package com.ketang;
public class MyDate2 {
private int nian, yue, ri;
// 修改年月日
public void xiuGai(int nian, int yue, int ri) {
this.setNian(nian);
this.setYue(yue);
this.setRi(ri);
}
// 增加日期
public void addRiQi(int nian, int yue, int ri) {
this.setNian(this.nian + nian);
this.setYue(this.yue + yue);
this.setRi(this.ri + ri);
}
// 判定当前年份是否为闰年
public boolean isLeapYear() {
return ((nian % 4 == 0 && nian % 10 != 0) || (nian % 400 == 0));
}
public int getNian() {
return nian;
}
public void setNian(int nian) {
this.nian = nian;
}
public int getYue() {
return yue;
}
// 对月份进行合法性验证,并修正年份
public void setYue(int yue) {
if (yue > 0 && yue <= 12) {
this.yue = yue;
} else {
while (true) {
if (yue > 12) {
this.nian++;
yue -= 12;
} else if (yue <= 0) {
this.nian--;
yue += 12;
} else {
break;
}
}
}
this.yue = yue;
}
@Override
public String toString() {
return "日期是" + nian + "年" + yue + "月" + ri + "日";
}
public int getRi() {
return ri;
}
public void setRi(int ri) {
if (ri > 0) {
while (ri > yueTianShu(this.yue)) {
ri -= yueTianShu(this.yue);
this.setYue(++this.yue);
}
} else {
while (ri <= 0) {
ri += yueTianShu(this.yue);
this.setYue(--yue);
}
}
this.ri = ri;
}
private int yueTianShu(int yue) {
int res = 0;
switch (yue) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
res = 31;
break;
case 4:
case 6:
case 11:
res = 30;
break;
case 2:
if (isLeapYear()) {
res = 28;
break;
} else {
res = 27;
break;
}
default:
res = -1;
break;
}
return res;
}
}
============= 测试类 =================
package com.ketang;
public class Test04自定义日期类测试 {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyDate2 my2 = new MyDate2();
my2.setNian(2016);
my2.setYue(13);
my2.setRi(32);
System.out.println(my2.toString());// 日期是2017年2月1日
my2.xiuGai(2018, 10, 25);
System.out.println(my2.toString());// 日期是2018年10月25日
my2.addRiQi(2, 1, 3);
System.out.println(my2.toString());// 日期是2020年11月28日
}
}
5. 自定义三角形类
声明一个三角形类Triangle,包含属性:a,b,c,表示三条边,包含几个方法:
1、boolean isRightTriangle():判断是否是一个直角三角形
2、boolean isIsoscelesTriangle():判断是否是一个等腰三角形
3、boolean isEquilateralTriangle():判断是否是一个等边三角形
4、double getArea():根据三条边,用海伦公式求面积
5、double getLength():求周长
并在main方法中调用测试
package com.ketang;
public class SanJiaoXing {
private int a, b, c;
boolean dengBian() {
if (sanJiao()) {
return a == b && b == c;
}
return false;
}
boolean dengYao() {
if (sanJiao()) {
return a == b || a == c || b == c;
}
return false;
}
boolean zhiJiao() {
if (sanJiao()) {
return a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a;
}
return false;
}
boolean sanJiao() {
return a + b > c && a + c > b && b + c > a;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SanJiaoXing s = new SanJiaoXing();
s.setA(5);
s.setB(5);
s.setC(5);
System.out.println((s.sanJiao() ? "" : "不是") + "三角形"); // 三角形
System.out.println((s.zhiJiao() ? "" : "不是") + "直角三角形"); // 不是直角三角形
System.out.println((s.dengBian() ? "" : "不是") + "等边三角形"); // 等边三角形
System.out.println((s.dengYao() ? "" : "不是") + "等腰三角形"); // 等腰三角形
}
//
public double getA() {
return a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
public int getC() {
return c;
}
public void setC(int c) {
this.c = c;
}
public void setA(int a) {
this.a = a;
}
}
6. 自定义日期共享类
声明一个常识工具类DateCommonsTools,包含如下方法:
1、String getWeekName(int week):根据星期值,返回对应的中文单词
2、String getMonthName(int month):根据月份值,返回对应的英语单词
3、int getTotalDaysOfMonth(int year, int month):返回某年某月的总天数
4、int getTotalDaysOfYear(int year):获取某年的总天数
5、boolean isLeapYear(int year):判断某年是否是闰年
声明一个Test08测试类,并在main方法中调用测试
package com.ketang;
public class DateCommonsTools {
// 1、String getWeekName(int week):根据星期值,返回对应的中文单词
String getWeekName(int week) {
String[] x = { "星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
if (week >= 0) {
return x[week % 7];
}
return "未知";
}
// 2、String getMonthName(int month):根据月份值,返回对应的英语单词
String getMonthName(int month) {
String[] x = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October",
"November", "December" };
if (month > 0 && month <= 12) {
return x[month - 1];
}
return "超出范围";
}
// 3、int getTotalDaysOfMonth(int year, int month):返回某年某月的总天数
int getTotalDaysOfMonth(int year, int month) {
int[] monthAtDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (isLeapYear(year)) {
monthAtDays[1] = 29;
}
if (month <= 0) {
month = 1;
} else if (month > 12) {
month = 12;
}
return monthAtDays[month - 1];
// int res = 0; // 共有多少天
// for (int i = 0; i < month; i++) {
// res += monthAtDays[i];
// }
// return res;
}
// 4、int getTotalDaysOfYear(int year):获取某年的总天数
int getTotalDaysOfYear(int year) {
return isLeapYear(year) ? 366 : 365;
}
// 5、boolean isLeapYear(int year):判断某年是否是闰年
boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 10 != 0) || (year % 400 == 0);
}
// 声明一个Test08测试类,并在main方法中调用测试
public static void main(String[] args) {
// TODO Auto-generated method stub
DateCommonsTools d = new DateCommonsTools();
System.out.println(d.getWeekName(1));// 星期一
System.out.println(d.getMonthName(12));// December
System.out.println(d.getTotalDaysOfMonth(2016, 2));// 29
System.out.println(d.getTotalDaysOfYear(2016));// 366
System.out.println(d.isLeapYear(2016));// true
}
}
7. 自定义数组管理工具类MyArrays
1、void sort(int[] arr):可以为任意一维整型数组arr实现从小到大排序
2、int indexOf(int[] arr, int value):可以在任意一维整型数组arr中使用折半查找法查找value值的下 标,如果不存在返回-1
3、int[] copy(int[] arr, int len):可以实现从任意一维数组arr中复制一个新数组返回,新数组的长度为 len,从arr[0]开始复制 声明一个Test07测试类,并在main方法中调用测试
package com.ketang;
import java.util.Arrays;
public class MyArrays {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyArrays ma = new MyArrays();
int[] arr = { 2, 3, 7, 5, 6, 1 };
ma.sort(arr);
System.out.println(Arrays.toString(arr));// [1, 2, 3, 5, 6, 7]
System.out.println(ma.indexOf(arr, 5));// 3
System.out.println(Arrays.toString(ma.copy(arr, 10)));// [1, 2, 3, 5, 6, 7, 1, 2, 3, 5]
}
// 排序
void sort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
// 查找
int indexOf(int[] arr, int target) {
sort(arr);
int index = -1;
int start = 0;
int end = arr.length - 1;
int mean = 0;
while (start <= end) {
mean = (start + end) / 2;
if (arr[mean] > target) {
end = mean - 1;
} else if (arr[mean] < target) {
start = mean = 1;
} else {
index = mean;
break;
}
}
return index;
}
// 填满拷贝
int[] copy(int[] arr, int len) {
int[] res = new int[len];
for (int i = 0; i < len; i++) {
res[i] = arr[i % arr.length];
}
return res;
}
}
8.自定义常识工具类DateCommonsTools
1、String getWeekName(int week):根据星期值,返回对应的中文名称,例如星期一
2、String getMonthName(int month):根据月份值,返回对应的英语单词
3、int getTotalDaysOfMonth(int year, int month):返回某年某月的总天数
4、int getTotalDaysOfYear(int year):获取某年的总天数
5、boolean isLeapYear(int year):判断某年是否是闰年
package com.ketang;
public class DateCommonsTools {
// 1、String getWeekName(int week):根据星期值,返回对应的中文单词
String getWeekName(int week) {
String[] x = { "星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
if (week >= 0) {
return x[week % 7];
}
return "未知";
}
// 2、String getMonthName(int month):根据月份值,返回对应的英语单词
String getMonthName(int month) {
String[] x = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October",
"November", "December" };
if (month > 0 && month <= 12) {
return x[month - 1];
}
return "超出范围";
}
// 3、int getTotalDaysOfMonth(int year, int month):返回某年某月的总天数
int getTotalDaysOfMonth(int year, int month) {
int[] monthAtDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (isLeapYear(year)) {
monthAtDays[1] = 29;
}
if (month <= 0) {
month = 1;
} else if (month > 12) {
month = 12;
}
return monthAtDays[month - 1];
// int res = 0; // 共有多少天
// for (int i = 0; i < month; i++) {
// res += monthAtDays[i];
// }
// return res;
}
// 4、int getTotalDaysOfYear(int year):获取某年的总天数
int getTotalDaysOfYear(int year) {
return isLeapYear(year) ? 366 : 365;
}
// 5、boolean isLeapYear(int year):判断某年是否是闰年
boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 10 != 0) || (year % 400 == 0);
}
// 声明一个Test08测试类,并在main方法中调用测试
public static void main(String[] args) {
// TODO Auto-generated method stub
DateCommonsTools d = new DateCommonsTools();
System.out.println(d.getWeekName(1));// 星期一
System.out.println(d.getMonthName(12));// December
System.out.println(d.getTotalDaysOfMonth(2016, 2));// 29
System.out.println(d.getTotalDaysOfYear(2016));// 366
System.out.println(d.isLeapYear(2016));// true
}
}
扩展小芝士
-
注释
-
单行注释
public int getYear() { // 输出获取日期 return year; }
-
多行注释
/* * 多行注释 */
-
文档注释
/** * * @return */
-
总结:
封装
- 实现属性的隐藏
- 使用操作给属性赋值时可以对其进行合法性检测,防止异常数据的生成
对象属性
- 实现对象各种各样的数据的打包
对象的操作
- 实现对属性的操作
- 可以将常用且类似的数据操作自定义成一个新的类,方便后期调用
面向对象一上来先干嘛?先找对象呀,把需求中的对象(名词)都扒拉出来,在将拥有同种属性和操作的对象抽象成一个个类。