【Java核心技术卷一】对象与类:使用预定义类与用户自定义类

一、预定义类

1、对象与对象变量

使用对象两个步骤:首先构造对象,指定初始状态;然后对对象应用方法。

  • 使用构造器构造新实例。构造器是一种特殊方法,用来构造并初始化对象。
  • 构造器的名字应该与类名相同。以Data类为例,构造Data对象,new Data(),构造了一个新对象,并被初始化为当前的日期和时间。也可以将该对象应用toString()方法,返回字符串:String s = new Data().toString();
  • 如果对象需要多次使用,就需要将对象放在一个变量中:Date birthday = new Date();
  • 对象与对象变量的区别:Data deadline;中deadlin仅仅是一个对象变量,可以引用Data类型的对象,但是没有初始化时只能是一个对象变量,不能应用toString()方法,否则产生编译错误。
  • 在 Java 中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用。new 操作符的返回值也是一个引用。Date deadline = new Date();,new Data()构造了一个 Date 类型的对象, 并且它的值是对新创建对象的引用。这个引用存储在变量 deadline 中。

2、LocalData类

以标准 Java 类库分别包含了两个类:一个是用来表示时间点的 Date 类;另一个是用来表示大家熟悉的日历表示法的 LocalDate 类。

  • 构造对象:Local Date.now()表示构造这个对象时的日期,LocalDate.of(1999, 12, 31)构造特定日期的对象。
  • 构造对象并保存在对象变量中:LocalDate newYearsEve = Local Date.of(1999, 12, 31);,然后可以应用其他方法:getYear、 getMonthValue 和 getDayOfMonth

3、更改器方法与访问器方法

LocalDate aThousandDaysLater = newYearsEve.plusDays(1000);
plusDays 方法会生成一个新的 LocalDate 对象,然后把这个新对象赋给aThousandDaysLater变量。原来的对象不做任何改动。

CregorianCalendar someDay = new CregorianCalendar(1999, 11, 31);
// Odd feature of that cl ass: month numbers go from 0 to 11
someDay.add(Calendar.DAY_0F_M0NTH, 1000);
  • 更改器方法 ( mutator method ):调用CregorianCalendar.add()方法后,someDay 对象的状态会改变
  • 访问器方法(accessor method):只访问对象而不修改对象

LocalTime.now():构造一个表示当前日期的对象
LocalTime.of(int year, int month, int day):构造一个表示给定日期的对象
getYear( )/getMonthValue( )/getDayOfMonth( ):得到当前日期的年、月、日

二、用户自定义类

设计复杂应用程序的各种主力类,通常这些类是没有main方法,却又自己的实例域和实例方法。

1、Employee类

最简单的类定义形式为:

class ClassName
{
	field~1~
	field~2~
	……
	constructor~1~
	constructor~2~
	……
	method~1~
	method~2~
	……
}

例如:

1 class Employee
2 {
3  	// instance fields
4	private String name ;
5	private double salary;
6	private LocalDate hireDay; 
7	// constructor
8	public Employee(String n , double s, int year, int month , int day) {
9		name = n;
10		salary = s;
11		hireDay = LocalDate.of(year, month, day); 
12	}
13	// a method
14	public String getName(){
15		return name;
16	}
17	public double getSalary()
18	{
19		return salary;
20	}
21	public LocalDate getHireDay()
22	{
23		return hireDay;
24	}
25	public void raiseSalary(double byPercent)
26	{
27		double raise = salary * byPercent / 100;
28		salary += raise;
29	}
30}
  • 在一个源文件中, 只能有一个公有类,但可以有任意数目的非公有类。

2、多个源文件的使用

可以将每一个类存在一个单独的源文件中,也可以将其放入同一个源文件中,后者必须保证一个源文件中只有一个共有类。如果采用前者,则有两种编译程序的方法:
1、使用通配符调用Java编译器:javac Employee*.java
2、直接键入命令:javac EmployeeTest.java,原因在于当 Java 编译器发现 EmployeeTestjava 使用丫 Employee 类时会查找名为 Employee.class 的文件。如果没有找到这个文件, 就会自动地搜索 Employeejava, 然后,对它进行编译。

3、剖析Employee类

  • 类的方法都是public,意味着任何类的任何方法都可以调用这些方法
  • 实例域用来存放将要操作的数据,关键字确保只有Employee类自身可以访问这些实例域
  • 构造器:与类同名,在构造Employee类的对象时,构造器会运行,以便将实例域初始化为所希望的状态。构造器与其他方法不同的是,总是伴随着new操作符的
    执行被调用
    •构造器与类同名
    •每个类可以有一个以上的构造器
    •构造器可以有 0 个、1 个或多个参数
    •构造器没有返回值
    •构造器总是伴随着 new 操作一起调用(所有的java对象都是在堆中构造的)

注意:不要在构造器中定义域实例域重名的局部变量,实例域的局部变量只能在构造器内部访问。

  • 方法用于操作对象以及存取它们的实例域。
  • 隐式参数与显示参数:27行中第一个参数salary为隐式参数,是出现在方法名前的Employee类对象;27行第二个参数byPercent为显示参数,位于方法名后面后好中的数值。在方法中,关键字this表示隐式参数,27行可以换成double raise = this.salary * byPercent / 100;
  • 需要获得或设置实例域的值,应该提供下面三项内容:一个私有的数据域、一个共有的域访问器方法、一个公有的域更改器方法
  • 一个方法可以访问所属类的所有对象的私有数据
class Employee
{
	……
	public boolean equals(Employee other) {
		return name.equals(other.name); 
	}
}

调用方式:if(harry.equals(boss))……,该方法访问harry私有域,还能访问boss的私有域,原因在于boss是Employee对象,而Employee类的方法可以访问Employee类的任何一个对象的私有域。、

  • 私有方法private,不能被外部的其他类操作调用给,可以将其删去
  • final实例域,在构建对象时必须初始化这样的域,即必须确保在每一个构造器执行之后,这个域的值被设置,并且在后面的操作中,不能再对它进行修改。比如private final String name;不需要setName方法。final 修饰符大都应用于基本 (primitive ) 类型域,或不可变(immutable) 类的域(如果类中的每个方法都不会改变其对象, 这种类就是不可变的类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值