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()
              • 构造对象仅使用了一次
              • 建议把对象存对象变量里
      • 对象变量
        • 存放在栈
        • 不能直接引用对象方法,要先赋对象
        • 初始化
          1. new Object()
          2. 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();
       }
}
  • 用户自定义类
  • 静态域与静态方法
  • 方法参数
  • 对象构造
  • 类路径
  • 文档注释
  • 类设计技巧
 
 
 
posted @ 2018-10-09 15:54  Giles_Gu  阅读(207)  评论(0)    收藏  举报