学习内容:
1.面向对象程序设计
2.如何创建标准Java类库中的类对象
3.如何编写自己的类
4.1 面向对象程序设计概述
1.面向对象程序设计(简称OOP)是当今主流的程序设计泛型。
2.面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。
- 类
1.类是构造对象的模板或蓝图。由类构造对象的过程称为创建类的实例。
2.封装(数据隐藏)从形式上看,封装不过是将数据和行为组合在一个包中,并对对象的使用隐藏了数据的实现方法。
3.对象中的数据称为实例域,操纵数据的过程称为方法。
可以通过拓展一个类来建立另一个新的类。即为继承。
-
对象
1.对象的三个特性:
对象的行为——对象的行为是用可调用的方法定义的。
对象的状态——每个对象都保存着描述当前特征的信息。
对象标识——辨别具有相同行为和状态的不同对象。 -
识别类
-
类之间的关系
依赖、聚合、继承。
4.2 使用预定义类
- 对象与对象变量
1.想要适用对象,就必须首先构造对象,并指定其初始状态,然后,对对象应用方法。
2.构造器的名字应该与类名相同。
例如:
new Date();
System.out.println(new Date());
String s = new Date().toString();
Date birthday = new Date();
3.一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。
- Java类库中的LocalDate类
1.标准的Java类库包含两个类:一个是用来表示时间点的Date类,以及用来表示日历的LocalDate类。
例如:
LocalDate.now();//静态方法
LocalDate.of(1999, 12, 31);
- 更改器方法与访问器方法
LocalDate aThousandDaysLater = newYearsEve.plusDays(1000);
//plusDays方法会生成一个新的LocalDate对象,然后把这个新对象赋给aThousandDaysLate变量。原来的对象不做任何改动。
1.另一个处理日历的GregorianCalendar类是一个更改器方法。
相反,之访问对象而不修改对象的方法称为访问器方法。
例如:
LocalDate.getYear 和 GregorianCalendar.get
java.time.LocalDate 8
• static Local Time now( )
构造一个表示当前日期的对象。
• static LocalTime of(int year, int month , int day )
构造一个表示给定日期的对象。
• int getYear( )
• int getMonthValue( )
• int getDayOfMonth( )
得到当前日期的年、 月和曰。
• DayOfWeek getDayOfWeek
得到当前日期是星期几, 作为 DayOfWeek 类的一个实例返回。 调用 getValue 来得到1~ 7 之间的一个数, 表示这是星期几, 1 表示星期一, 7 表示星期日。
• Local Date piusDays(int n )
• Local Date minusDays(int n)
生成当前日期之后或之前 n 天的日期。
4.3 用户自定义类
- Employee类
1.在Java中,最简单的类定义形式为:
class ClassName
{
field1
field2
...
constructor1
constructor2
...
method1
method2
...
}
例如:
class Employee
{
// instance fields
private String name ;
private double salary;
private Local Date hireDay;
// constructor
public Employee(String n , double s, int year, int month , int day)
{
name = n;
salary = s;
hireDay = Local Date.of(year, month, day);
}
// a method
public String getNameO
{
return name;
}
// more method
...
}
创建三个雇员对象:
Employee[] staff = new Employee[3];
staff[0] = new Employee("Carl Cracker", . . .);
staff[1] = new Employee("Harry Hacker", . . .);
staff[2] = new Employee("Tony Tester", . . .);
- 多个源文件的使用
- 剖析Emloyee类
1.通过查看源代码会发现,这个类包含一个构造器和四个方法:
public Employee(String n , double s, int year, int month , int day)
public String getName()
public double getSalary()
public Local Date getHi reDay()
public void raiseSal ary(double byPercent)
2.这个类的所有方法都是public修饰。其意味着任何类的任何方法都可以调用这些方法。
在此类中的三个实例:
private String name;
private double salary;
private LocalDate hireDay;
3.关键词private确保只有Employee类自身的方法能够访问这些实例域,而其他类的方法不能读写这些域。
从构造器开始
先看下面的Employee类的构造器:
public Employee(String n, double s, int year, int month, int day)//构造器与类同名
{
name = n;
salary = s;
LocalDate hireDay = Local Date.of(year, month, day);
}
创建实例:
new Eraployee("James Bond", 100000, 1950, 1, 1)
将会把实例域设置为:
name = "James Bond";
salary = 100000;
hireDay = LocalDate.of(1950, 1, 1); // January 1, 1950
- 隐式参数与显式参数
1.方法用于操作对象以及存取他们的实例域。
例如:
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
}
将调用这个方法的对象的salary实例域设置为新值。
number007.raiseSalary(5);
2.raiseSalary方法有两个参数。第一个参数称为隐式参数,是出现在方法名前的Employee类对象(salary)。
3.第二个参数位于方法名后面括号中的数值,这是显式参数(byPercent)。
- 封装的优点
public double getSalaryO
{
return salary;
}
public LocalDate getHireDay()
{
return hireDay;
}
以上都是典型的访问器方法。
1.新旧数据表示之间的转换
2.更改器方法可以执行错误检查,然而直接对域进行赋值将不会进行这些处理。
- 基于类的访问权限
- 私有方法
1.在实现一个类时,由于公有数据十分危险,所以应该将所有的数据域都设置为私有的。(private)
- final实例域
例如:
class Employee
{
private final String name;
...
}
1.final修饰符大都应用于基本类型域、或不可变类的域。
4.4 静态域域静态方法
- 静态域
1.如果将域定义为static,每个类中只有一个这样的域。
例如:
class Employee
{
private static int nextld = 1;//即使没有一个雇员对象,静态域nextId也存在。并且创建的每个对象共享。
private int id;
...
}
- 静态常量
例如:在Math类中定义了一个静态常量:
public class Hath
{
...
public static final double PI = 3.14159265358979323846;
...
}
1.在程序中,可以采用Math.PI的形式获得这个常量。
2.如果关键词static被省略,PI就变成了Math类的一个实例域。需要通过Math类的对象访问PI,并且每一个Math对象都有它自己的一份PI拷贝。
- 静态方法
1.静态方法是一种不能向对象实施操作的方法。
例如:Math类的pow方法就是静态方法。
Math.pow(x, a)
2.Employee类的静态方法不能访问Id实例域,因为i它不能操作对象。但静态方法可以访问自身类中的静态域。
例如:
public static int getNextld()
{
return nextld; // returns static field
}
可以通类名调用这个方法:
int n = Employee.getNextld();
使用静态方法的情况:
1.一个方法不需要访问对象状态,其所需的参数都是通过显式参数提供。
2.一个方法只需要访问类的静态域。
- 工厂方法
1.使用静态工厂方法来构建对象。
例如:
NumberFormat currencyFormatter = NumberFormat.getCurrencylnstance();
NumberFormat percentFormatter = NumberFormat.getPercentlnstance();
double x = 0.1;
System.out.println(currencyFormatter.format(x))//prints $O.10
System.out.println(percentFomatter.format(x);//prints 10%
- main方法
1.main方法也是一个静态方法。main方法不对任何对象进行操作。
2.事实上,在启动程序时还没有任何一个对象。静态的main方法将执行并创建程序所需的对象。
4.5 方法参数
值传递机制