面向对象的延伸与Java内部定义类的应用
识别类
- 传统的过程化程序设计,必须从顶部的main函数开始编写程序,在面向对象程序设计时没有所谓的"顶部".首先从设计类开始,然后再往每个类中添加方法.
- 识别类的规则是在分析问题的过程中寻找名词,而方法对应着动词.
- 例如在订单处理系统中,有这样一些名词:
- 商品(Item)
- 订单(Order)
- 送货地址(Shopping address)
- 付款(Payment)
- 账户(Account)
- 接下来,查看动词:商品被添加到订单中,订单被发送或取消,对于每一个动词如:"添加","发送","取消",都要标识出主要负责完成的动作.
- 当然这些原则,只是一个经验,在创建类时,完全取决于个人的开发经验.
类之间的关系
- 在类之间,最常见的关系是
- 依赖
- 聚合
- 继承
- 依赖:如果一个类的方法操纵另一个类的对象,就是一个类依赖于另一个类.
应该尽可能减少相互依赖的类的存在,如果类A不知道B的存在,它就不会关心类B的任何改变(这意味着B的改变不会导致A产生任何bug).用软件工程术语来说,就是让类之间的耦合度最小.
- 聚合:是一种具体且容易理解的关系,例如一个Order对象包含一些Item对象.聚合关系意味着类A的对象包含类B的对象.
- 继承:是一种用于表示特殊与一般关系的.例如RushOrder类由Order类继承而来,在具有特殊的RushOrder类中包含了一些用于优先处理的特殊方法,以及一个计算运费的不同方法;而其他的方法,如添加商品,生成账单都是从Order类中继承而来的.一般而言,如果类A扩展类B,类A不但包含从类B继承的方法.
使用预定义类
- 在Java中,没有类就无法做任何事,并不是所有的类都具有面向对象特征,例如:Math类,在程序中,可以使用Math类的方法,并只需要知道方法名和参数,而不必了解它的具体实现过程,这正好似封装的关键所在,但遗憾的是Math类中只封装了功能,不需要也不必隐藏数据.由于没有数据,因此也不必担心生成对象以及初始化实例.
对象与对象变量
- 要想使用对象,就必须首先构造对象,并指定其初始状态,然后,对对象应用方法.
- 在Java程序设计语言中,使用构造器(constructor)构造新实例,构造器是一种特殊的方法,用来构造并初始化对象.下面看一个例子,在标准Java库中包含一个Date类.它的对象将描述一个时间点.
- 构造器的名字应该与类名相同.因此Date类的构造器名为Date.要想构造一个Date对象.需要在构造器前面加上一个new操作符.
new Date(),这个表达式构造一个新对象,这个对象呗初始化为当前的日期和时间. - 如果需要的话,也可以将这个对象传递给一个方法:
System.out.println(new Date());. - 或者,也可以将一个方法应用于刚刚创建的对象,Date类中有一个
toString()方法,这个方法将返回日期的字符串描述,下面的语句可以说明如何将toString方法应用于新构造的Date对象上.String s = new Date().toString();,构造的对象仅适用了一次,通常,希望构造的对象可以多次使用时,需要将对象存放在一个变量中:Date birthday = new Date();. - 在对象与对象变量之间存在着一个重要的区别,例如:
Date deadline;定义了一个对象变量deadline,它可以引用Date类型的对象.但是,一定要注意:变量deadline不是一个对象,实际上也没有引用对象.此时,不能将任何Date方法应用于这个变量上.
注意,一个对象要想使用,必须初始化该对象,使用构造器去构造该对象.
一定要认识到:一个对象变量并没有包含一个对象,只是引用了一个对象.
- 在Java中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用,new操作符的返回值也是一个引用.下列语句:
Date deadline = new Date();有两个部分,表达式new Date()构造了一个Date类型的对象,并且它的值是对新创建对象的引用,这个引用存储在变量deadline中. - 如果将一个方法应用于一个值为null的对象上,那么会产生错误.
birthday = null;
String s = birthday.toString(); //runtime error!
局部变量不会自动初始化为null,而必须通过调用new或设置为null进行初始化.
Java类库中的LocalDate类
- LocalDate类是用日历表示法表示时间的类.
将时间与日历分开是一种很好的面向对象设计.
- 不要使用构造器来构造LocalDate类,实际上,应当使用静态工厂方法代表构造器.
LocalDate.now()会构造一个新对象,表示构造这个对象时的日期.可以提供年月日来构造特定的日期对象LocalDate.of(1999,12,31).使用对象变量接收这个对象:LocalDate newYearsEve = LocalDate.of(1999,12,31);. - 一旦有了一个LocalDate对象,可以用方法getYear,getMonthValue和getDayOfMonth得到年月日:
int year = newYearsEve.getYear();
int month = newYearsEve.getMonthValue();
int day = newYearsEve.getDayOfMonth();
- 更改器方法与访问器方法
- 更改器方法是修改对象的状态.
- 访问器方法是获取对象的状态.
- 案例:使用日历类
public class CalendarTest {
public static void main(String[] args) {
LocalDate data = LocalDate.now();
int month = data.getMonthValue();
int today = data.getDayOfMonth();
data = data.minusDays(today-1);
DayOfWeek weekday = data.getDayOfWeek();
int value = weekday.getValue();
System.out.println("Mon Tue Wed Thu Fri Sat Sun");
for (int i = 0; i < value; i++) {
System.out.print(" ");
while(data.getMonthValue()==month)
{
System.out.printf("%3d",data.getDayOfMonth());
if(data.getDayOfMonth()==today)
{
System.out.print("*");
}
else{
System.out.print(" ");
}
data=data.plusDays(1);
if(data.getDayOfWeek().getValue()==1) {
System.out.println();
}
}
if(data.getDayOfWeek().getValue()!=1)
{
System.out.println();
}
}
}
}
面向对象的延伸与Java内部定义类的应用的更多相关文章
- 数组中存放对象之java中定义类数组存放类
public class ClassArrayDemo { int age; String name; ClassArrayDemo(int age, String name) { this.age ...
- 13.C# 定义类成员
1.定义字段 class MyClass { public int MyInt; } 字段可以用readonly修饰,表示该字段只能在构造函数中赋值,还可以用static表示该字段是静态字段 clas ...
- 深入理解Java虚拟机(七)——类文件结构
Java的无关性 由于计算机领域中有很多操作系统和硬件平台同时在竞争,所以,很多编程语言的程序设计会与其运行的平台和操作系统产生耦合,这样就大大增加了程序员的工作,为了适应不同的平台,需要修改很多代码 ...
- 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器
Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...
- JavaScript 定义类的最佳写法——完整支持面向对象(封装、继承、多态),兼容所有浏览器,支持用JSDuck生成文档
作者: zyl910 [TOC] 一.缘由 由于在ES6之前,JavaScript中没有定义类(class)语法.导致大家用各种五花八门的办法来定义类,代码风格不统一.而且对于模拟面向对象的三大支柱& ...
- [Java入门笔记] 面向对象编程基础(一):类和对象
什么是面向对象编程? 我们先来看看几个概念: 面向过程程序设计 面向过程,是根据事情发展的步骤,按进行的顺序过程划分,面向过程其实是最为实际的一种思考方式,可以说面向过程是一种基础的方法,它考虑的是实 ...
- java定义类 对象,引用,指针
java是根据面向对象编程,因此有类和对象的概念,类分为普通类与抽象类. 一.定义类 类由N个 构造器 成员变量 方法组成,可以不定义,也可以根据语法定义N个. [修饰符] class 类名{ 构 ...
- 第四节:详细讲解Java中的类和面向对象思想
前言 大家好,给大家带来详细讲解Java中的类和面向对象思想的概述,希望你们喜欢 类和面向对象 在Java中怎样理解对象,创建对象和引用:什么是引用,对于基础学习的同学,要深入了解引用.示例:Stri ...
- Java中主类中定义方法加static和不加static的区别
Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在主方法调用(类名.方法),后者必须先实例化后用实例调用) 知识点:1.Getter and Setter 的应用 ...
随机推荐
- babel 与 ast
什么是 babel Babel 是一个工具链,主要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中. 什 ...
- maven 报错 Failed to execute goal on project ...: Could not resolve dependencies for project ...
昨天在研究 项目 遇到这样一个问题 可以看到 上面有三个 模块 jeecg-boot-base-common .jeecg-boot-module-system .jeecg-boot-modules ...
- 如何使用Pytest进行自动化测试
为什么需要自动化测试 自动化测试有很多优点,但这里有3个主要的点 可重用性:不需要总是编写新的脚本,除非必要,即使是新的操作系统版本也不需要编写脚本. 可靠性:人容易出错,机器不太可能.当运行不能跳过 ...
- 为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate
一.前言 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template. Hibe ...
- 当layui与分页相遇--bootstrap何去何从
用了一段时间,感觉layui比bootstrap 方便了很多.在js操作上比bootstrap减少了许多的代码量. 今天遇到需要前台分页.当然,不是表格,如果是表格的话.使用yalui table和b ...
- Hadoop3.2.0+Centos7三节点完全分布式安装配置
一.环境准备 ①准备三台虚拟机,配置静态IP ②先修改主机名(每个节点统一命名规范) vim /etc/hostname master #重启生效 配置DNS每个节点 vim /etc/hosts 1 ...
- java 深拷贝与浅拷贝机制详解
概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定义的clone方法为深拷贝. (一 ...
- Turtlebot3新手教程:Open-Manipulator机械臂
*本文针对如何结合turtlebot3和Open-Manipulator机械臂做出讲解 测试在Ubuntu 16.04, Linux Mint 18.1和ROS Kinetic Kame下进行 具体步 ...
- C#自定义控件的应用(数据绑定,属性等)
刚刚开始程序设计的码农生涯,也许一些开发工具上的控件可以满足我们的需求,但是随之时间的迁移,我们对控件的呈现形式需求越来越多样化,这个时候就需要我们来自定义控件,我是一个刚刚入职没多久的菜鸟,接触软件 ...
- 循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理
在一些系统中,有时候用户忘记密码,可以通过向自己手机发送动态验证码的方式实现系统登录功能.本篇随笔介绍如何结合后端ABP框架的短信发送和缓存模块的处理,实现手机短信动态码登陆处理. 一般的登录方式,分 ...