对象与类
面向对象程序概述
类
类是构造对象的模板或蓝图。由类构造对象的过程称为创建类的实例。
封装:将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式。对象中的数据称为实例字段,操作数据的过程称为方法。作为一个类的实例,特定对象都有一组特定的实例字段值。这些值的集合就是这个对象的当前状态。
继承:扩展一个类来建立另外一个类的过程。在扩展一个已有类时,这个扩展后的新类具有被扩展的类的全部属性和方法。
每个对象都有一个唯一的标识。
类之间的关系
- 依赖:一个类的方法使用或者操纵另一个类的对象。
- 聚合:一个类的对象包含着另一个类的一些对象。
- 继承:一个类扩展了另一个类。
使用预定义类
对象与对象变量
要想使用对象,首先必须构造对象,并指定其初始状态。然后对对象应用方法。
构造器是一种特殊的方法,用来构造并初始化对象。
构造器的名字应该与类名相同。例如:Date类的构造器名为Date。要想构造一个Date对象,需要再构造器前面加上new操作符,例如:
new Date()
可以将对象传递给一个方法,例如:
System.out.println(new Date());
如果构造的对象需要多次使用,需要将对象存放在一个变量中,例如:
Date birthday=new Date();
注意:对象变量并没有实际包含一个对象,它只是引用一个对象。在Java中,任何对象变量的值都是对存储在另外一个地方的某个对象的引用。new操作符的返回值也是一个引用。
public void test3(){
Date birthday = new Date();
birthday=null;
if (birthday==null)
System.out.println(birthday);
}
对象变量设置为null值代表这个对象变量目前没有引用任何对象。
所有Java对象都存储在堆中。当一个对象包含另一个对象变量时,它只是包含着另一个堆对象的指针。
Java类库中的LocalDate类
类库设计者将保存时间与给时间点命名分开。
Date类:用来表示时间点。
LocalDate类:用大家熟悉的日历表示法表示日期。
不要使用构造器来构造LocalDate类的对象。实际上,应当使用静态工厂方法,它会代表你调用构造器。
LocalDate.now();
会构造一个新对象,表示构造这个对象时的日期
LocalDate.of(1999,2,20);
提供年、月和日来构造对应一个特定日期的对象
LocalDate newYearEve=LocalDate.of(1999,12,31);
int year=newYearEve.getYear(); //1999
int month=newYearEve.getMonthValue();//12
int day=newYearEve.getDayOfMonth();//31
- plusDays方法会得到一个新的LocalDate,如果把应用这个方法的对象称为当前对象,这个新日期对象则是距当前对象指定天数的一个新日期。
LocalDate aThousandDaysLater=newYearEve.plusDays(1000);
year=aThousandDaysLater.getYear();//2002
month=aThousandDaysLater.getMonthValue();//09
day=aThousandDaysLater.getDayOfMonth();//26
- 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();//得到日份
date=date.minusDays(today-1);//得到当月月份的第
// 一天,LocalDate.minusDays(int n):生成当前日期之后或之前n天的日期
DayOfWeek weekDay=date.getDayOfWeek();//得到当前日期是星期几
int value=weekDay.getValue();//得到星期代表的数字,星期一=1
System.out.println("Mon Tue Wed Thu Fri Sat Sun");
for (int i = 1; i < value; i++) {
System.out.println(" ");
}
while (date.getMonthValue()==month){
System.out.printf("%3d",date.getDayOfMonth());
if (date.getDayOfMonth()==today)
System.out.printf("*");
else System.out.printf(" ");
date=date.plusDays(1);
if (date.getDayOfWeek().getValue()==1)
System.out.println();
}
if (date.getDayOfWeek().getValue()!=1)
System.out.println();
}
}
<a name="5ae83688"></a>
## 用户自定义类
在一个源文件中,只能有一个公共类,但可以有任意数目的非公共类。
关键字public意味着任何类的任何方法都可以调用这些方法。
-
隐式参数和显示参数
-
隐式参数:出现在方法名前的该类型的对象。在每一个方法中,关键字this指示隐式参数。例如
```java
//有Employee类型的对象
public void raiseSalary(double byPercent){
double raise = this.salary*byPercent/100;
this.salary+=raise;
}//this指示的是Employee类型的对象
- 这样做可以将实例字段与局部变量明显地区分开来。
显示参数
- 位于方法名后面括号中的数值。
- 方法可以调用这个方法的对象的私有数据,一个方法可以访问所属类的所有对象的私有数据。
- 位于方法名后面括号中的数值。
静态字段与静态方法
静态字段
- 每个人类只有一个静态字段。
- 类的所有实例共享一个静态字段。
- 静态字段属于类,不属于任何单个对象。