0719(012天 面向对象基础02)

这篇博客主要探讨了面向对象编程中的封装概念,通过多个练习题详细讲解如何实现类的封装,包括员工信息、日期、公民、日期共享类、数组管理工具类以及常识工具类的创建和操作。博客强调了封装的重要性,如隐藏属性、防止异常数据、提供合法操作,以及面向对象设计的初步步骤——识别并抽象出对象和类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0719(012天 面向对象基础02-封装)

每日一狗(边牧coffee的一家

主标题

1. 面向对象基础02(封装)

类:用户自定义的数据类型

  • 成员属性:数据
  • 成员方法:操作

关键字:class

类名规范:首字母大写,分词首字母大写。

class stu{
    // 属性
    int stuId;
    int name;
    // 操作
    void gaiMing(){}
}

对象:类的实例化

  • 变量(可命名存储空间)
  • 研究目标

对象的属性和方法能不能直接访问修改取决于范围限定词

类名 变量名 = new 类名();

对象的属性使用方法赋值,可以在方法内部进行合法性检验。

一般情况下对象的属性都是私有的,当要把一个属性设定为公共的话,为该对象添加对应的get、set方法

限定词当前类内同包子类到处可见
privateT
无范围限定TT
protectedTTT
publicTTTT

练习题:

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
       */
      

总结:

封装

  • 实现属性的隐藏
  • 使用操作给属性赋值时可以对其进行合法性检测,防止异常数据的生成

对象属性

  • 实现对象各种各样的数据的打包

对象的操作

  • 实现对属性的操作
  • 可以将常用且类似的数据操作自定义成一个新的类,方便后期调用

面向对象一上来先干嘛?先找对象呀,把需求中的对象(名词)都扒拉出来,在将拥有同种属性和操作的对象抽象成一个个类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值