JAVA核心卷1-4对象与类
作者:互联网
JAVA核心卷1-4对象与类
对象三个主要特性:行为、状态、标识
behavior:可以施加什么操作或方法
state:施加方法时,对象如何响应
identity:如何辨别具有相同行为和不同状态的不同对象
对象状态的改变必须通过调用方法实现,否则破坏封装性
类之间的关系”依赖(use-a)、聚合(has-a)、继承(is-a)
如果一个类的方法使用或操纵另一个类的对象,那么就是这个类依赖另一个类
类之间的依赖需要尽量减少
表达类关系的UML符号P94
java中 任何对象变量的值都是对存储在另外一个地方的一个对象的引用。
new操作符的返回值就是一个引用。
Date deadline = new Date();
//显式地将对象变量设为null,表明这个对象变量目前没有引用任何对象
//但不能把方法应用在值为null的对象上
所有java对象都是堆存储
java中通过clone获得对象的完整拷贝
更改器方法与访问器方法
LocalDate aThousandDaysLater = newYearsEve.plusDays(1000);
//调用后newYearEve不会有变化,plusDays方法生成一个新的LocalDate对象,然后将新对象赋给aThousandDaysLater,plusDays方法没有更改调用这个方法的对象
更改器方法就是调用这个方法的对象会改变状态
import java.time.LocalDate;
static LocalTime now()//构造一个表示当前日期的对象
static LocalTime of(int year,int month,int day)//构造一个表示给定日期的对象
int getYear()
int getMonthValue()
int getDayOfMonth()
DayOfWeek getDayOfWeek
LocalDate plusDays(int n)
LocalDate minusDays(int n) 生成当前日期之后或者之前的n天
程序清单4-2
实现Emloyee类对象,包含姓名、薪资、入职日期(LocalDate类型)
实现初始化方法、get方法、根据百分比提高薪资方法
实现EmployeeTest类,创建三个雇员对象,每个对象提高百分之5的薪资,并输出他们的个人信息
package day0819;
import java.time.LocalDate;
public class Empolyee {
private String name;
private double salary;
private LocalDate hireDay;
public Empolyee(String n,double s,int y,int m,int d){
name = n;
salary = s;
hireDay = LocalDate.of(y,m,d);
}
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;
}
}
/*
getHireDay方法是访问器方法 但是返回引用可变对象,这个违反设计原则
*/
/*
return (Date)hireDay.clone();//ok
*/
package day0819;
import day0819.Empolyee;
public class EmployeeTest {
public static void main(String[] args) {
Empolyee[] staff = new Empolyee[3];
staff[0] = new Empolyee("Carl",75000,2000,9,9);
staff[1] = new Empolyee("Harry",30000,1999,1,1);
staff[2] = new Empolyee("Tony",41000,1853,7,6);
for(Empolyee sta : staff)
{
sta.raiseSalary(5);
}
for (Empolyee e : staff){
System.out.println("name=" +e.getName()+",salary=" + e.getSalary()+",hireDay=" +e.getHireDay());
}
}
}
构造器伴随着new操作符的执行被调用
构造器与类同名
每个类可以有多个构造器,构造器可以有多个参数
构造器没有返回值
不要在构造器中定义与实例域重名的局部变量
final修饰符大多应用于基本类型域或不可变域,对于可变的类,final修饰后表示存储在该变量中的对象引用不会再指示其他对象,不过这个对象可以更改
静态域属于类 每个类中只有一个这样的域
(?)实现能改变对象参数状态的方法:使方法得到对象引用的拷贝,此时对象引用及其他的拷贝同时引用同一个对象
系统默认的无参构造器:实例域中的数值型数据为0,布尔型数据为false,所有对象变量设置为null
public ClassName{}
构造器参数名
//在参数前加a
public Employee(String aName,double aSalary){
name = aName;
salary = aSalary;
}
//或者一样的参数名 然后用this指类中实例域的变量
public Employee(String name,double salary){
this.name = name;
this.salary = salary;
}
调用另一个构造器
public Employee(double s){
this("Employee #" + nextId,s);
//this(...)直接调用Employee类中另一个构造器Employee(String,int)
nextId++;
}
class Employee()
private static int nextId;
//static initialization block
static{
//random
Random generator = new Random();
nextId = generator.nextInt(10000);
}
//objec initialization block
//不常用
{
id = nextId;
nextId++;
}
}
类设计技巧
1、保证数据私有
2、对数据初始化
3、不要在类中使用过多的基本类型
4、不是所有的域都需要独立的域访问器和域更改器
5、将职责过多的类进行分解
6、类名和方法名要能够体现它们的职责
7、优先使用不可变的类
标签:salary,JAVA,对象,核心,Empolyee,int,LocalDate,public 来源: https://www.cnblogs.com/h404nofound/p/16620934.html