对象与类

面向对象程序概述

类是构造对象的模板或蓝图。由类构造对象的过程称为创建类的实例。

封装:将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式。对象中的数据称为实例字段,操作数据的过程称为方法。作为一个类的实例,特定对象都有一组特定的实例字段值。这些值的集合就是这个对象的当前状态。

继承:扩展一个类来建立另外一个类的过程。在扩展一个已有类时,这个扩展后的新类具有被扩展的类的全部属性和方法。

每个对象都有一个唯一的标识。

类之间的关系

  • 依赖:一个类的方法使用或者操纵另一个类的对象。
  • 聚合:一个类的对象包含着另一个类的一些对象。
  • 继承:一个类扩展了另一个类。

使用预定义类

对象与对象变量

要想使用对象,首先必须构造对象,并指定其初始状态。然后对对象应用方法。

构造器是一种特殊的方法,用来构造并初始化对象。

构造器的名字应该与类名相同。例如:Date类的构造器名为Date。要想构造一个Date对象,需要再构造器前面加上new操作符,例如:

  1. new Date()

可以将对象传递给一个方法,例如:

  1. System.out.println(new Date());

如果构造的对象需要多次使用,需要将对象存放在一个变量中,例如:

  1. Date birthday=new Date();

注意:对象变量并没有实际包含一个对象,它只是引用一个对象。在Java中,任何对象变量的值都是对存储在另外一个地方的某个对象的引用。new操作符的返回值也是一个引用。

  1. public void test3(){
  2. Date birthday = new Date();
  3. birthday=null;
  4. if (birthday==null)
  5. System.out.println(birthday);
  6. }

对象变量设置为null值代表这个对象变量目前没有引用任何对象。

所有Java对象都存储在堆中。当一个对象包含另一个对象变量时,它只是包含着另一个堆对象的指针。

Java类库中的LocalDate类

类库设计者将保存时间与给时间点命名分开。

  • Date类:用来表示时间点。

  • LocalDate类:用大家熟悉的日历表示法表示日期。

    • 不要使用构造器来构造LocalDate类的对象。实际上,应当使用静态工厂方法,它会代表你调用构造器。

      1. LocalDate.now();
      2. 会构造一个新对象,表示构造这个对象时的日期
    1. LocalDate.of(1999,2,20);
    2. 提供年、月和日来构造对应一个特定日期的对象
    1. LocalDate newYearEve=LocalDate.of(1999,12,31);
    2. int year=newYearEve.getYear(); //1999
    3. int month=newYearEve.getMonthValue();//12
    4. int day=newYearEve.getDayOfMonth();//31
  • plusDays方法会得到一个新的LocalDate,如果把应用这个方法的对象称为当前对象,这个新日期对象则是距当前对象指定天数的一个新日期。
    1. LocalDate aThousandDaysLater=newYearEve.plusDays(1000);
    2. year=aThousandDaysLater.getYear();//2002
    3. month=aThousandDaysLater.getMonthValue();//09
    4. day=aThousandDaysLater.getDayOfMonth();//26
  1. - plusDay方法会生成一个新的LocalDate对象,然后把这个对象赋给aThousandDaysLater变量。原来的对象不做任何改动。
  • demo:输出打印当月月份的日历 ```java import org.junit.Test;

import java.time.DayOfWeek; import java.time.LocalDate;

public class CalendarTest { public static void main(String[] args) { //LocalDate localDate = LocalDate.of(1000,2,3); LocalDate date = LocalDate.now(); int month = date.getMonthValue(); //得到月份 int today = date.getDayOfMonth();//得到日份

  1. date=date.minusDays(today-1);//得到当月月份的第
  2. // 一天,LocalDate.minusDays(int n):生成当前日期之后或之前n天的日期
  3. DayOfWeek weekDay=date.getDayOfWeek();//得到当前日期是星期几
  4. int value=weekDay.getValue();//得到星期代表的数字,星期一=1
  5. System.out.println("Mon Tue Wed Thu Fri Sat Sun");
  6. for (int i = 1; i < value; i++) {
  7. System.out.println(" ");
  8. }
  9. while (date.getMonthValue()==month){
  10. System.out.printf("%3d",date.getDayOfMonth());
  11. if (date.getDayOfMonth()==today)
  12. System.out.printf("*");
  13. else System.out.printf(" ");
  14. date=date.plusDays(1);
  15. if (date.getDayOfWeek().getValue()==1)
  16. System.out.println();
  17. }
  18. if (date.getDayOfWeek().getValue()!=1)
  19. System.out.println();
  20. }

}

  1. <a name="5ae83688"></a>
  2. ## 用户自定义类
  3. 在一个源文件中,只能有一个公共类,但可以有任意数目的非公共类。
  4. 关键字public意味着任何类的任何方法都可以调用这些方法。
  5. -
  6. 隐式参数和显示参数
  7. -
  8. 隐式参数:出现在方法名前的该类型的对象。在每一个方法中,关键字this指示隐式参数。例如
  9. ```java
  10. //有Employee类型的对象
  11. public void raiseSalary(double byPercent){
  12. double raise = this.salary*byPercent/100;
  13. this.salary+=raise;
  14. }//this指示的是Employee类型的对象
  1. - 这样做可以将实例字段与局部变量明显地区分开来。
  • 显示参数

    • 位于方法名后面括号中的数值。
      • 方法可以调用这个方法的对象的私有数据,一个方法可以访问所属类的所有对象的私有数据。

静态字段与静态方法

静态字段

  • 每个人类只有一个静态字段。
  • 类的所有实例共享一个静态字段。
  • 静态字段属于类,不属于任何单个对象。

静态常量