java 对象和类(一)
对象与对象变量
要想使用对象,就必须首先构造对象,并指定其初始状态,然后对对象应用方法。
Java语言中使用构造器构造新实例。例如Java中有Date类,其对象描述一个时间点。构造器的名字应该与类名相同,因此Date类的构造器名为Date。构造一个Date对象,需在构造器前面加上new操作符。
//这个表达式构造了一个新对象,这个对象被初始化为当前的日期和时间。
new Date()
//将toString方法应用于新构造的Date对象上
String s = new Date().toString();
上面的例子中,构造的对象仅适用了一次。如果想多次使用,可以将对象存放在一个变量中:
//将对象存放到一个变量中
Date birthday = new Date();
//定义一个对象变量
Date deadline;
一定要认识到,变量定义了一个对象变量deadline可以引用Date类型的对象,但是不能将任何Date方法应用于这个变量上。
Date deadline;
//会编译错误
s = deadline.toString();
可以用变量引用一个已存在的对象
//方法一
deadline = new Date();
//方法二
deadline = birthday;
注意: 一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。
在java中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用。new操作符的返回值也是一个引用。
//正确
deadline = null;
if(deadline != null)
System.out.println(deadline);
//错误
birthday = null;
String s = birthday.toString();
因为局部变量不会自动地初始化为null,而必须通过调用new或将它们设置为null进行初始化。
LocalDate类
Java类库中分别有这样2个类:一个是用来表示时间点的Date类,另外一个是日历表示法的LocalDate类。
不要使用构造器来构造LocalDate类,应当使用静态工厂方法代表调用了构造器。
LocalDate.now()
也可以提供年、月、日来构造一个特定日期的对象:
LocalDate.of(2001,1,13)
通常都会将构造的对象保存在一个对象变量中:
LocalDate newYearsEve = LocalDate.of(2001,1,13);
LocalDate aThousandDaysLater = newYearsEve.plusDays(1000);
int year = aThousandDaysLater.getYear();
int month = aThousandDaysLater.getMonthValue();
int day = aThousandDaysLater.getDayOfMonth();
System.out.print(year+"-"+month+"-"+day);
更改器方法与访问器方法
如果想要打印本月的日历,并标注今天是哪天,比如说下面这样:
星期一 星期二 星期三 星期四 星期五 星期六 星期天
1 2
3 4* 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
import java.time.*;
/**
* @author duke_coding@163.com
* @date 2018/9/4 19:40
*/
public class CalendarTest {
public static void main(String[] args)
{
LocalDate date = LocalDate.now();
int month = date.getMonthValue();
int today = date.getDayOfMonth();
//设置date为这个月的第一天,并得到这一天为星期几
date = date.minusDays(today-1);
DayOfWeek weekday = date.getDayOfWeek();
int value =weekday.getValue();
System.out.println("星期一 星期二 星期三 星期四 星期五 星期六 星期天");
for (int i=1; i< value; i++)
System.out.print(" ");
while (date.getMonthValue() == month)
{
System.out.printf("%3d",date.getDayOfMonth());
if (date.getDayOfMonth() == today)
System.out.print("* ");
else
System.out.print(" ");
date = date.plusDays(1);
if (date.getDayOfWeek().getValue() == 1) System.out.println();
}
if (date.getDayOfWeek().getValue() != 1) System.out.println();
}
}
java.time.LocalDate中一些方法的展示:
static LocalTime now()
/** 构造一个表示当前日期的对象 **/
static LocalTime of(int year, int month, int day)
/** 构造一个表示给定日期的对象 **/
int getYear()
int getMonthValue()
int getDayOfMonth()
/** 得到当前日期的年、月和日**/
DayOfWeek getDayOfWeek
/** 得到当前日期是星期几,作为DayOfWeek类的一个实例返回。调用getValue来得到1~7之间的一个数,表示这是星期几,1表示星期一,7表示星期日 **/
LocalDate plusDays(int n)
LocalDate minusDays(int n)
/** 生成当前日期之后或之前n天的日期 **/
用户自定义类
最简单的类定义形式为:
class ClassName
{
field1
field2
......
constructor1
constructor2
......
method1
method2
......
}
写一个自定义类的例子:
import java.time.*;
/**
* @author duke_coding@163.com
* @date 2018/9/4 14:53
*/
public class EmployeeTest {
public static void main(String[] args)
{
Employee[] staff = new Employee[3];
staff[0] = new Employee("刘甲",75000,1991,1,1);
staff[1] = new Employee("刘乙",50000,1991,2,2);
staff[2] = new Employee("刘丙",30000,1991,3,3);
for (Employee e : staff)
e.raiseSalary(5);
for (Employee e : staff)
System.out.println("name="+e.getName()+",salary="+e.getSalary()
+",hireDay="+e.getHireDay());
}
}
class Employee
{
private String name;
private double salary;
private LocalDate hireDay;
public Employee(String n, double s, int year, int month, int day)
{
name = n;
salary = s;
hireDay = LocalDate.of(year,month,day);
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public LocalDate getHireDay()
{
return hireDay;
}
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
}
}