Java-万物皆对象

 

 终于到了对象这里。面向对象程序设计(简称OOP),Java是完全面向对象的。万物皆对象,emmm~那是不是说,不必担心没有对象了捏?

一、使用面向对象思想描述现实世界。

基本步骤:

1、发现类

如下图:可以将下图的人分为几类

 

 

人类/科学家类/演员类/逗比类

2、找出属性(名词)

姓名、性别、职业、年龄、爱好……

3、找出行为(动词)

吃饭、说话、表演……

数据抽象:是数据和处理方法的结合

二、使用类图描述类

作用:直观容易理解

参考工具:StarUML、Astah UML

     

 

 

 

三、类与对象的关系

类:是抽象概念,仅仅是模板,比如说“演员”、“总统”。类是构造对象的模板和蓝图,用于描述一种数据类型。

对象:是你能够看到摸到的具体实物。

拿小甜饼举例,将类想象成制作小甜饼的机器,而对象就是一个小甜饼。由类构造(construct)对象的过程称作为创建类的实例(instance)。

如图:左边是类,右边是对象

         

 

 

补充:怎么另一个类中怎么访问其他的类private的变量的方法

  1. 在另一个类中,是无法访问其他类的私有属性或方法的。
  2. 在内部类可以直接访问。
  3. 可以通过定义方法的形式,让内部类调用,以获得方法的返回值。

四、类之间的的关系

常见关系有:依赖、聚合、继承

依赖(uses-a):如果说一个类的方法操纵另一个类的对象,就说一个类依赖于另一个类,我们应该尽可能让相互依赖的类减少,用软件工程的术语来说,就是让类之间的耦合度最小。

聚合(has-a):类A的对象包含类B的对象。

继承(is-a):特殊与一般的关系。

 

 

五、预定义类

在java中,没有类就无法做任何事情,然而,并不是所有类都具有面向对象特征,例如:Math类。

1、对象与对象变量:想要使用对象就必须先构造对象,并指定其初始状态。

区别:Date deadline;//deadline does not refer to any object,

实际上等同于c++中:Date* deadline;

定义了一个对象变量deadline,它可以引用Date类型的对象。但是,一定要认识到:变量deadline不是一个对象,也没有引用对象。首先要初始化这个变量:deadline=new Date();如果是deadline=null;表明这个对象目前没有引用任何对象。

两个变量引用一个对象:(一个对象变量没有包含实际包含一个对象,而仅仅引用一个对象。在Java中任何对象变量的值都是对存储在另外一个地方的一个对象的引用。New操作符的返回值也是一个引用。)

 

 

在c++中,稍不小心就可能创建一个错误的指针,或者造成内存溢出。而在Java语言中,这些问题都不存在,如果使用一个没有初始化的指针,会报错,而不是随机运行的结果;同时,不必担心内存的管理问题,垃圾收集器将会处理相关的事宜。

2、Java 类库中的 LocalDate 类

时间是用距离一个固定时间点的毫秒数(可正 可负) 表示的, 这个点就是所谓的纪元( epoch), 它 是 UTC 时间 1970 年 1 月 1 日 00:00:00。 UTC 是 Coordinated Universal Time 的缩写,与大家熟悉的 GMT ( 即 Greenwich Mean Time, 格林威治时间)一样,是一种具有实践意义的科学标准时间。

不要使用构造器来构造 LocalDate 类的对象。

Local Date.now() 会构造一个新对象,表示构造这个对象时的日期。

可以提供年、 月和日来构造对应一个特定日期的对象: LocalDate.of(1999, 12, 31);

当然, 通常都希望将构造的对象保存在一个对象变量中: LocalDate newYearsEve = Local Date.of(1999, 12, 31);

一旦有 了一个 LocalDate 对象, 可以用方法 getYear、 getMonthValue 和 getDayOfMonth 得到年、月和日:

 int year = newYearsEve.getYearO; // 1999

 int month = newYearsEve.getMonthValueO; // 12

int day = newYearsEve.getDayOfMonth(); // 31

看起来这似乎没有多大的意义, 因为这正是构造对象时使用的那些值。不过,有时可能 某个日期是计算得到的,你希望调用这些方法来得到更多信息。例如, plusDays 方法会得到 一个新的 LocalDate, 如果把应用这个方法的对象称为当前对象,这个新日期对象则是距当 前对象指定天数的一个新日期:

LocalDate aThousandDaysLater = newYearsEve.piusDays(1000);

 year = aThousandDaysLater.getYearO;// 2002

month = aThousandDaysLater.getMonthValueO; // 09

day = aThousandDaysLater.getDayOfMonth(); // 26

LocalDate 类封装了实例域来维护所设置的日期。如果不查看源代码, 就不可能知道类内 部的日期表示。当然, 封装的意义在于,这一点并不重要, 重要的是类对外提供的方法。

3、更改器方法与使用器方法

1、访问器方法(accessor method):只访问对象而不修改对象的方法。例如:LocalDate.getYear和GregorianCalendar.get。

LocalDate aThousandDaysLater = newYearsEve.plusDays(1000);调用newYearEve.plusDays之后不会改为1000之后的日期,实际上plusDays方法没有更改调用这个方法的对象,而是,plusDays方法会产生一个新的LocalDate对象,然后把这个新对象赋给aThousandDaysLater变量,原来对象不做任何改动。

2、更改器方法(mutator method):对象的方法会改变

有一个GregorianCalendar方法是更改器方法,可以用于增加1000天:

CregorianCalendar someDay = new CregorianCalendar(1999, 11, 31); //注意月份是从0-11

someDay.add(Calendar.DAY_0F _M0NTH, 1000);

 注:在c++中,带有const后缀的方法是访问器方法;默认为更改器方法。但是,在Java语言中访问器和更改器没有明显的语法区别。

 下面是对LocalDate的一些应用:

 

import java.time.LocalDate;
/**
*LocalDate使用
*@author:Archer-LCY
*@date:2018年2月2日下午10:50:32
*/
public class CalendalTest {
	public static void main(String[] asgr) {
		
		/**获取当前年月日*/
		System.out.println("有关年的:");
		System.out.printf("LocalDate().getYear(当前年份数字,既可以用s也可以用d格式输出):%d\n", LocalDate.now().getYear());
		System.out.printf("LocalDate().getDayOfYear(当前是这一年的第几天):%s\n", LocalDate.now().getDayOfYear());
		System.out.println("日期.lengthOfYear()计算该年的天数"+LocalDate.now().lengthOfYear());
		
		System.out.println("\n有关月的:");
		System.out.printf("LocalDate().getMonthValue(当前月份数字):%d\n",LocalDate.now().getMonthValue());
		System.out.printf("LocalDate().getMonth(当前月份英文大写):%s\n", LocalDate.now().getMonth());
		System.out.printf("LocalDate().getDayOfMonth(当前月中第几天份数字,既可以用s也可以用d格式输出):%d\n", LocalDate.now().getDayOfMonth());
		System.out.println("日期.lengthOfMonth()计算该月的天数"+LocalDate.now().lengthOfMonth());
		
		System.out.println("\n有关日的:");
		System.out.printf("LocalDate().getDayOfWeek(当前星期几大写英文):%s\n", LocalDate.now().getDayOfWeek());
		System.out.printf("LocalDate().getEra(得到这个日子适用的年代):%s\n", LocalDate.now().getEra());
		
		System.out.println("\n创建时间:");
		//结合这个时期和时间创建一个时间
		/*	atTime(int hour, int minute, int second, int nanoOfSecond)
结合这个日期和时间来创建一个LocalDateTime。*/
		System.out.printf("LocalDate().atTime(结合这个时期和时间创建一个时间):%s\n", LocalDate.now().atTime(19,10,10,99));
		
		/**比较两个时间*/
		System.out.println("\n两个时间之间的比较:");
		LocalDate d1=LocalDate.of(2000, 2, 3);
		LocalDate d2=LocalDate.of(2018, 2, 2);
		//1、检查d1日期是否在d2日期之后
		System.out.println("检查d1:2000- 2-3日期是否在d2:201-2-2日期之后:"+d1.isAfter(d2));
		//2、检查d1日期是否在d2日期之前
		System.out.println("检查d1:2000- 2-3日期是否在d2:201-2-2日期之前:"+d1.isBefore(d2));
		//3、检查两个日期是否相等
		System.out.println("检查d1:2000- 2-3日期是否在d2:201-2-2日期是否相等:"+d1.isEqual(d2));
		//4、判断是否是闰年
		System.out.println("LocalDate.now().isLeapYear():(判断当前年份是不是闰年)"+LocalDate.now().isLeapYear());
		System.out.println("日期.isLeapYear:(判断"+d1+"年是不是闰年)"+d1.isLeapYear());
		
		
		
		

		
	}
}

运行结果如下图:

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值