public class MyDate {//日期类,公有,与源程序文件同名private int year,month,day;//年月日,私有成员变量private static int thisYear;//静态成员变量初始化static {thisYear = 2018;}public MyDate(int year,int month,int day){//构造方法,指定日期this.set(year,month,day);//调用苯类的成员方法}public MyDate(){//无参数的构造方法,指定缺省日期,重载this(1970,1,1);//调用本类已声明的其他构造方法}public MyDate(MyDate date){//拷贝构造方法,日期同参数,重载this.set(date);}public void set(int year,int month,int day){//设置日期值,算法不全,改进见5.2.3节this.year = year;//this.year指定前对象的成员变量,year指参数this.month = (month >= 1 && month <= 12)?month : 1;this.day = (day >= 1 && month <= 31)?day:1;//this应用不能省略}public void set(MyDate date){//设置日期值,重载this.set(date.year, date.month, date.day);//调用同名的成员方法,不能使用this()}public int getYear(){//获得年份return this.year;}public int getMonth(){//获得月份return this.month;}public int getDay(){//获得当月日期return this.day;}public String toString(){//中文日期格式字符串,2为月日return year +"年"+String.format("%02d",month)+"月"+String.format("%02d",day)+"日";}public static int getThisYear(){//获得今年年份,静态方法return thisYear;}public static boolean isLeapYear(int year){//判断指定的年份是否润年,静态方法return year%400 == 0 || year % 100 != 0 && year%4 == 0;}public boolean isLeapYear(){//判断当前日期的年份是否润年,重载return isLeapYear(thisYear);//调用静态方法}//比较当前日期值与date是否相等。参数类型待改进,间3.4.4节public boolean equals(MyDate date){//this 指代调用当前方法的对象return this == date || date != null && this.year == date.year && this.month == date.month && this.day == date.day;}public static int daysOfMonth(int year,int month){//返回指定年月的天数,静态方法switch (month){case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31;case 4: case 6: case 9: case 11: return  30;case 2: return MyDate.isLeapYear(year)?29:28;default:return 0 ;}}public int daysOfMonth(){//返回当月天数return daysOfMonth(this.year,this.month);}public void tomorrow(){//将this引用实例的日期改为及后一天日期,meiy返回值this.day = this.day%this.daysOfMonth()+1;if(this.day == 1){this.month = this.month % 12 + 1;//下个月
//            if(this.month == 1){//12月的下月是明年1月
//              date.year++;
//            }}}public MyDate yesterday(){//返回当前日期的前一天日期MyDate date = new MyDate(this);//执行拷贝构造方法,创建实例,没有改变thisdate.day--;if(date.day == 0){date.month = (date.month-2+12)%12+1;if(date.month == 12){//1月的上月是去年12月date.year--;}date.day = daysOfMonth(date.year, date.month);}return date;}
}
class MyDate_ex{public static void main(String[] args) {//调用静态方法System.out.println("今年是"+MyDate.getThisYear()+",润年?"+MyDate.isLeapYear(MyDate.getThisYear()));MyDate d1 = new MyDate(2017,12,31);System.out.println(d1.getYear()+"年,润年?"+d1.isLeapYear());//调用实例成员方法MyDate d2 = new MyDate(d1);//调用拷贝构造方法复制实例System.out.println("d1:"+d1+",+d2:"+d2+",d1 == d2?"+(d1 == d2)+",d1.equals(d2)?"+d1.equals(d2));//区别关系运算==与比较相等方法System.out.print(d1+"的明天是");d1.tomorrow();System.out.println(d1+"\n"+d2+"昨天的是"+(d2 = d1.yesterday()));}
}public class Person {public String name;//姓名,实例成员变量,保护成员public MyDate birthdate;//出生日期,MyDate类见例3.2public String gender,province,city;//性别,省份,城市public static int count = 0;//静态成员变量,本类及子类实例计数//构造方法public Person(String name, MyDate birthdate, String gender, String province, String city) {//调用本类声明的成员方法this.set(name,birthdate,gender,province,city);count++;//Person.count}public Person(String name, MyDate birthdate){//构造方法,重载this(name, birthdate,"","","");//调用本类已声明的构造方法}public Person(){//构造方法,重载this("",new MyDate());}public Person(Person per){//拷贝构造方法,重载,复制对象。深拷贝,创建日期实例this(per.name,new MyDate(per.birthdate),per.gender,per.province,per.city);}public void finalize(){//析构方法System.out.println("释放对象("+this.toString()+")");Person.count--;}//显示对象数,静态成员方法,只能访问静态成员变量,不能访问实例成员,也不能使用thispublic static void howMany(){System.out.println(Person.count+"个Person对象,");}//设置属性public void set(String neme,MyDate birthdate,String gender,String province,String city){this.name = neme == null?"":neme;//将空对象转成空串,避免equals()抛出空对象异常this.birthdate = birthdate;//引用赋值,不用深拷贝,可修改this.gender = gender ==null?"":gender;this.province = province == null?"":province;this.city = city == null?"":city;}public void set(String name,MyDate birthdate){//设置属性,其他成员变量取默认值,重载this.set(name,birthdate,"","","");}public String toString(){return this.name + ","+(this.birthdate == null?"":birthdate.toString())+","+this.gender+","+this.province+","+this.city;}public static void main(String[] args){Person p1 = new Person(("李小明"), new MyDate(1994,3,15));Person p2 = new Person(p1);//拷贝构造方法Person.howMany();//通过类名调用成员方法System.out.println("p1:"+p1+"p2:"+p2+"\np1==p2?"+(p1 == p2)+"; p1.name ==p2.name?"+(p1.name == p2.name)+",p1.birtdate == p2.birtdate?"+(p1.birthdate == p2.birthdate));//显示引用关系//以下修改p2的姓名和生日p2.name = "张"+p2.name.substring(1);//改性,一个汉字长度为1字符MyDate date = p2.birthdate;//获得日期,传递日期对象引用//更改date值,将影响p2.birthdate实例值,因为date与p2.birthdate引用同一个实例date.set(date.getYear()+2,date.getMonth(),date.getDay());p1.finalize();//调用析构方法,释放对象Person.howMany();//通过类名调用静态方法}
}

public class MyDate{...}和public class Pereson{...} 利用是一个代码段的两个类。

【Java类的封装性】封装的日期类。Person类,使用对象作为成员变量并实现深拷贝。(利用了类的封装性)相关推荐

  1. Java面向对象思想、类的定义、对象的使用、对象内存图、成员变量和局部变量的区别、封装、private关键字、this关键字、构造方法、JavaBean-day06

    目录 第1节 面向对象思想 1.1 面向对象思想概述 概述 举例 特点 1.2 类和对象 什么是对象 类与对象的关系 1.3 类的定义 事物与类的对比 类的定义格式 1.4 对象的使用 对象的使用格式 ...

  2. Java07-day07【类和对象、对象内存图、成员变量与局部变量、private、this、封装、构造方法】

    java零基础入门到精通(2019版)[黑马程序员] 视频+资料:[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] &qu ...

  3. java box类定义三变量_01.类的成员变量:\n设计一个立方体类Box,定义三个属性,分别是长,宽,高。定义二个方法,分别计...

    01.类的成员变量:\n设计一个立方体类Box,定义三个属性,分别是长,宽,高.定义二个方法,分别计算并输出立方体的体积和表面积 答:java.util.Scanner; public class B ...

  4. 先设计一个基本账户类,再通过继承基本账户类设计一个储蓄账户类,储蓄账户 类中增加密码、地址、最小余额和利率等成员变量,并增加一些银行账户经常用到的成员函数。 要求: (1)类

    先设计一个基本账户类,再通过继承基本账户类设计一个储蓄账户类,储蓄账户 类中增加密码.地址.最小余额和利率等成员变量,并增加一些银行账户经常用到的成员函数. 要求: (1)类中的成员函数具有输入.输出 ...

  5. Java面向对象之成员变量的初始值、object类与对象

    一.成员变量初始值 1.测试 class Test06_Num{ //定义一个数据类//在类中定义各种类型的变量,但是不给值int i; byte b;short s;long l;float f;d ...

  6. java访问成员变量和方法_如何访问类的成员变量和方法

    如何访问类的成员变量和方法 在Java应用程序中,经常需要访问类的成员变量和方法,以实现程序的功能,请问应该如何访问类的成员变量和方法?在Java中通过类的实例(即对象)点(.)运算符来访问类的成员变 ...

  7. 在python语言中定义私有成员变量的方法是_Python在类中有“私有”变量吗?

    回答(11) 2 years ago python中的私有变量或多或少是一个hack:解释器故意重命名变量 . class A: def __init__(self): self.__var = 12 ...

  8. 为什么静态成员函数可以访问私有成员变量?(访问控制是针对类而不是针对对象)

    访问控制是针对类而不是针对对象 先看几个标准定义 A member of a class can be - private; that is, its name can be used only by ...

  9. Java定义一个点日期MyDate,包含三个成员变量year、month、day 表示年、月、日,每个属性对应get和set方法,最后printDate()方法,按照“yyy~mm~dd”的形式输出

    public class MiDiXi {//方法一:main方法中调用输出方法printDate() int year;int month;int day;void getYear(int y,in ...

  10. 先设计一个基本账户类,再通过继承基本账户类设计一个储蓄账户类,储蓄账户类中增加密码、地址、最小余额和利率等成员变量,并增加一些银行账户经常用到的成员函数。

    要求: (1) 类中的成员函数具有输入.输出储户上述信息的功能: (2) 将账号设计成不可更改: (3) 修改密码时要提供原始密码. 开发工具vc6.0++ #include <iostream ...

最新文章

  1. C/C++包管理工具Conan简介
  2. android 自定义view画表格,Android自定义View实现课程表表格
  3. wxpython界面切换_wxpython中的图形用户界面
  4. DevSecOps简介(二)
  5. 爱因斯坦求和约定在Python扩展库Numpy中的实现
  6. 在前台或会员中心获取表单向导里提交的数据
  7. ai怎么做盒子效果图_AI教程:打造一个逼真的包装盒
  8. 第二次作业—时事点评
  9. 绘制logo软件-AI(illustrator)
  10. JS中的对象以及在web前端的应用
  11. POJ - 1733 带权并查集 模运算 利用map进行离散化 题目没看全导致疯狂WA
  12. 《英语语法新思维初级教程》学习笔记(九)进行时态
  13. 硕盟Type-C智能10合一多功能拓展坞|硕盟Type-C转换器
  14. 计算机硬盘写入量,如何查询固态硬盘SSD的总写入量?
  15. PHP流量卡发货查单系统源码 流量卡物流发货运单号查询平台 一键安装版
  16. Github Actions - 实现百度贴吧自动签到
  17. 朋少教你合理进行内部链接优化布局
  18. Vue.js中$refs{}获取DOM元素
  19. Mockito verify Junit5集成 Mockito
  20. python实现树莓派开机自动发送IP到指定邮箱

热门文章

  1. 新浪云 连接mysql数据库_新浪云php与java连接MySQL数据库
  2. phpnow运行本地php文件,使用PHPnow搭建本地wordpress
  3. 简单三个步骤网站建设
  4. ppt圆形箭头怎么画
  5. 使用PPT画图,取消自动选点(自动吸附点)解决方案
  6. 攻克银联QPBOC L2认证的最后两个不过的案例(POS与卡片的数据交互分析)
  7. iptables 报错 MASQUERADE':No such file or directory
  8. 电脑如何恢复已删除文件 如何恢复被删除的数据
  9. 纯CSS实现播放暂停按钮变形动画
  10. Windows 10桌面空白处鼠标右键转圈