4.2 使用现有类

4.14类之间的关系
1.依赖(“use-a”):一个类的方法操纵另一个类的对象。程序设计时应尽可能将这种关系减至最少,即降低耦合度。

2.聚合(“has-a”):意味着类A的对象包含了类B的对象

3.继承(“is-a”)


4.2.1对象与对象变量
1.要使用对象就必须先构造对象。使用构造器构造新实例。

2.构造器名要与类名相同。例如:Date类的构造器名为Date。要构造一个Date对象要在构造器前加new操作符。如:new Date();

3.将对象传递给一个方法:
System.out.println(new Date());

4.也可以将方法应用于刚创建的对象上:
String s = new Date().toString; //使用“.”来调用方法

5.上面的3和4两个例子所构造的对象只是用了一次,要重复使用构造的对象就要将对象放在一个变量中:
Date birthday = new Date(); //birthday为变量,之后要使用构造的对象只需使用该变量即可,如:String s =birthday.toString;

注意:对象与对象变量的区别,如:Date age; //定义一个对象变量age,它可以引用Date类型的对象,但是age不是一个对象,所以语句:s = age.toStirng 会产生编译错误。必须要先初始化对象变量age,有两种方法:
age = new Age(); //构造新对象初始化变量
age = birthday; //引用已存在的对象

6.一定要认识到一个对象变量没有包含一个对象,仅仅是引用一个对象。
在Java中对象变量的值都是对储存在另一个地方的一个对象的引用。new操作符返回的值也是一个引用。
例如:Date birthday = new Date();
Java对象变量可以看成C的指针;Java中不允许没有初始化的对象变量存在,这就保证了不会产生随机的指针;并且垃圾收集器会处理内存泄漏问题。

4.2.3更改器方法与访问器方法
1、要访问一个类中封装的数据,要先初始化这个对象(new一个对象使其实例化),再调用该类所包含的相应方法来实现。
GregorianCalendar now = newGregorianCalendar();
int month = now.get(Calendar.MONTH);
int weekday = now.get(Calendar.DAY_OF_WEEK);

2、调用set方法改变对象的状态:
deadline.set(Calendar.YEAR, 2012);
deadline.set(Calendar.MONTH, Calendar.APRIL);
deadline.set(Calendar.DAY_OF_MONTH, 15);
(还有一个更简便的设置年月日的方法:dealine.set(2012, Calendar.APRIL, 15);

3、给指定的时间对象增加天数,星期数,月份
deadline.add(Calendar.MONTH, 3);//move dealine by 3 months
如果给定的值是负数,日期向后移。

小结:get方法与set和add方法区别在于,get方法只是查看并返回对象的状态(仅访问实例域不修改的方法称为访问器方法);set和add方法是对对象的状态进行修改(对实例域进行修改的方法称为更改器方法)。
扩展:在C++中带有const后缀的方法是访问器,默认的是更改器;在Java中没有明显的区分,通常访问器方法名前加get,而更改器前加set。

4、如果一直年月日要创建一个包含该事件的Date对象,因为Date对象不知道如何处理日历,所以要构造一个GregorianCalendar对象再调用它的getTime方法:
GregorianCalendar calendar = new GregorianCalendar(year, month, day);
Date hireDay = calendar.getTime();
与之相法,如果要湖区Date对象中的年月日呢?
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(hirDay);
int yeat = calendar.get(Calendat.YEAR);

5、应用GregorianClalendar类的程序显示当前月的日历,效果图为:
(*号表示当前日)
该程序的关键步骤:
(1)
构造一个日历对象,并用当前的时间和日期初始化
GregorianCalendar d = new GregorianCalendar();
int today = d.get(Calendar.DAY_OF_MONTH);
int month = d.get(Calendar.MONTH);
(2)
将d设置为这个月的第一天,并获取这一天为星期几:
d.set(Calendar.DAY_OF_MONTH, 1);
int weekday = d.get(Calendar.DAY_OF_WEEK);
如果这个月第一天为星期日,变量weekday就设置为Calendar.SUNDAY,以此类推。
注意,日历的第一行是缩进的,所以月份的第一天指向相应的星期几。因为每个星期的第一天存在着约定 习惯上的不同,所以要能够随机应变。
Java虚拟机非常注重当前用户的所在地,不同地区存在着不同的格式习惯,包括非星期的起始日以及一周中每天的命名方式。

提示:要看到不同地区的程序输出,在main方法的第一行添加代码:Locale.setDefault(Locale.ITALY);
(3)
用getFirstDayOfWeek方法获取当前地区一周的起始日。为了确定日历第一行的缩进,将日历对象的日减1,直到一周的第一天为止:
int firstDayOfWeek = d.getFirstDayOfWeek();
int indent = 0;
while (weekday != firstDayOfWeek) {
indent++;
d.add(Calendar.DAY_OF_MONTH, -1)
weekday = d.get(Calendar.DAY_OF_WEEK);
}
(4)
输出表示星期几名称的头。调用DateFormatSymbols类方法实现。
String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
getShortWeekdays方法返回用户语种所命名的表示星期几的缩写(例如:英文讲返回“Sun”、“Mon”)数组用星期几做索引,循环打印:
do {
System.out.printf("%4s",weekdayNames[]);
d.add(Calendar.DAY_OF_MONTH, 1);
weekday = d.get(Calendar.DAY_OF_WEEK);
}
while(weekday != firstDayOfWeek);
System.out,println();
(5)
至此已做好打印日历内容的准备了。第一行进行缩进,将日期对象设置为月份的起始日。在循环中用d记录一个月中的每一天。
每次迭代过程打印日期值。若d是当前日期,打印日期值后再打印一个*。每周的第一天,要换行打印。然后将d设置为下一天: d.add(Calendar.DAY_OF_MONTH, 1);
何时结束呢?只要d还指示当月就继续迭代:
do{
....
}
while(d.get(Calendar.MONTH) == month);

(6)

完整源代码

import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;


public class CalendarTest {
	public static void main(String[] args) {
		
		//construct d as currenr date
		GregorianCalendar d = new GregorianCalendar();
		
		//获取当前的月日
		int today = d.get(Calendar.DAY_OF_MONTH);
		int month = d.get(Calendar.MONTH);
		
		//设置d为这个月的第一天,并获取相应的星期几
		d.set(Calendar.DAY_OF_MONTH, 1);
		int weekday = d.get(Calendar.DAY_OF_WEEK);
		
		//获取当前地区一周的起始日
		int firstDayOfWeek = d.getFirstDayOfWeek();
		
		//确定这个月第一行的缩进量
		int indent = 0;
		while (weekday != firstDayOfWeek) {
			indent++;
			d.add(Calendar.DAY_OF_MONTH, -1);
			weekday = d.get(Calendar.DAY_OF_WEEK);
		}
		
		//创建日历表头星期数的名字
		String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
		do {
			System.out.printf("%4s", weekdayNames[weekday]);
			d.add(Calendar.DAY_OF_MONTH, 1);
			weekday = d.get(Calendar.DAY_OF_WEEK);
		} while (weekday != firstDayOfWeek);
		System.out.println();
		
		
		for (int i = 1;i <= indent; i++)
			System.out.print("  ");
		
		d.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1);
		do {
			//开始打印日历
			int day = d.get(Calendar.DAY_OF_MONTH);
			System.out.printf("%3d", day);
			
			//标记当前日期
			if (day == today) {
				System.out.print("*");
			}
			else {
				System.out.print(" ");
			}
			
			//将d设置为下一天
			d.add(Calendar.DAY_OF_MONTH, 1);
			weekday = d.get(Calendar.DAY_OF_WEEK);
			
			//换行打印每周的第一天
			if (weekday == firstDayOfWeek) {
				System.out.println();
			}
		} while (d.get(Calendar.MONTH) == month);
		
		if(weekday != firstDayOfWeek) System.out.println();
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fragstats4.2是一个用于空间格局分析的软件工具,以下是它的使用方法。 首先,下载并安装Fragstats4.2软件。在安装完成后,打开软件。 软件界面分为多个选项卡,分别是“输入”、“分析”、“输出”、“选项”和“帮助”。 在“输入”选项卡中,可以加载要进行格局分析的空间数据。支持的数据型包括栅格(raster)和矢量(vector)数据。可以通过点击“添加数据”按钮,选择文件或文件夹进行加载。 在“分析”选项卡中,可以选择要进行的空间格局分析方法。可以分别选择景观指数(landscape metrics)和空间统计量(spatial statistics)进行分析。选择相应的方法后,点击“计算指标”按钮进行计算。 在“输出”选项卡中,可以设置计算结果的输出路径和格式。可以选择输出为文本文件、Excel文件或图像文件等格式。 在“选项”选项卡中,可以设置分析的参数和选项。例如,可以设置计算的尺度、区域的边界条件、计算指标的型等。 最后,在“帮助”选项卡中可以查看软件的使用帮助,包括软件的介绍、功能说明和常见问题解答等内容。 总结来说,使用Fragstats4.2进行空间格局分析的方法主要包括加载数据、选择分析方法、设置参数和选项,然后进行计算并输出结果。这个软件提供了丰富的功能和选项,使得用户能够灵活地进行空间格局分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值