Java核心技术卷1——第四章上
对象与类
-
面向对象设计概述
-
结构化程序设计
-
算法第一(确定如何操作数据)
-
数据结构第二(确定如何组织数据)
-
OOP
-
数据第一
-
操作数据的算法
-
web浏览器的例子
-
过程=2000个过程
-
面向对象=100个类*20个方法
-
给定对象数据出错,只需检查访问这数据项的20个方法
-
类
-
构造对象的模板或蓝图
-
创建类的实例
-
由类构造对象的过程
-
封装(数据隐藏)
-
数据与行为组合在一个包
-
对对象使用者隐藏数据的实现方式
-
阻止其他类的方法直接访问自己的实例域
-
程序仅通过对象的方法和对象数据进行交互
-
”黑盒“
-
重用性和可靠性
-
改变存储数据的方式
-
不改变操作数据的方法,其他对象不会知道或介意所发生的变化
-
OOP使用户自定义Java类轻而易举。
-
类可以通过扩展另一个类来建立
-
Object超类
-
对已有类扩展
-
新类有其全部属性和方法
-
只需要提供新方法和数据域
-
叫做继承
-
实例域
-
对象上的数据
-
特定类对象有一组特定实例域值
-
这些值的集合叫做对象的当前状态
-
对对象发送一个消息,其状态就可能改变
-
方法
-
操纵数据的过程
-
对象
-
三个主要特性
-
对象的行为
-
可施加操作/方法
-
对象的状态
-
施加操作后如何响应
-
对象的标识
-
如何辨别相同行为和状态的不同对象
-
同一类的对象实例
-
支持相同行为——家族相似性
-
可调用方法
-
描述当前特征的信息(对象状态)
-
随时间改变——调用方法实现
-
不调用方法改变——封装性遭到破坏
-
不能完全描述一个对象
-
唯一身份(对象的标识)
-
每个对象都不同
-
对象和对象引用不是一个概念
-
特性间影响
-
状态决定行为
-
行为改变状态
-
识别类
-
寻找名词
-
类
-
类
-
对象——参数
-
寻找动词
-
方法
-
类之间关系
-
依赖(uses-a)
-
需要访问a对象的xx状态
-
b操纵a
-
应减少使用(耦合度应最小)
-
聚合【关联】(has-a)
-
包含a对象
-
继承(is-a)
-
包含a的方法和属性
-
还有自带的方法属性
-
-
使用现有类
-
对象和对象变量
-
构造对象、指定初始状态、施加方法
-
构造器
-
构造并初始化对象
-
名字与类名相同
-
将方法应用于新构造的对象上
-
String s = new Date().toString()
-
构造对象仅使用了一次
-
建议把对象存对象变量里
-
对象变量
-
存放在栈
-
不能直接引用对象方法,要先赋对象
-
初始化
-
new Object()
-
null
-
new返回对象的引用
-
Date birth;//相当于Date* birth;(c++)
-
java中指针没有初始化,会产生运行时错误
-
对象
-
存放在堆
-
对象的拷贝
-
clone方法
-
c++:
-
拷贝型构造器和复制操作符
-
Date类
-
描述时间点
-
其特定状态——时间点
-
构造器
-
Date now = new Date();
-
toString方法
-
String now = new Date().toString();
-
返回日期的字符串
-
比较时间
-
a.before(b);//true/false
-
a.after(b);//true/false
-
GregorianCalendar类
-
日历表示法
-
更通用的Calendar类(扩展后的)
-
描述了日历的一般属性
-
Calendar类常量
-
构造器
-
new GregorianCalendar()
-
对象构造时的日期和时间
-
new GregorianCalendar(1999,11,31)
-
提供年月日构造一个表示某个特定日期午夜的日历对象
-
月份从0开始计数,11表示12月
-
new GregorianCalendar(1999,Calendar.DECEMBER,31)
-
Calendar.DECEMBER常量表示
-
new GregorianCalendar(1999,Calendar.DECEMBER,31,23,59,59)
-
设置时间
-
更改器方法和访问器方法
-
从封装的GregorianCalendar对象获得年月日
-
get方法
-
GregorianCalendar now = new GregorianCalendar();
-
int mouth = now.get(Calendar.MOUTH);
-
int weekday = now.get(Calendar.DAY_OF_WEEK);
-
get仅访问实例域,不改变实例域,称为访问器方法
-
改变对象状态
-
set方法
-
now.set(Calendar.Year,2001);
-
now.set(Calendar.MOUTH,Calendar.APRIL);
-
now.set(Calendar.DAY_OF_MOUTH,15);
-
now.set(2001,Calendar.APRIL,15);//设置年月日
-
add方法
-
now.add(Calendar.MOUTH,3)//为日期对象增加天数、星期数、月份,如果传递的是负值,日期向后移
-
set和add改变了实例域,称为更改器方法
-
Date类和GregorianCalendar类转换
-
获得时间点
-
Date time = calendar.getTime();
-
设置时间点
-
calendar.setTime(date);
-
年月日——》包含这个时间值的date对象
-
GregorianCalendar calendar = new GregorianCalendar(year,month,day);
-
Date hireDay = calendar.getTime();
-
获得date对象的年月日信息
-
GregorianCalendar calendar = new GregorianCalendar();
-
calendar.setTime(hireDay);
-
int year = calendar.get(Calendar.YEAR);
package s_3_6;
import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CalendarTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
GregorianCalendar d = new GregorianCalendar();
int today = d.get(Calendar.DAY_OF_MONTH);//day
int month = d.get(Calendar.MONTH);//月份-1
d.set(Calendar.DAY_OF_MONTH, 1);//1号
int weekday = d.get(Calendar.DAY_OF_WEEK);//星期+1
//System.out.println(d.get(Calendar.DAY_OF_MONTH));
int firstDayOfWeek = d.getFirstDayOfWeek();//星期天1
int indent =0;//上个星期天到1号的天数
while(weekday != firstDayOfWeek) {//获取1号与前一个星期天的天数
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(" ");//4字节
d.set(Calendar.DAY_OF_MONTH,1);
//month = d.get(Calendar.MONTH);//月份-1
//System.out.println("month"+month);
do {
//print day
int day = d.get(Calendar.DAY_OF_MONTH);
System.out.printf("%3d", day);
//mark current day with *
if(day == today)
System.out.print("*");
else System.out.print(" ");
//advance d to the next day
d.add(Calendar.DAY_OF_MONTH, 1);
weekday = d.get(Calendar.DAY_OF_WEEK);
//start a new line at the start of the week
if(weekday==firstDayOfWeek) System.out.println();
}while(d.get(Calendar.MONTH)==month);
//print final end of line if necessary
if(weekday!=firstDayOfWeek) System.out.println();
}
}
-
用户自定义类
-
静态域与静态方法
-
方法参数
-
对象构造
-
包
-
类路径
-
文档注释
-
类设计技巧

浙公网安备 33010602011771号