Java---对象与类的封装
一、类和对象:
package cn.hncu.Myclasslearn;
/**
*
* @author hncu_chx
*
* Mylove amin
*/
/**类是一种数据类型,声明一个类就是定义了一个数据类型。
类的实例(instance)是类的取值,对象就是类的变量,一个对象能引用一个实例,
就像一个int变量i能够保存int类型的一个常数。
声明对象:
类 对象
MyDate d1;//声明d1是MyDate类的一个对象
**/
public class MyDate {//类声明
int year;
int month;
int day;//成员变量
void set(int y,int m,int d){//成员方法,设置日期值
year=y;
month=m;
day=d;
}
private void set(MyDate d) { //将当前对象值设置为参数值,重载
set(d.year,d.month,d.day); //调用重载的同名成员方法
}
@Override
public String toString() { //返回中文日期字符串
return year + "年" + month + "月" + day + "日";
}
public static void main(String[] args) {
MyDate d1 = new MyDate(); //声明对象、创建实例、引用赋值
d1.set(2012, 1, 1); //调用类成员方法
MyDate d2 = d1; //对象引用赋值
System.out.println("d1:"+d1.toString()+",d2:"+d2.toString());
d2.month = 10; //修改实例成员变量值
System.out.println("d1:"+d1+",d2:"+d2); //输出对象字符串描述,默认调用toString()
d2 = new MyDate(); //创建另一个实例
d2.set(d1);
System.out.println("d1:"+d1+",d2:"+d2);
}
}
程序运行图片:
二、类的封装
package cn.hncu.Myclasslearn;
/**
*
* @author hncu_chx
*
* Mylove amin
*/
public class MyDate_2 {
private int year,month,day; //私有成员变量
private static int thisYear; //当前年份,私有化静态成员变量
static{
thisYear = 2012;
}
public MyDate_2(int year,int month,int day){ //构造方法,指定日期
this.set(year,month,day); //调用本类的成员方法
}
public MyDate_2(){ //无参数构造方法,指定默认日期,重载
this(1970,1,1); //调用本类已声明的其他构造方法
}
public MyDate_2(MyDate_2 d){ //拷贝构造方法,日期通参数,重载
this.set(d);
}
private void set(int year, int month, int day) { //设置日期值,算法不全
this.year = year;
this.month = (month>=1&&month<=12)?month:1;
this.day = (day>=1&&day<=31)?day:1; //this引用不能省略
}
private void set(MyDate_2 d) { //设置日期值,重载
set(d.year,d.month,d.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 equals(MyDate_2 d){ //比较当前日期值与d是否相等
//this指代调用当前方法的对象
return this==d||d!=null&&this.year==d.year&&this.month==d.month&&this.day==d.day;
}
public static int daysDfMonth(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_2.isLeapYear(year)?29:28;
default : return 0;
}
}
public int daysOfMonth(){//返回当月天数
return daysDfMonth(this.year, this.month);
}
public void tomorrow(){//当前日期改为之后一天日期
this.day++;
if(this.day>this.daysOfMonth()){
this.day=1;
this.month++;
if(this.month>12){
this.month=1;
this.year ++;
}
}
}
public MyDate_2 yestoday(){ //返回当前日期的前一天日期
MyDate_2 date = new MyDate_2(this);//进行拷贝构造方法,创建实例,没有改变this
date.day--;
if(date.day==0){
date.month--;
if(date.month==0){
date.month=12;
date.year--;
}
date.day = daysDfMonth(date.year, date.month);
}
return date;//返回对象date引用的实例
}
}
package cn.hncu.Myclasslearn;
/**
*
* @author hncu_chx
*
* Mylove amin
*/
public class MyDate_ex {
public static void main(String[] args) {
System.out.println("今年是"+MyDate_2.getThisYear()
+",闰年?"+MyDate_2.isLeapYear(MyDate_2.getThisYear()));
MyDate_2 d1 =new MyDate_2(2012, 12, 31);
MyDate_2 d2 =new MyDate_2(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"+d1+"的昨天是 "+(d2=d1.yestoday()));
}
}
/**日期类的设计问题讨论
* 虽然用3个整数表示一个日期符合人的思维习惯,但很多运算实现困难,如判断日期是否有效、
* 求多少天之前/之后的日期等。
* 本程序中的MyDate_2中的set()方法的算法不完整,其一,仍然会产生诸如“2013-2-30”之类的
* 错误日期;其二,将“2013-12-32”之类的错误日期改为“2013-12-1”,虽然得到了一个正确
* 日期,但这是一种不好的程序设计习惯,因为“2013-12-1”并不是调用者希望的数据,而且调用
* 者并不知道数据被修改了。正确的处理方法应该是抛出异常,详见以后的博客。
* 本题这样设计知识为了演示类的封装性。
* */
程序运行图片:
Java---对象与类的封装的更多相关文章
- Java-Runoob:Java 对象和类
ylbtech-Java-Runoob:Java 对象和类 1.返回顶部 1. Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 ...
- (五)Java 对象和类
Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 消息解析 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例,有状态和行为. ...
- Java 教程 (Java 对象和类)
Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例(对象不是找个女朋友 ...
- JavaSE基础(十二)--Java 对象和类
Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例(对象不是找个女朋友 ...
- JAVA对象和类
Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 Java中的类 类可以看成是创建Java对象的模板. 通过下面一个简单的类来理解下Java中类的定 ...
- Java面向对象(类、封装)
面向对象 今日内容介绍 u 面向对象 u 封装 第1章 面向对象 1.1 理解什么是面向过程.面向对象 面向过程与面向对象都是我们编程中,编写程序的一种思维方式. l 面向过程的程序设计方式,是遇到一 ...
- 重新学习Java——对象和类(一)
之前通过记笔记的方法,对于<Java核心技术>这本书的前一章进行了重新的复习,感觉效果很好,比单独看书带来了更好的复习效果,了解了很多以前不是很注意的一些细节,但是在一些自己较为熟悉的地方 ...
- Java对象转xml报文和xml报文转Java对象帮助类
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marsha ...
- java中关于类的封装与继承,this、super关键字的使用
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5454849.html. this关键字: this代表当前对象,它有以下几种用途: 1.本类 ...
- java对象和类学习
定义对象的类: 一个对象的状态(属性或特征)是指那些具有他们当前值的数据域 一个对象的行为是由方法定义的,调用对象的方法就是完成对象的一个动作 使用一个通用类来定义同一类型的对象.类是一个模板,一个对 ...
随机推荐
- 网站分析统计JS源码分享
之前公司做了一个分析云平台,用来跟踪收集海量的用户行为的相关数据,供运营人员实时监控网站访问量,统计PV,UV,独立IP,访问时段,访问时长,热点追踪等多类信息,我用JS写了一个小插件,只需要再页面加 ...
- 明解C语言,练习13-3,从文件中读入个人信息,按身高排序后显示
#include <stdio.h> #define NUMBER 6 #define F_PATH "D:\\C_C++\\ec13-3\\hw.dat" typed ...
- 异步IO简介
最近想学习一下libevent,就先翻译一下libevent的官方文档吧. 英文原文链接:http://www.wangafu.net/~nickm/libevent-book/01_intro.ht ...
- 【POJ3461】【KMP】Oulipo
Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...
- C++最后课程项目总结
第一次独立完成的C++小项目,40小时 + 5小时Update + 8小时Linux移植. 过程: 过程非常认真,一个星期主要就是忙这个,为了完成某个部分,有时饭都推迟吃,连续对着电脑10几个小时很累 ...
- Linux内存点滴:用户进程内存空间
原文出处:PerfGeeks 经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的.VIRT , Virtual Image (kb)RES, Residen ...
- jquery的select元素和option的相关操作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 怎样使CSS3中的animation动画当每滑到一屏时每次都运行
这个得结合js来做的.比如这里有3个层,js判断滚动到当前层位置的时候给其加上一个class即可,而加的这个class就是带css3执行动画的 class <div id="a1&qu ...
- js 去除字符串开头或者前几个字符。slice 也可以用于截取某一部分
摘草自w3 slice() 方法可从已有的数组中返回选定的元素. 语法 arrayObject.slice(start,end) 参数 描述 start 必需.规定从何处开始选取.如果是负数,那么它规 ...
- YII 验证功能
YII 表单的验证可以在module目录下的xxx.php里面定义验证方法,设定需要验证的字段就行 //用户表单验证,在模型里面设置一个方法,具体表单验证规则 public functi ...