DAY10-万物皆对象-2018-2-2
许久没有写了,虽然每天都有在学,但是学的东西也少了,后面难度慢慢加大,学习速度也是变慢了。这是许多天积累下来的笔记,从第一次接触对象,到慢慢去了解,现在处于还待深入了解的状态。万物皆对象,那是不是说没有对象的小伙伴不必担心了呢?
万物皆对象
终于到了对象这里。面向对象程序设计(简称OOP),Java是完全面向对象的。
一、使用面向对象思想描述现实世界。
基本步骤:
1、发现类
如下图:可以将下图的人分为几类
人类/科学家类/演员类/逗比类
2、找出属性(名词)
姓名、性别、职业、年龄、爱好……
3、找出行为(动词)
吃饭、说话、表演……
数据抽象:是数据和处理方法的结合
二、使用类图描述类
作用:直观容易理解
参考工具:StarUML、Astah UML
三、类与对象的关系
类:是抽象概念,仅仅是模板,比如说“演员”、“总统”。类是构造对象的模板和蓝图,用于描述一种数据类型。
对象:是你能够看到摸到的具体实物。
拿小甜饼举例,将类想象成制作小甜饼的机器,而对象就是一个小甜饼。由类构造(construct)对象的过程称作为创建类的实例(instance)。
如图:左边是类,右边是对象
补充:怎么另一个类中怎么访问其他的类private的变量的方法
- 在另一个类中,是无法访问其他类的私有属性或方法的。
- 在内部类可以直接访问。
- 可以通过定义方法的形式,让内部类调用,以获得方法的返回值。
四、类之间的的关系
常见关系有:依赖、聚合、继承
依赖(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语言中访问器和更改器没有明显的语法区别。
上一篇: 内存条坏掉后电脑出现的情况分析
下一篇: 特朗普将禁止TikTok在美国运营