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、优先使用不可变的类

posted @ 2022-08-24 17:23  小草今天又在摸鱼吗  阅读(13)  评论(0编辑  收藏  举报